使用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 {
}
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 {
}
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