1. 程式人生 > >MySQL 高可用性—keepalived+mysql雙主(有詳細步驟和全部配置項解釋)

MySQL 高可用性—keepalived+mysql雙主(有詳細步驟和全部配置項解釋)

MySQL 高可用性—keepalived+mysql雙主(有詳細步驟和全部配置項解釋)

 

博主QQ:819594300

部落格地址:http://zpf666.blog.51cto.com/

有什麼疑問的朋友可以聯絡博主,博主會幫你們解答,謝謝支援!

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

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

keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD等,比較常用的是keepalived+雙主,MHA和PXC。

本節主要介紹了利用 keepalived 實現 MySQL 資料庫的高可用。

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

拓撲環境:

OS:centos7.2x86_64

Mysql版本:mysql5.7.13

Keepalived: keepalived-1.2.20

Mysql-vip:192.168.1.150

Mysql-master1:192.168.1.100

Mysql-master2:192.168.1.200

一、   配置兩臺mysql主主同步

wKiom1jnLHuR3l7HAAHYSz089fw044.jpg

該過程的第一部分就是master記錄二進位制日誌。在每個事務更新資料完成之前,master在二日誌記錄這些改變。MySQL將事務寫入二進位制日誌。在事件寫入二進位制日誌完成後,master通知儲存引擎提交事務。

下一步就是slave將master的binarylog拷貝到它自己的中繼日誌。首先,slave開始一個工作執行緒——I/O執行緒。I/O執行緒在master上開啟一個普通的連線,然後開始binlog dump process。Binlog dump process從master的二進位制日誌中讀取事件,如果已經同步了master,它會睡眠並等待master產生新的事件。I/O執行緒將這些事件寫入中繼日誌。

SQL slave thread(SQL從執行緒)處理該過程的最後一步。SQL執行緒從中繼日誌讀取事件,並重放其中的事件而更新slave的資料,使其與master中的資料一致。只要該執行緒與I/O執行緒保持一致,中繼日誌通常會位於OS的快取中,所以中繼日誌的開銷很小。

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

若mysql主機開啟了防火牆,需要關閉防火牆或建立規則。

實驗具體過程如下:

1、修改MySQL配置檔案

wKiom1jnLIey1ApkAAPgbbhDvwo982.jpg

wKioL1jnLJCDQWtvAAMYwyVd-oc720.jpg

注意:mysql1和mysql只有server-id不同和auto-increment-offset不同,其他必須相同。

部分配置項解釋如下:

binlog_format= mixed:指定mysql的binlog日誌的格式,mixed是混合模式。

relay-log:開啟中繼日誌功能

relay-log-index:中繼日誌清單

auto-increment-increment= 2:表示自增長欄位每次遞增的量,其預設值是1。它的值應設為整個結構中伺服器的總數,本案例用到兩臺伺服器,所以值設為2。

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

注:另外還可以在my.cnf配置檔案中,新增“binlog_do_db=資料庫名”配置項(可以新增多個)來指定要同步的資料庫。如果配置了這個配置項,如果沒新增在該配置項後面的資料庫,則binlog不記錄它的事件。

2、將mysql1設為mysql2的主伺服器

在mysql1主機上建立授權賬戶,允許在mysql2(192.168.1.200)主機上連線

wKioL1jnLJGgbqmKAAC60NyNk-A967.jpg

檢視mysql1的當前binlog狀態資訊:

wKiom1jnLJPAISjhAADr3DabXe8300.jpg

在mysql2上將mysql1設為自已的主伺服器並開啟slave功能:

wKiom1jnLJaC1RRIAADrr-KsmSE920.jpg

下面看一看mysql2的狀態:

wKioL1jnLJ2g1CLhAALhaSE39eE948.jpg

wKiom1jnLJ_BLHK5AAC94hdtBQQ794.jpg

在mysql1防火牆上開啟3306/tcp例外:

wKiom1jnLKLBx7TmAAEVHooj98k364.jpg

順道把mysql2的防火牆也開啟3306/tcp例外,反正後面實驗還是要開,那就現在一道開了吧:

wKioL1jnLKaA03eQAAErx1O-rno921.jpg

再次檢視mysql2的狀態:

wKiom1jnLK2DcGcKAAISmuwZaNs964.jpg

wKiom1jnLK2CaaEQAADnRPu3QrA960.jpg

更換mysql2的UUID號:

wKioL1jnLK2R4MlgAAHc_Bc8c8E991.jpg

修改完UUID必須重啟mysqld服務才能生效:

wKiom1jnLK6TLZzSAAExMKaDPM4413.jpg

這次再來檢視mysql2的狀態:

wKioL1jnLK-TTZwkAAJU4I82V9c066.jpg

3、現在反過來·,再將mysql2設為mysql1的主伺服器

在mysql2主機上建立授權賬戶,允許在mysql1(192.168.1.100)主機上連線

wKioL1jnLK-i0v6hAAC4h5C1iHQ170.jpg

檢視mysql2的當前binlog狀態資訊:

wKiom1jnLLDgIaGrAADlVt7630A610.jpg

在mysql1上將mysql2設為自已的主伺服器並開啟slave功能:

wKioL1jnLLDRV4z_AADl5W2gM4M735.jpg

檢視mysql1的狀態:

wKiom1jnLLHD9XJXAAJfFeYTHK8663.jpg

4、測試主主同步

在mysql1上建立要同步的資料庫如bdqn,並在bdqn中建立一張測試表叫it

wKioL1jnLLHQf1HUAAFMrZIy6vI976.jpg

檢視mysql2主機是否同步了mysql1上的資料變化:

wKiom1jnLLLC8v1rAAHqIozz_CA612.jpg

從上圖可以看出mysql2同步了mysql1的資料變化

現在往mysql2主機上向it表中插入兩行資料:

wKiom1jnLLLDwwu3AAH9V7F283s122.jpg

檢視mysql1主機是否同步了mysql2上的資料變化:

wKioL1jnLLKw2CR8AAGRKIpxkQ8557.jpg

總結:至此現在任何一臺MySQL上更新資料都會同步到另一臺MySQL,MySQL同步完成。

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

 

 

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

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

keepalived是以VRRP協議為實現基礎的,VRRP全稱VirtualRouter Redundancy Protocol,即虛擬路由冗餘協議。

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

keepalived主要有三個模組,分別是core 、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。

 

二、keepalived的安裝配置

1、在mysql1和mysql2兩臺伺服器上安裝keepalived的幾個依賴包

wKiom1jnLLORWQJwAAB1GsjZ0RM267.jpg

注意:如不知道keepalived需要哪些依賴包,可到下載後的原始碼解壓目錄下檢視INSTALL 檔案內容,安裝需要的依賴包,原始碼安裝任何一個軟體都要養成檢視原始碼包文件的習慣,比如INSTALL,README,doc等文件,可以獲得很多有用的資訊。

下面我們來看一看keepalived的INSTALL檔案:

wKioL1jnLLOxEGWSAAF6gWxpz_8831.jpg

2、在兩臺mysql上都開始解壓縮編譯安裝keepalived

wKioL1jnLLOzz6n0AADPbqZQxVE640.jpg

注:如果你使用的是centos6.5版本,則配置編譯裝的時候要這樣寫,如下圖所示:

wKiom1jnLLTT05AgAACmwUh0ouU884.jpg

3、執行make install操作之後,會自動生成/etc/init.d/keepalived指令碼檔案,但還需要手動新增為系統服務,這樣就可以使用service、chkconfig工具來對keepalived服務程式進行管理了。

wKiom1jnLLTDedvJAAESpUpb7XA654.jpg

4、若開啟了防火牆,則需要關閉防火牆或者建富策略(現實生產環境中,都不允許關防火牆的,所以我們還是建富策略為第一選擇)(兩臺mysql都需要操作)

wKioL1jnLLSA8xeUAACaeQKSKVM344.jpg

5、修改keepalived的配置檔案

說明:keepalived只有一個配置檔案keepalived.conf,裡面主要包括以下幾個配置區域,分別是:

global_defs、vrrp_instance和virtual_server。

  • global_defs:主要是配置故障發生時的通知物件以及機器標識。

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

  • virtual_server:虛擬伺服器定義

wKiom1jnLLWCTZqjAAEhFi9071s627.jpg

wKiom1jnLLWzzwNCAAK3OBVf8iQ452.jpg

看不清截圖的可以看下面的貼上的文字:

! Configuration File for keepalived

 

global_defs {

  router_id mysql-1

}

 

vrrp_instance VI_1 {

   state BACKUP

   interface eno16777736

   virtual_router_id 51

   priority 100

   advert_int 1

   nopreempt

   authentication {

       auth_type PASS

       auth_pass 1111

   }

   virtual_ipaddress {

       192.168.1.150

   }

}

 

virtual_server 192.168.1.150 3306 {

   delay_loop 2

   lb_algo rr

   lb_kind DR

   persistence_timeout 60

   protocol TCP

 

   real_server 192.168.1.100 3306 {

       weight 3

       notify_down    /etc/keepalived/bin/mysql.sh

       TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 3306

       }

   }

}

每個配置項的解釋如下:

wKioL1jnLLbwBLWJAAND2YVoXRM716.jpg

wKioL1jnLODheqrjAANF2XgFeuc652.jpg

同樣的也需要修改mysql2的keepalived配置檔案(下圖中綠色部分為和mysql1不一樣的地方)

可以使用scp命令把mysql1主機上配置好的keepalived.conf檔案拷貝到server2主機,只需要改綠色部分即可:

wKiom1jnLOGw8qmPAAH_RyWHGjY216.jpg

6、啟動keepalived服務(兩臺都要啟動)

wKioL1jnLOHhuzIkAACMRtWOZDE239.jpg

7、mysql1和mysql2上都需要新增檢測指令碼

作用:是當mysql停止工作時自動關閉本機的keeplived,從而實現將故障主機踢出熱備組,因每臺機器上keepalived只添加了本機為realserver,所以當mysqld正常啟動後,我們還需要手動啟動keepalived服務。

wKioL1jnLOHDYjlGAADV21Ou_V0874.jpg

wKiom1jnLOKT0amfAADeX5kw9Nw004.jpg

8、給mysql.sh指令碼賦予可執行許可權(兩臺mysql都操作同樣的步驟)

wKioL1jnLOLjBpjgAACjKpZRP_s633.jpg

9、在mysql1和mysql2上分別執行ip addr show dev eno16777736命令檢視mysql1和mysql2對VIP(群集虛擬IP)的控制權

wKioL1jnLObRO7kAAAFZrDE0A4I304.jpg

wKiom1jnLOijvuALAAEc-Tbq9lQ042.jpg

從上圖可以看出mysql1是master,mysql2是slave。

10、停止mysql1的mysql服務,看keepalived健康檢查程式是否會觸發了我們編寫的指令碼,進行自動故障切換

wKioL1jnLOryIVO7AAEMVrMAETs562.jpg

wKioL1jnLO6DeS-AAAFTTbamlgs692.jpg

從上圖可以說明在master伺服器的mysql服務發生故障時,mysql1主機觸發了我們編寫的指令碼,發生了自動故障切換。

11、現在我們把mysql1的mysql服務開起來,並且keepalived的服務也需要手動開啟

wKiom1jnLPLg6lOkAAEIC75-c1Q029.jpg

12、我們再次在兩臺mysql伺服器上用ip addr show dev eno16777736命令看一下

wKiom1jnLPWAmum_AAErgsnHOm8188.jpg

wKioL1jnLPiQg3zqAAFep6K1b9E362.jpg

從上面兩張圖可以看出,即便mysql1的mysql服務和keepalived服務都重新開啟了,mysql2仍然是master了,mysql1搶不回去master的權利了,說明我們設定的nopreempt配置生效了,在生產環境中就需要新增不搶佔配置,保證了群集穩定性,只有當mysql2的mysql服務壞掉的時候,mysql1才會再次成為master,否則它永遠只能當mysql2的備份。(注:nopreempt一般是在優先順序高的mysql上設定)

13、我們找一臺安裝有MySQL客戶端,然後登入VIP,看是否能登入,在登入之前兩臺MySQL伺服器都要授權允許從遠端登入

wKiom1jnLPyR1HyPAAFujBaMMSk453.jpg

在客戶端上登陸:

wKioL1jnLQGhXoXFAAIy3pt7jiE132.jpg

上圖顯示說明在客戶端訪問VIP地址,由mysql2主機提供響應的,因為mysql2當前是主伺服器,將mysql2的mysql服務停止,在客戶端執行show  variables like‘server_id’;

wKioL1jnLQOSpPe5AAD_D8pVJ78849.jpg

wKioL1jnLQqA5m4PAAIYqzox4XI257.jpg

上圖顯示說明在客戶端的查詢請求是由mysql1主機響應的,故障切換成功。

 

總結:

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最新版本,利用多執行緒複製的方式可以很大程度降低複製延