利用Keepalived構建雙主MySQL

使用MySQL雙master+keepalived是一種非常好的解決方案,在MySQL-HA環境中,MySQL互爲主從關係,這樣就保證了兩臺MySQL數據的一致性,然後用keepalived實現虛擬IP,通過keepalived自帶的服務監控功能來實現MySQL故障時自動切換。

下面,我把即將上線的一個生產環境中的架構與大家分享一下,看一下這個架構中,MySQL-HA是如何實現的,環境拓撲如下

MySQL-VIP:10.10.10.21 

MySQL-master1:10.10.10.17

MySQL-master2:10.10.10.18

OS版本:RedHat6.2 

MySQL版本:mysql-5.1.59

Keepalived版本:keepalived-1.1.20

一、MySQL master-master配置

1、修改MySQL配置文件

兩臺MySQL均如要開啓binlog日誌功能,開啓方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項

兩臺MySQL的server-ID不能一樣,默認情況下兩臺MySQL的serverID都是1,需將其中一臺修改爲2即可

Master1配置:

#vim /etc/my.cnf

log-bin=mysql-bin   //開啓binlog日誌功能

log =/usr/local/mysql/var/mysql.log    //會打印mysql的所以sql語句

 

server-id= 1  //

binlog-do-db =mysql    //需要同步的庫名稱

auto-increment-increment= 2

auto-increment-offset= 2

 

Master2配置:

#vim /etc/my.cnf

log-bin=mysql-bin    //開啓binlog日誌功能

log =/usr/local/mysql/var/mysql.log  //會打印mysql的所以sql語句

 

server-id= 2

binlog-do-db =mysql   //需要同步的庫名稱

auto-increment-increment= 2

auto-increment-offset= 2

 

2、建授權用戶

在10.10.10.17上新建授權用戶

grant replicationslave on *.* to test@’10.10.10.%’ identified by ‘123456’;   

在10.10.10.18服務器上建授權用戶

grant replicationslave on *.* to test@’10.10.10.%’ identified by ‘123456’;      

 

3、將10.10.10.17設爲10.10.10.18的主服務器                                                                                                                                                                                                                                                                                                        

在10.10.10.18上將10.10.10.17設爲自己的主服務器

mysql> show master status;(17服務器配置)

1+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000027|   106|mysql    |    |

+------------------+----------+--------------+------------------+

1 row in set (0.01 sec)

MySQL> change master to master_host='10.10.10.17',master_user=’test’,master_password='123456',master_log_file='MySQL-bin.000027',master_log_pos=106;

Query OK, 0 rows affected (0.05 sec)

MySQL> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G

Slave_IO_Running: Yes 

Slave_SQL_Running: Yes   \\如果此2項都爲yes,master-master配置即成功

 

將10.10.10.18設爲10.10.10.17的主服務器  方法與上面設置一致只需將

在10.10.10.17上將10.10.10.18設爲自己的主服務器

mysql> show master status;(18服務器配置)

1+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000027|   106|mysql    |    |

+------------------+----------+--------------+------------------+

1 row in set (0.01 sec)

MySQL> change master to master_host='10.10.10.18',master_user=’test’,master_password='123456',master_log_file='MySQL-bin.000027',master_log_pos=106;

Query OK, 0 rows affected (0.05 sec)

MySQL> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G

Slave_IO_Running: Yes 

Slave_SQL_Running: Yes   \\如果此2項都爲yes,master-master配置即成功

測試是否成功:

如上述均正確配置,現在在任何一臺MySQL上更新數據都會同步到另一臺MySQL(僅限mysql庫)


二、keepalived安裝及配置

1、10.10.10.17服務器上keepalived安裝及配置

安裝keepalived

#tar zxvfkeepalived-1.1.20.tar.gz 

#cdkeepalived-1.1.20 

#./configure--prefix=/usr/local/keepalived--with-kernel-dir=/usr/src/kernels/2.6.32-220.el6.x86_64 

#make &&make install

配置keepalived

我們自己在新建一個配置文件,默認情況下keepalived啓動時會去/etc/keepalived目錄下找配置文件

#mkdir/etc/keepalived 

#vi/etc/keepalived/keepalived.conf 

global_defs {

     notification_email {

     [email protected]

     }

     [email protected]

     smtp_server 127.0.0.1  (如果本機配置的話)

     smtp_connect_timeout 30

     router_id MySQL-ha

     }

vrrp_instance VI_1{

     state BACKUP   #兩臺配置此處均是BACKUP

     interface p4p1 #注意網卡接口

     virtual_router_id 51

     priority 100   #優先級,另一臺改爲90

     advert_int 1

     nopreempt     #不主動搶佔資源,只在優先級高的機器上設置即可,優先級低的機器不設置

     authentication {

     auth_type PASS

     auth_pass 1111

     }

     virtual_ipaddress {

     10.10.10.21

     }

     }

 

virtual_server10.10.10.21 3306 {

     delay_loop 2   #每個2秒檢查一次real_server狀態

     lb_algo wrr    #LVS算法

     lb_kind DR     #LVS模式

     persistence_timeout 60   #會話保持時間

     protocol TCP

     real_server 10.10.10.17 3306 {

     weight 3

     notify_down /usr/local/my/my.sh  #檢測到服務down後執行的腳本

     TCP_CHECK {

     connect_timeout 10    #連接超時時間

     nb_get_retry 3        #重連次數

     delay_before_retry 3   #重連間隔時間

     connect_port 3306      #健康檢查端口

     }

     }

編寫檢測服務down後所要執行的腳本

#vi/usr/local/MySQL/bin/MySQL.sh 

#!/bin/sh 

pkillkeepalived 

#chmod +x/usr/local/MySQL/bin/MySQL.sh

注:此腳本是上面配置文件notify_down選項所用到的,keepalived使用notify_down選項來檢查real_server的服務狀態,當發現real_server服務故障時,便觸發此腳本;我們可以看到,腳本就一個命令,通過pkill keepalived強制殺死keepalived進程,從而實現了MySQL故障自動轉移。另外,我們不用擔心兩個MySQL會同時提供數據更新操作,因爲每臺MySQL上的keepalived的配置裏面只有本機MySQL的IP+VIP,而不是兩臺MySQL的IP+VIP

啓動keepalived

#/usr/local/keepalived/sbin/keepalived–D 

#ps -aux | grepkeepalived

測試

找一臺局域網PC,然後去ping  MySQL的VIP,這時候MySQL的VIP是可以ping的通的

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

 

1、10.10.10.18服務器上keepalived安裝及配置

安裝keepalived

#tar zxvfkeepalived-1.1.20.tar.gz 

#cdkeepalived-1.1.20 

#./configure--prefix=/usr/local/keepalived--with-kernel-dir=/usr/src/kernels/2.6.32-220.el6.x86_64 

#make &&make install

配置keepalived

我們自己在新建一個配置文件,默認情況下keepalived啓動時會去/etc/keepalived目錄下找配置文件

#mkdir/etc/keepalived 

#vi/etc/keepalived/keepalived.conf 

 

global_defs {

     notification_email {

     [email protected]

     }

     [email protected]

     smtp_server 127.0.0.1

     smtp_connect_timeout 30

     router_id MySQL-ha

     }

 

vrrp_instance VI_1{

     state BACKUP   #兩臺配置此處均是BACKUP

     interface p4p1 #注意網卡接口

     virtual_router_id 51

     priority 90   #優先級,另一臺改爲90

     advert_int 1

     authentication {

     auth_type PASS

     auth_pass 1111

     }

     virtual_ipaddress {

     10.10.10.21

     }

     }

virtual_server10.10.10.21 3306 {

     delay_loop 2   #每個2秒檢查一次real_server狀態

     lb_algo wrr    #LVS算法

     lb_kind DR     #LVS模式

     persistence_timeout 60   #會話保持時間

     protocol TCP

     real_server 10.10.10.18 3306 {

     weight 3

     notify_down /usr/local/my/my.sh  #檢測到服務down後執行的腳本

     TCP_CHECK {

     connect_timeout 10    #連接超時時間

     nb_get_retry 3        #重連次數

     delay_before_retry 3   #重連間隔時間

     connect_port 3306      #健康檢查端口

     }

     }

啓動keepalived 

#/usr/local/keepalived/sbin/keepalived–D 

#ps -aux | grepkeepalived

測試

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


三、測試

兩臺MySQL服務器都要授權允許從遠程登錄

MySQL> grantall privileges on *.* to andyguo@'%' identified by '123456'; 

Query OK, 0 rowsaffected (0.00 sec) 

MySQL> flushprivileges; 

Query OK, 0 rowsaffected (0.00 sec)

keepalived故障轉移測試:

在windows客戶端一直去ping  VIP,然後關閉10.10.10.17上的keepalived,正常情況下VIP就會切換到10.10.10.18上面去

開啓10.10.10.17上的keepalived,關閉10.10.10.18上的keepalived,看是否能自動切換,正常情況下VIP又會屬於10.10.10.17

注:keepalived切換速度還是非常塊的,整個切換過程只需1-3秒

MySQL故障轉移測試:

在10.10.10.17上關閉MySQL服務,看VIP是否會切換到10.10.10.18上

開啓10.10.10.17上的MySQL和keepalived,然後關閉10.10.10.18上的MySQL,看VIP是否會切換到10.10.10.17上

如果都沒問題,到此整個配置即已完成。

備註(在測試的過程中遇到了一些問題,解決方法)

Keepalived_healthcheckers:IPVS: Can't initialize ipvs: Protocol not available

起初重裝了ipvsadm和keepalived,但故障依舊,隨後突然想到是否lvs模塊加載異常,於是lsmod|grep ip_vs發現果然沒有相應的模塊,而正常情況下應該是有的

e、手動加載ip_vs模塊

modprobe ip_vs

modprobe ip_vs_wrr

f、重啓keepalived服務,故障排除,此時轉發正常,從服務器的ip_vs加載正常,主從切換也正常

g、將modprobeip_vs、modprobe ip_vs_wrr添加進/etc/rc.local開機自動加載

在加上nginx的負載均衡,這樣就可以是實現mysql的讀寫分離了,見http://www.linuxidc.com/Linux/2012-09/69989.htm


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