keepalived+mysql雙主高可用配置

來源:互聯網
上載者:User

標籤:

具體架構圖如下

兩個節點一主一從(從庫上面也可以再掛一個從庫),或者是雙主,再利用keepalived在出現容災時進行高可用切換。

 

Keepalived原理說明:

     其實這個原理可以很簡單的用一個故事說明。

     以前有一個幫派,像其他所有的幫派一樣,有老大。這個老大活的也很憋屈,不僅自己做所有的活,還要隔一段時間就要告訴所有小弟我是老大,你們老實點。所有的小弟也是很乖的,只要老大不死,他們肯定不會搶奪老大的地位,但是一旦他們都收不到老大的通訊的話,他們就確信老大死了,他們就開始搶奪老大的地位了。不過他們搶奪老大的地位也是有規則的,他們都發出通告,等級高的人才可以變成老大。又肩負起所有的任務,並且定時通告下面小弟,我是老大,都給我老實點。這個老大也是當得累啊,但是大家還是很喜歡當老大啊。

    這裡有一篇講解很詳細的文檔,地址為http://blog.chinaunix.net/uid-27003384-id-3870083.html。

具體實現:

這裡mysql的複製不再做闡述(主要是做雙主),主要進行keepalived配置的講解。

我的環境是:

           Centos6.7

           Mysql5.6.27

安裝keepalived

     yum –y install keepalived。

配置keepalived

     Keepalived的設定檔是預設在/etc/keepalived/目錄下

設定檔詳情如下

Keepalived簡單配置說明(很簡單的配置)

vrrp_script vs_mysql_82 {

    script "/etc/keepalived/checkMySQL.py -h 192.168.11.82 -P 3306"  --檢測是否需要切換的指令碼

    interval  30 檢測時間,30s

}

vrrp_instance VI_82 {

state BACKUP  狀態(主要使用master,backup 兩種)

    nopreempt  表示master死了以後活過來了,不會主動搶佔當前master地位的

    interface eth0

    virtual_router_id 82 組名

    priority 100 等級

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

       vs_mysql_82

    }

    virtual_ipaddress {

        192.168.11.100

    } 虛擬ip的設定

checkMySQL.py指令碼解析

#!/usr/bin/python#coding: utf-8#import sysimport osimport getoptimport MySQLdbimport loggingdbhost=‘localhost‘   #主機地址dbport=3306          #連接埠號碼dbuser=‘monitor‘     #帳號dbpassword=‘m0n1tor‘ #密碼def checkMySQL():    global dbhost    global dbport    global dbuser    global dbpassword    shortargs=‘h:P:‘    opts, args=getopt.getopt(sys.argv[1:],shortargs)    for opt, value in opts:        if opt==‘-h‘:            dbhost=value        elif opt==‘-P‘:            dbport=value    #print "host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword)    db = instanceMySQL(dbhost, dbport, dbuser, dbpassword)    st = db.ishaveMySQL()#主要調用這個函數    return stclass instanceMySQL:    conn = None    def __init__(self, host=None,port=None, user=None, passwd=None):        self.dbhost= host        self.dbport = int(port)        self.dbuser = user        self.dbpassword = passwd    def ishaveMySQL(self):        cmd="ps -ef | egrep -i \"mysqld\" | grep %s | egrep -iv \"mysqld_safe\" | grep -v grep | wc -l" % self.dbport #查看mysql進程是不是活著,這裡需要注意的是,如果你用mysqld啟動的資料庫,需要對上面的命令進行修改。把egrep -iv \"mysqld_safe\"這個去掉
mysqldNum = os.popen(cmd).read() cmd ="netstat -tunlp | grep \":%s\" | wc -l" % self.dbport #檢查mysql連接埠號碼是不是正常接收 mysqlPortNum= os.popen(cmd).read() #print mysqldNum, mysqlPortNum if ( int(mysqldNum) <= 0): print "error" return 1 if ( int(mysqldNum) > 0 and mysqlPortNum <= 0): return 1 return 0if __name__== "__main__": st=checkMySQL() sys.exit(st)

 

需要注意的問題:

      總結起來需要注意三個方面:

      1:複寫延遲

         對於延遲的問題的話,可以從兩個方面進行最佳化:

         1:硬體方面

            兩台主機配置應該相差不大,一方面防止切換過來直接把一個乾死,另一方面可以減少延遲。

         2:軟體方面

            可以直接使用半同步(效能上會有很大損失)或者是直接上5.7(5.7有多線程複製),還有使用mariadb分支,該分支有一個多線程複製的特性。比5.6的官方mysql好很多,mysql5.6官方多線程複製是schema層級的。

      2:單邊寫在切換的時候需要注意的問題

         需要注意的問題

         1:防止腦裂(什麼是腦裂?)

             兩個節點都設定成keepalived設定檔都配置成backup狀態,配置nopreempt。

           2:再延遲的情況下切換的話,可能會產生查不到資訊或者是寫重複的情況(比如自增長id可能會產生重複。可以通過設定auto_increment_incrementauto_increment_offset來防止

      3:keepalived探測的準則確定

         最簡單的規則就是探測資料庫執行個體是不是存在,用ps,還有資料庫連接埠通不通。

         需要在具體業務環境下進行適當的添加。還需要添加延遲的探測,在進行決定是不是直接切換,或者是另作處理。

keepalived+mysql雙主高可用配置

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.