MySQL 高可用 keepalived+mysql 雙主

       mysql高可用keepalived+mysql雙主

MySQL的高可用方案一般有如下幾種:

keepalived+雙主,MHAPXCMMMHeartbeat+DRBD等,比較常用的是keepalived+雙主,MHAPXC

主要介紹了利用 keepalived 實現 MySQL 數據庫的高可用

Keepalived+mysql雙主來實現MySQL-HA,我們必須保證兩臺MySQL數據庫的數據完全一樣,基本思路是兩臺MySQL互爲主從關係,通過Keepalived配置虛擬IP,實現當其中的一臺MySQL數據庫宕機後,應用能夠自動切換到另外一臺MySQL數據庫,保證系統的高可用

 

生產環境中一臺mysql主機存在單點故障,所以我們要確保mysql的高可用性兩臺MySQL服務器如果其中有一臺MySQL服務器掛掉後,另外一臺能立馬接替其進行工作。

 

拓撲環境

OScentos7-2

Mysql版本:mysql 5.7.13

Keepalived: keepalived-1.2.20

Mysql-vip:192.168.0.200

Mysql-master1:192.168.182.132等於後面的192.168.0.100

Mysql-master2:192.168.182.134等於後面的192.168.0.160

一、 配置兩臺mysql主主同步

wKioL1lV74PAaFUPAAF7PIlzjUY202.png

該過程的第一部分就是master記錄二進制日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務寫入二進制日誌。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slavemasterbinary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程I/O線程在master上打開一個普通的連接,然後開始binlog dump processBinlog dump processmaster的二進制日誌中讀取事件,如果已經同步了master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
SQL slave threadSQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。

主主同步就是兩臺機器互爲主的關係,在任何一臺機器上寫入都會同步

mysql主機開啓了防火牆,需要關閉防火牆或創建規則。

1、修改MySQL配置文件

兩臺MySQL均要開啓binlog日誌功能,開啓方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項,兩臺MySQLserver-ID不能一樣,默認情況下兩臺MySQLserverID都是1,需將其中一臺修改爲2即可。

# vim /etc/my.cnf

server_id=1

log-bin=mysql-bin

binlog_format=mixed

relay-log=relay-bin

relay-log-index=slave-relay-bin.index

auto_increment-increment=2

auto_increment-offset=1

重啓mysqld服務

# systemctl restart mysqld

 

master2中有關複製的配置如下:

server_id = 2

binlog_format=mixed

log-bin=mysql-bin

relay-log=relay-bin

relay-log-index=slave-relay-bin.index

auto-increment-increment=2

auto-increment-offset=2

重啓mysqld服務

# systemctl restart mysqld

 

注意:master1master2只有server-id不同和 auto-increment-offset不同。

mysql中有自增長字段,在做數據庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offsetauto_increment_increment

auto-increment-increment表示自增長字段每次遞增的量,其默認值是1。它的值應設爲整個結構中服務器的總數,本案例用到兩臺服務器,所以值設爲2

auto-increment-offset是用來設定數據庫中自動增長的起點(即初始值),因爲這兩能服務器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避免兩臺服務器數據同步時出現主鍵衝突,

注:可以在my.cnf文件中添加“binlog_do_db=數據庫名”配置項(可以添加多個)來指定要同步的數據庫

2、將master1設爲master2的主服務器

master1主機上創建授權賬戶,允許在master2(192.168.1182.134)主機上連接,並查看master1的當前binlog狀態信息

wKioL1lV74Og2vO7AABuRPCLxe8448.png 

 master2上將master1設爲自已的主服務器並開啓slave功能。

wKiom1lV74Swa00HAAAxjAOyenQ966.png 

 設置防火牆策略

# systemctl stop firewalld.service

查看從的狀態,mysql>show slave status\G;以下兩個值必須爲yes,代表從服務器能正常連接主服務器(重啓mysqld服務)

wKioL1lV74SwCXJYAACuc0uxnGY807.png 

 3、將master2設爲master1的主服務器

master2主機上創建授權賬戶,允許在master1(192.168.1.82.132)主機上連接,並查看master2的當前binlog狀態信息

wKiom1lV74SSvEU3AAB-EJ65i2M253.png 

 

 

master1上將master2設爲自已的主服務器並開啓slave功能

wKioL1lV74XwV6NzAABJ7VQ7J-Y396.png 

 

設置防火牆

# systemctl stop firewalld.service

 

查看從的狀態,以下兩個值必須爲yes,代表從服務器能正常連接主服務器

wKiom1lV74XyZkukAACLwIsqBQg039.png 

 

4、測試主主同步

master1上創建要同步的數據庫如test_db,並在test_db中創建一張測試表如tab1

wKiom1lV74aCZyj8AAA9DOiupEg265.png 

 

查看master2主機是否同步了master1上的數據變化

wKioL1lV74bBexznAABo4VFl1HE373.png 

 

從上圖可以看出master2同步了master的數據變化

master2主機上向tab1表中插入數據

wKiom1lV74aiUO_sAABCLVpWwoo625.png 

 

查看master1主機是否同步了master2上的數據變化

wKiom1lV8RDTGhByAAApmDcbhp0804.png 

 

現在任何一臺MySQL上更新數據都會同步到另一臺MySQLMySQL同步完成。

注意:若主MYSQL服務器已經存在,只是後期才搭建從MYSQL服務器,在置配數據同步前應先將主MYSQL服務器的要同步的數據庫拷貝到從MYSQL服務器上(如先在主MYSQL上備份數據庫,再用備份在從MYSQL服務器上恢復

下面我們就完成keepalived的高可用性。

keepalived是集羣管理中保證集羣高可用的一個軟件解決方案,其功能類似於heartbeat,用來防止單點故障

keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議

虛擬路由冗餘協議,可以認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backupmaster上面有一個對外提供服務的vipmaster會發組播(組播地址爲224.0.0.18,當backup收不到vrrp包時就認爲master宕掉了,這時就需要根據VRRP的優先級選舉一個backupmaster。這樣的話就可以保證路由器的高可用了。

keepalived主要有三個模塊,分別是corecheckvrrpcore模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。

二、keepalived的安裝配置

1、在master1master2安裝軟件包keepalived

安裝keepalived軟件包與服務控制

在編譯安裝Keepalived之前,必須先安裝內核開發包kernel-devel以及openssl-develpopt-devel等支持庫。

 

若沒有安裝則通過rpmyum工具進行安裝

#yum -y install kernel-devel openssl-devel popt-devel

 

編譯安裝Keepalived

wKiom1lV8RCjY8xHAABV0fjn14Q584.png 

 

 

注意:如不知道keepalived需要哪些依賴包,可到下載後的源碼解壓目錄下查看INSTALL 文件內容,安裝需要的依賴包,源碼安裝任何一個軟件都要養成查看源碼包文檔的習慣,比如INSTALLREADME,doc等文檔,可以獲得很多有用的信息

使用keepalived服務

需要手動添加爲系統服務,這樣就可以使用servicechkconfig工具來對keepalived服務程序進行管理了

wKioL1lV8RGzjw-qAACEwoHDwsQ033.png 

 

 

Master2主機也完成keepalived安裝,與master1一樣,安裝過程略

注:若開啓了防火牆,需要關閉防火牆或創建規則。

2修改Keepalived的配置文件

keepalived只有一個配置文件keepalived.conf,裏面主要包括以下幾個配置區域,分別是global_defsvrrp_instancevirtual_server

global_defs主要是配置故障發生時的通知對象以及機器標識

vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性

virtual_server:虛擬服務器定義

master1主機上的keepalived.conf文件的修改:

vi /etc/keepalived/keepalived.conf:

! Configuration File for keepalived     //!表示註釋

global_defs {

   router_id MYSQL-1   //表示運行keepalived服務器的一個標識

}

vrrp_instance VI_1 {

    state BACKUP  //指定keepalived的角色,兩臺配置此處均是BACKUP,設爲BACKUP將根據優先級決定主或從

    interface eth0     //指定HA監測網絡的接口

    virtual_router_id 51 //虛擬路由標識,這個標識是一個數字(取值在0-255之間,用來區分多個instanceVRRP組播),同一個vrrp實例使用唯一的標識,確保和master2相同,同網內不同集羣此項必須不同,否則發生衝突。

    priority 100   //用來選舉master的,要成爲master,該項取值範圍1-255(在此範圍之外會被識別成默認值100,此處master2上設置爲50

    advert_int 1   //VRRP包的時間間隔,即多久進行一次master選舉(可以認爲是健康查檢時間間隔)

    nopreempt    //不搶佔,即允許一個priority比較低的節點作爲master,即使有priority更高的節點啓動

    authentication {   //認證區域,認證類型有PASSHAIPSEC),推薦使用PASS(密碼只識別前8位)

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {    //VIP區域,指定vip地址

        192.168.0.200    }

}

virtual_server 192.168.0.200 3306 {  //設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開

    delay_loop 2    //設置運行情況檢查時間,單位是秒

    lb_algo rr     //設置後端調度算法,這裏設置爲rr,即輪詢算法

    lb_kind DR      //設置LVS實現負載均衡的機制,有NATTUNDR三個模式可選

    persistence_timeout 60   //會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,爲集羣系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。

    protocol TCP   //指定轉發協議類型,有TCPUDP兩種

    real_server 192.168.0.100 3306 {   //配置服務節點1,需要指定real server的真實IP地址和端口,IP與端口之間用空格隔開

注:master2上此處改爲192.168.1.102(master2本機ip)

weight 3     //配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小爲了區分不同性能的服務器

notify_down /etc/keepalived/bin/mysql.sh  //檢測到realservermysql服務down後執行的腳本

TCP_CHECK {

            connect_timeout 3           //連接超時時間

            nb_get_retry 3//重連次數

            delay_before_retry 3 //重連間隔時間

            connect_port 3306//健康檢查端口

        }

    }

}

master1主機上有關keepalived.conf文件的具體配置如下:

wKioL1lV8sOzRgd7AACSnc7LyZE281.png 

wKiom1lV8RKwdz3JAAAt6giYloE454.png 

啓動keepalived 服務

#/etc/init.d/keepalived start

Master2主機上的keepalived.conf文件的修改:

可以使用scp命令把server1主機上配置好的keepalived.conf文件拷貝到server2主機,只要做簡單修改即可,如下圖所示:

 

wKioL1lV8ROC30POAACKRJ01rhU596.png 

wKiom1lV8RPCJrYCAAAuY9kvZXs024.png 

 

 

 

啓動keepalived 服務

#/etc/init.d/keepalived start

3、#mkdir  /etc/keepalived/bin

wKioL1lV8ROT0FUiAAAvImxU2tI473.png 

 

 

Master2主機完成相同的操作

4、測試master1master2分別執行ip  addr 命令查看master1master2VIP(羣集虛擬IP)的控制權

Master1主的查看結果:

wKiom1lV8RfDkxATAADyaY3NOBk407.png 

 

Master2主的查看結果:

wKioL1lV8RjiT-LJAADSGBjvJY8745.png 

 

從上圖可以看出master1是主服務器,master2爲備用服務器。

停止MySQL服務,看keepalived健康檢查程序是否會觸發我們編寫的腳本

注意:如果虛擬IP沒有跳過去,可以使用ps -aux | grep keepalived過濾出keepalived進程,然後是由kill -9 +進程號強制殺死進程

停止master1主機的mysql服務

# systemctl stop mysqld

 

Master2主的查看結果:


 wKioL1lV8o-DyKK9AACn3TRe-LA901.png

 

這說明在主服務上停止MySQL服務,觸發我們編寫的腳本,進行自動故障切換。

MySQL遠程登錄測試

我們找一臺安裝有MySQL客戶端,然後登錄VIP,看是否能登錄,在登錄之前兩臺MySQL服務器都要授權允許從遠程登錄。例如:

 

wKiom1lV8d-DPInkAAAo9gJ7TnU228.png 

 在客戶端上測試登錄

wKiom1lV8eKTD2_mAADeL46LkRA976.png

客戶端訪問VIP地址,由master1主機提供響應的,因爲master1當前是主服務器

客戶端的查詢請求是由master2主機響應的。故障切換成功

總結:

Keepalived+mysql雙主一般來說,中小型規模的時候,採用這種架構是最省事的。

master節點發生故障後,利用keepalived的高可用機制實現快速切換到備用節點。

在這個方案裏,有幾個需要注意的地方:

1.採用keepalived作爲高可用方案時,兩個節點最好都設置成BACKUP模式,避免因爲意外情況下(比如腦裂)相互搶佔導致往兩個節點寫入相同數據而引發衝突;

2.把兩個節點的auto_increment_increment(自增步長)和auto_increment_offset(自增起始值)設成不同值。其目的是爲了避免master節點意外宕機時,可能會有部分binlog未能及時複製到slave上被應用,從而會導致slave新寫入數據的自增值和原先master上衝突了,因此一開始就使其錯開;當然了,如果有合適的容錯機制能解決主從自增ID衝突的話,也可以不這麼做;

3.slave節點服務器配置不要太差,否則更容易導致複製延遲。作爲熱備節點的slave服務器,硬件配置不能低於master節點;

4.如果對延遲問題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程複製的方式可以很大程度降低複製延遲;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章