一、Mysql雙主互備+keeplived高可用架構介紹
Mysql主從複製架構可以在很大程度保證Mysql的高可用,在一主多從的架構中還可以利用讀寫分離將讀操作分配到從庫中,減輕主庫壓力。但是在這種架構中,主庫出現故障時需要手動將一臺從庫提升爲主庫。在對寫操作要求較高的環境中,主庫故障在主從架構中會成爲單點故障。因此需要主主互備架構,避免主節點故障造成寫操作失效。
在雙主互備的架構中,每臺Mysql都充當主服務器,同時充當對方的從服務器。在任意一臺服務器上的寫操作都會被複制到另一臺服務器上,從而保證了數據的可靠性。
在雙主互備的基礎上加上keeplived,在其中一臺機器上綁定虛擬ip(VIP)。利用vip統一對外服務,可以避免在兩個節點同時寫數據造成衝突。同時當keeplived主節點發生故障時,keeplived會自動將VIP切換到備節點上,從而實現主服務器的高可用。
Mysql雙主互備+keeplived高可用架構圖
二、Mysql雙主互備架構部署
在上一篇Mysql主從複製操作中已經完成了Mysql主從架構的部署。在此基礎上,需要在原Master上開啓relay-log,在原Slave服務器上開啓log-bin,同時在Mysql248上指定Mysql249爲自己的主服務器並開啓slave即可。
1.開啓原Master上的relay-log,指定不復制的庫
[root@Mysql-248 mysql-5.6.30]# grep -A8 'mysqld' my.cnf [mysqld] port = 3306 server_id = 1 log-bin=mysql-bin #以下部分爲在原基礎上新增的內容 relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
2.開啓原Slave上的log-bin,指定不復制的庫
[root@Mysql-249 mysql-5.6.30]# grep -A8 'mysqld' my.cnf
[mysqld] port = 3306 server_id = 2 relay-log = mysql-relay-bin #以下部分爲在原基礎上新增的內容 log-bin=mysql-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
3.在Mysql248服務器上指定Mysql249爲自己的主服務器並開啓slave
#### ① 在Mysql249上查看當前master信息,並建立複製用戶 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 493 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> grant replication slave on *.* to 'repl_user'@'192.168.175.%' identified by '123456'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) #### ② 在Mysql248上指定Mysql249爲自己的主服務器,開啓slave mysql> change master to \ -> master_host='192.168.175.249', -> master_user='repl_user', -> master_password='123456', -> master_log_file='mysql-bin.000001', -> master_log_pos=493; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected (0.03 sec)
4.檢驗雙主互備
①通過分別在兩臺服務器上使用show slave status\G,查詢主庫信息以及IO進程、SQL進程工作狀態。若兩臺服務器的查詢結果都爲Slave_IO_Running: Yes,Slave_SQL_Running: Yes;則表示當前雙主互備狀態正常。
②在Mysql248數據庫上建庫建表,檢查Mysql249上是否同步正常;然後在Mysql249上建庫建表,檢查Mysql248上是否同步正常。
三、Keeplived高可用部署
以下操作在兩臺機器上基本相同,不同之處請留意備註標識
1.keeplived編譯安裝
#編譯操作兩臺機器一樣 [root@Mysql-248 src]# tar -zxf keepalived-1.2.12.tar.gz [root@Mysql-248 src]# cd keepalived-1.2.12 [root@Mysql-248 keepalived-1.2.12]# ./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-573.el6.x86_64/ [root@Mysql-248 keepalived-1.2.12]# make [root@Mysql-248 keepalived-1.2.12]# make install [root@Mysql-248 keepalived-1.2.12]# ln -s /usr/local/sbin/keepalived /sbin/ [root@Mysql-248 keepalived-1.2.12]# chkconfig --add keepalived [root@Mysql-248 keepalived-1.2.12]# chkconfig --level 35 keepalived on
2.keeplived配置
#配置文件中需要注意主備節點的priority與nopreempt配置不同 [root@Mysql-248 ~]# cd /etc/keepalived/ [root@Mysql-248 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id MySQLHA_DEVEL } vrrp_script check_mysqld { script "/etc/keepalived/mysqlcheck/check_slave.sh" #定義檢測mysql複製狀態的腳本 interval 2 } vrrp_instance HA_1 { state BACKUP #兩臺mysql服務器均配置爲BACKUP interface eth0 virtual_router_id 80 priority 100 #備用節點設置爲90 advert_int 2 nopreempt #不搶佔模式,只在優先級高的機器上設置即可,備用節點不加此參數 authentication { auth_type PASS auth_pass qweasdzxc } track_script { check_mysqld #調用mysql檢測腳本 } virtual_ipaddress { 192.168.175.254/24 dev eth0 #mysql的對外服務IP,即VIP } } [root@Mysql-248 keepalived]#
3.配置Mysql檢測腳本
#檢測腳本主備節點都一樣 [root@Mysql-248 keepalived]# cat /etc/keepalived/mysqlcheck/check_slave.sh #!/bin/bash #This scripts is check for Mysql Slave status Mysqlbin=/usr/local/mysql-5.6.30/bin/mysql user=root pw='qwe123``' port=3306 host=127.0.0.1 sbm=120 #Check for $Mysqlbin if [ ! -f $Mysqlbin ];then echo 'Mysqlbin not found,check the variable Mysqlbin' exit 99 fi #Get Mysql Slave Status IOThread=`$Mysqlbin -h $host -P $port -u$user -p$pw -e 'show slave status\G' 2>/dev/null|grep 'Slave_IO_Running:'|awk '{print $NF}'` SQLThread=`$Mysqlbin -h $host -P $port -u$user -p$pw -e 'show slave status\G' 2>/dev/null|grep 'Slave_SQL_Running:'|awk '{print $NF}'` SBM=`$Mysqlbin -h $host -P $port -u$user -p$pw -e 'show slave status\G' 2>/dev/null|grep 'Seconds_Behind_Master:'|awk '{print $NF}'` #Check if the mysql run if [[ -z "$IOThread" ]];then exit 1 fi #Check if the thread run if [[ "$IOThread" = "No" || "$SQLThread" = "No" ]];then exit 1 elif [[ $SBM -ge $sbm ]];then exit 1 else exit 0 fi [root@Mysql-248 keepalived]#
4.啓動keeplived
#分別在Mysql248、Mysql249上啓動keeplived #需要注意由於設置了nopreempt非強佔模式,所以先啓動的節點會成爲主節點,後啓動的成爲備節點。 [root@Mysql-248 keepalived]# /etc/init.d/keepalived start Starting keepalived: [ OK ] [root@Mysql-249 keepalived]# /etc/init.d/keepalived start Starting keepalived: [ OK ]
四、檢驗Mysql雙主互備+keeplived高可用架構
1.啓動後檢查message日誌信息
#在248上查看message日誌,發現啓動時節點進入MASTER狀態,並且綁定了192.168.175.254的VIP [root@Mysql-248 ~]# tail -f /var/log/messages Sep 1 08:16:41 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Transition to MASTER STATE Sep 1 08:16:43 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Entering MASTER STATE Sep 1 08:16:43 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) setting protocol VIPs. Sep 1 08:16:43 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Sending gratuitous ARPs on eth0 for 192.168.175.254 Sep 1 08:16:43 Mysql-248 Keepalived_healthcheckers[71142]: Netlink reflector reports IP 192.168.175.254 added Sep 1 08:16:48 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Sending gratuitous ARPs on eth0 for 192.168.175.254 #在249上查看message日誌,發現啓動時節點進入BACKUP狀態 [root@Mysql-249 ~]# tail -f /var/log/messages Sep 1 08:19:15 Mysql-249 Keepalived_vrrp[54929]: Truncating auth_pass to 8 characters Sep 1 08:19:15 Mysql-249 Keepalived_vrrp[54929]: Configuration is using : 65520 Bytes Sep 1 08:19:15 Mysql-249 Keepalived_healthcheckers[54928]: Configuration is using : 7520 Bytes Sep 1 08:19:15 Mysql-249 Keepalived_vrrp[54929]: Using LinkWatch kernel netlink reflector... Sep 1 08:19:15 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) Entering BACKUP STATE Sep 1 08:19:15 Mysql-249 Keepalived_healthcheckers[54928]: Using LinkWatch kernel netlink reflector... Sep 1 08:19:15 Mysql-249 Keepalived_vrrp[54929]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
若兩臺服務器啓動後都進入MASTER狀態,都綁定了VIP,則需要檢查防火牆是否放行了VRRP。
防火牆放行VRRP後,會有一臺機器進入BACKUP狀態。
#分別在兩臺服務器上放行vrrp協議(Centos5/6配置方法): [root@Mysql-248 keepalived]#iptables -I INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT #保存放行規則。若是通過開機腳本控制防火牆規則,請注意修改對應腳本。 [root@Mysql-248 keepalived]#/etc/init.d/iptables
2.檢查兩臺服務器的IP,並在客戶機通過VIP連接數據庫
#在248上查看,發現此時vip在此機器 [root@Mysql-248 keepalived]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:47:a4:ea brd ff:ff:ff:ff:ff:ff inet 192.168.175.248/24 brd 192.168.175.255 scope global eth0 inet 192.168.175.254/24 scope global secondary eth0 inet6 fe80::20c:29ff:fe47:a4ea/64 scope link valid_lft forever preferred_lft forever #在249上查看,並無VIP [root@Mysql-249 keepalived]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e9:01:e0 brd ff:ff:ff:ff:ff:ff inet 192.168.175.249/24 brd 192.168.175.255 scope global eth0 inet6 fe80::20c:29ff:fee9:1e0/64 scope link valid_lft forever preferred_lft forever
客戶端通過VIP連接數據庫
3.在客戶機通過VIP連接Mysql,同時測試不間斷ping vip254,並停止Mysql248上的Mysql服務器。停止後新建一個數據庫測試主節點故障後的寫操作是否正常。
[root@Mysql-248 keepalived]# /etc/init.d/mysqld stop Shutting down MySQL............ SUCCESS! [root@Mysql-248 keepalived]#
不間斷ping測試故障切換時間
故障切換後測試寫入數據
在模擬故障的過程中,VIP切換時網絡會出現一下中斷,幾次測試發現VIP切換的時間在幾百毫秒延遲到一個丟包之間,切換時間非常短。但是測試寫入數據提示連接中斷,重試後發現可以正常寫入數據。所以此架構需要程序端有數據庫斷開時重連的機制。在此情況下,主節點故障對業務的影響時間就降低到了秒級,無需人爲干預才能恢復業務。
一臺節點故障後,僅剩下一臺節點能夠正常工作,只需要配合監控發現故障後,及時修復故障節點,就可以將恢復後的節點重新成爲keeplived的備用節點,以保證架構的持續高可用。
4.故障切換過程
#在故障節點248上查看日誌,發現VRRP_Script檢測到Mysql狀態faild,節點進入FAULT狀態並移除vip [root@Mysql-248 ~]# tail -f /var/log/messages Sep 1 08:32:51 Mysql-248 Keepalived_vrrp[71143]: VRRP_Script(check_mysqld) failed Sep 1 08:32:52 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Entering FAULT STATE Sep 1 08:32:52 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) removing protocol VIPs. Sep 1 08:32:52 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Now in FAULT state Sep 1 08:32:52 Mysql-248 Keepalived_healthcheckers[71142]: Netlink reflector reports IP 192.168.175.254 removed #249服務器進入MASTER狀態,並綁定VIP [root@Mysql-249 ~]# tail -f /var/log/messages Sep 1 08:32:54 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) Transition to MASTER STATE Sep 1 08:32:56 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) Entering MASTER STATE Sep 1 08:32:56 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) setting protocol VIPs. Sep 1 08:32:56 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) Sending gratuitous ARPs on eth0 for 192.168.175.254 Sep 1 08:32:56 Mysql-249 Keepalived_healthcheckers[54928]: Netlink reflector reports IP 192.168.175.254 added Sep 1 08:33:01 Mysql-249 Keepalived_vrrp[54929]: VRRP_Instance(HA_1) Sending gratuitous ARPs on eth0 for 192.168.175.254
5.故障節點恢復
#將測試時關閉的數據庫打開,查看日誌發現節點進入BACKUP狀態 #查看數據庫發現故障時候創建的數據庫已經同步過來了 #此時又恢復Mysql雙主複製的高可用狀態了 [root@Mysql-248 keepalived]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS! [root@Mysql-248 keepalived]# tail -5 /var/log/messages Sep 1 08:32:52 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) removing protocol VIPs. Sep 1 08:32:52 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Now in FAULT state Sep 1 08:32:52 Mysql-248 Keepalived_healthcheckers[71142]: Netlink reflector reports IP 192.168.175.254 removed Sep 1 08:51:42 Mysql-248 Keepalived_vrrp[71143]: VRRP_Script(check_mysqld) succeeded Sep 1 08:51:44 Mysql-248 Keepalived_vrrp[71143]: VRRP_Instance(HA_1) Entering BACKUP STATE [root@Mysql-248 keepalived]# [root@Mysql-248 mysql-5.6.30]# mysql -uroot -p'qwe123``' -e 'show databases;' Warning: Using a password on the command line interface can be insecure. +--------------------+ | Database | +--------------------+ | information_schema | | cubix | | db1 | | mysql | | performance_schema | +--------------------+