簡單介紹mysql
先簡單說下MySQL主從複製與keepalived模式和MySQL共享存儲與Keepalived模式sql
MySQL共享存儲主備模式不一樣於MySQL主主複製模式,MySQL主主是利用MySQL自帶的replication複製技術實現兩臺或多臺MySQL服務器之間互爲拉取二進制日誌,處於BACKUP的服務器從MASTER獲取二進制日誌,並將日誌解析成相應的SQL語句,而後在從服務器上從新執行一遍主服務器的操做,從而保證主從數據的一致性。MySQL的複製是實時的異步複製過程,可以保持多臺數據庫之間數據的一致性,利用MySQL複製能夠實現多種方式的主從複製備份,如一主一從、一主多從、雙主、雙主多從,其優勢是顯而易見的,所以現實環境中很多的企業都使用MySQL複製技術與keepalived、heartbeat、MySQL Proxy、實現MySQL的高可用集羣架構。數據庫
固然,MySQL複製技術並不是百分百可以保證數據的完成一致性,同時因爲開啓了二進制日誌功能,多少會增長一點I/O,所以在性能上會有必定損耗。簡單的主主複製與keepalived模式,在正常狀況下兩臺機器同時提供服務,而且只容許其中一臺對外提供寫入功能,另一臺提供讀功能或只做爲備機,當主down以後當即替換爲主保證來服務的穩定不中斷運行。(固然若是配置auto_increment_offset和auto_incremen_increment參數,能夠解決主主同步寫入問題)當主故障發生後,keepalived檢測到以後將服務切換到從服務器上,在這個過程中能夠看到,keepalived的切換時間是很是迅速的,但此時必須及時修復故障的服務器並繼續加入到主從列表中才能保證服務的相對穩定性。一旦有數據異常形成主從不一樣步都會影響故障的修復效率。安全
結合MySQL系統架構的靈活性,那麼我在這裏簡單寫一篇關於《MySQL共享存儲主備模式利用Keepalived實現雙機高可用》的教程,以供你們參考。bash
本篇的MySQL共享存儲與keepalived的實現方式相似於DRBD+heartbeat模式。DRBD是一個基於軟件實現的服務器存儲鏡像塊設備複製的方案,用於實現實時的、透明的數據同步。能夠提供大多數HA系統雙機熱備的方案。因爲DRBD是基於軟件的,那麼其磁盤的性能必然不如物理磁盤。而共享存儲在實際環境中是使用比較多的存儲方案,通常是由磁盤陣列提供。如SAN、NAS存儲。所以由共享存儲提供的HA服務有不少,好比,WEB服務器使磁陣替代NFS存儲;MySQL HA的共享存儲;Oracle RAC的ASM的共享存儲。MySQL HA使用共享存儲與keepalived的模式並不能兩臺MySQL都同時提供服務,正常狀況下,只有一臺提供服務,另一臺完成處於備用的角色,結合keepalived靈活的腳本檢測功能,當主服務器down機時,keepalived能夠完成作到自動切換,保障服務的穩定運行。那麼這種狀況下更適用於對業務要求高穩定性的場景中。服務器
Keepalived的腳本檢測功能至關靈活,而且也相對簡單。Keepalived的主備角色選舉策略由state的狀態決定,例如主節點配置爲MASTER,備節點配置爲BACKUP時,當啓動keepalived集羣時,處於MASTER狀態的節點接管VIP和MySQL服務,而BACKUP狀態的節點就處於備用的節點,只有集羣發生異常時,keepalived纔會根據priority值從新選舉MASTER和BACKUP角色,priority值大的節點成爲MASTER。在這個角色切換的過程當中,若是定義了檢測腳本,而且設置了腳本的weight值,當集羣異常時,keepalived選舉MASTER角色由priority值和weight值之和決定,所以,此時priority+weight就是新的priority值,priority值大的節點被選舉爲MASTER節點,而且接管集羣當中的MySQL服務。架構
圖爲MySQL HA與Keepalived實現高可用的模型異步
那麼在這個HA環境中,要注意的一個問題是,正常狀況下只有MASTER角色的節點提供MySQL服務,而且也只有MASTER角色的節點掛載共享存儲。在keepalived啓動時,keepalived會檢測各個節點的MySQL服務,只有檢測到是正常狀態,才被加入到keepalived集羣當中(選舉爲MASTER和BACKUP),若是檢測到異常,如MySQL並未啓動,此時keepalived並不會把這個節點選舉爲BACKUP節點,而是被標識爲FAULT狀態,而當爲FAULT狀態時,若是MASTER節點down機時,keepalived並不會進行切換,那麼此時糟糕的事情是,主備就都不能用了。爲了解決這一個問題,應該在檢測腳本中自定義爲本身想要的狀態。如在腳本中定義檢測MySQL時,當這臺服務器上沒有掛載存儲,沒有VIP,也沒有運行MySQL,同時知足這三個條件時,這個節點應該也被視爲正常的節點,即BACKUP節點。當MASTER節點down時,纔會將服務轉移至BACKUP節點當中。定義了靈活的腳本以後,keepalived才能爲HA服務提供高可用性。socket
實驗環境
tcp
主機 |
IP |
系統 |
角色 |
Server1 |
192.168.6.174 |
CentOS6.8 |
MASTER |
Server2 |
192.168.6.175 |
CentOS6.8 |
BACKUP |
VIP |
192.168.6.176 |
||
共享存儲 |
/dev/sdb1 |
實驗步驟
1、MySQL安裝配置
Server1和Server2安裝MySQL,安裝版本保持一致,包括MySQL用戶UID、安裝目錄、數據文件目錄都要完成相同。
[root@Server1 ~]# id mysql uid=498(mysql) gid=500(mysql) groups=500(mysql) [root@Server1 ~]# ls /usr/local/mysql/ bin COPYING data docs include lib man mysql-test README scripts share sql-bench support-files [root@Server2 ~]# id mysql uid=498(mysql) gid=500(mysql) groups=500(mysql) [root@Server2 ~]# ls /usr/local/mysql/ bin COPYING data docs include lib man mysql-test README scripts share sql-bench support-files
只需在主節點執行安裝系統數據庫的腳本$basedir/scripts/mysql_install_db
[root@Server1 ~]# mount /dev/sdb1 /data/ [root@Server1 ~]# cd /usr/local/mysql/scripts/ [root@Server1 scripts]# ./mysql_install_db --user=mysql --data=/data/mysql/mysql --basedir=/usr/local/mysql --no-defaults
2、Keepalived安裝和配置
一、安裝keepalived (Server1和Server2節點)
[root@Server1 ~]# yum install pcre-devel openssl-devel popt-devel libnl-devel libnfnetlink libnfnetlink-devel [root@Server1 keepalived-1.3.2]# ./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-642.el6.x86_64 [root@Server1 keepalived-1.3.2]# make && make install [root@Server1 keepalived-1.3.2]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
二、配置keepalived.conf
Server1節點(MASTER)
! Configuration File for keepalived global_defs { notification_email { mail@huangming.org } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MySQL_HA_DEVEL vrrp_skip_check_adv_addr } vrrp_sync_group MySQL_HA_G1 { group { MySQL_HA_1 } } vrrp_script chk_mysql { script "/etc/keepalived/scripts/check_mysql.sh" interval 6 fall 2 rise 1 weight 20 } vrrp_script chage_status { script "/etc/keepalived/scripts/chage_status.sh" interval 20 } vrrp_instance MySQL_HA_1 { state BACKUP interface eth1 virtual_router_id 176 priority 100 advert_int 2 nopreempt authentication { auth_type PASS auth_pass v262aR1dqH5jTykUbwTo } virtual_ipaddress { 192.168.6.176/24 dev eth1 } track_script { chk_mysql chage_status } track_interface { eth1 } notify_master "/etc/keepalived/scripts/notify.sh master" notify_backup "/etc/keepalived/scripts/notify.sh backup" notify_fault "/etc/keepalived/scripts/notify.sh fault" notify_stop "/etc/keepalived/scripts/notify.sh stop" }
Server2節點(BACKUP)
! Configuration File for keepalived global_defs { notification_email { mail@huangming.org } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MySQL_HA_DEVEL vrrp_skip_check_adv_addr } vrrp_sync_group MySQL_HA_G1 { group { MySQL_HA_1 } } vrrp_script chk_mysql { script "/etc/keepalived/scripts/check_mysql.sh" interval 6 fall 2 rise 1 weight 20 } vrrp_script chage_status { script "/etc/keepalived/scripts/chage_status.sh" interval 20 } vrrp_instance MySQL_HA_1 { state BACKUP interface eth1 virtual_router_id 176 priority 90 advert_int 2 authentication { auth_type PASS auth_pass v262aR1dqH5jTykUbwTo } virtual_ipaddress { 192.168.6.176/24 dev eth1 } track_script { chk_mysql chage_status } track_interface { eth1 } notify_master "/etc/keepalived/scripts/notify.sh master" notify_backup "/etc/keepalived/scripts/notify.sh backup" notify_fault "/etc/keepalived/scripts/notify.sh fault" notify_stop "/etc/keepalived/scripts/notify.sh stop" }
三、Keepalived notify腳本
notify腳本是keepalived集羣管理腳本,當keepalived角色state狀態發生變化時都會執行這個腳本
notify_master:當節點進入MASTER時執行該腳本 notify_backup:當節點進入BACKUP時執行該腳本 notify_fault: 當節點進入FAULT時執行該腳本 notify_stop: 當節點進入STOP時執行該腳本
Server1和Server2的notify腳本定義以下:
#!/bin/bash # Author: hm Email: mail@huangming.org LOGDIR=/usr/local/keepalived/logs LOGFILE="/usr/local/keepalived/logs/notify_scripts.log" IPADDR=`ifconfig eth1 | awk -F"[: ]+" '/inet addr/{print $4}'` VIP="192.168.6.176" [ -d $LOGDIR ] || mkdir $LOGDIR #MASTER master() { if [ `df -h |grep "/dev/sdb1"|wc -l` -eq 0 ];then echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: mount /dev/sdb1 /data ..." mount /dev/sdb1 /data && sleep 1 else echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: /data is mounted on /data" fi killall -0 mysqld &>/dev/null if [ $? -ne 0 ];then echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: /etc/init.d/mysqld start..." /etc/init.d/mysqld start &>/dev/null else echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: Mysqld is Running..." fi exit 0 } #BACKUP backup() { killall -0 mysqld &>/dev/null if [ $? -eq 0 ];then echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: /etc/init.d/mysqld stop..." /etc/init.d/mysqld stop &>/dev/null else echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: Mysql Server is Not Running..." fi if [ `df -h |grep "/dev/sdb1"|wc -l` -ne 0 ];then echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: umount /data..." umount /data && sleep 1 else echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: /data is not mount" fi } notify_master() { echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: Transition to $1 STATE"; echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: Setup the VIP on eth1 for $VIP"; } notify_backup() { echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: Transition to $1 STATE"; echo "`date '+%b %d %T %a'` $HOSTNAME [keepalived_notify_script]: removing the VIP on eth1 for $VIP"; } case $1 in master) notify_master MASTER >>$LOGFILE master >>$LOGFILE exit 0 ;; backup) notify_backup BACKUP >>$LOGFILE backup >>$LOGFILE exit 0 ;; fault) notify_backup FAULT >>$LOGFILE backup >>$LOGFILE exit 0 ;; stop) notify_backup STOP >>$LOGFILE backup >>$LOGFILE #/etc/init.d/keepalived restart &>/dev/null #這一項僅在Server2節點上配置 exit 0 ;; *) echo "Usage: `basename $0` {master|backup|fault|stop}" exit 1 ;; esac
四、keepalived資源檢測腳本
MySQL服務檢測腳本check_mysql.sh
#!/bin/bash # 檢測共享磁盤是否正常掛載,若是沒有掛載,則腳本返回狀態碼1 if [ `df -h |grep "/dev/sdb1"|wc -l` -eq 0 ];then exit 1 #檢測MySQL服務是否正常運行,若是不正常,則返回狀態碼1 elif ! killall -0 mysqld &>/dev/null;then exit 1 else exit 0 Fi # 若是共享磁盤和MySQL服務都正常,那麼就返回0,進入keepalived集羣的MASTER或BAKUP角色
MySQL更改狀態腳本chage_status.sh(MASTER)
#!/bin/bash # in MASTER #改變MySQL服務的檢測腳本,keepalived剛啓動時,Server1節點接管MySQL服務,成爲MASTER,該節 #點的檢測mysql服務腳本爲正常檢測,即當共享磁盤和MySQL服務均正常,則正常返回狀態碼0; #而Server2節點,在啓動keepalived時,檢測腳本則改成當共享磁盤和MySQL服務均沒有運行時, #一樣返回狀態碼0,所以進入BACKUP角色。改變檢測腳本的前提條件爲是否存在VIP,當Server2節點 #同時知足這三個條件纔會改變腳本的檢測狀態 CHK_VIP=`ip addr| awk -F"[ :]+" '/192.168.6.176/{print $3}'` if [ "$CHK_VIP" == "" ];then cat > /etc/keepalived/scripts/check_mysql.sh << EOF #!/bin/bash if [ \`df -h |grep "/dev/sdb1"|wc -l\` -eq 0 ];then exit 0 elif ! killall -0 mysqld &>/dev/null;then exit 0 else exit 0 fi EOF else cat > /etc/keepalived/scripts/check_mysql.sh << EOF #!/bin/bash if [ \`df -h |grep "/dev/sdb1"|wc -l\` -eq 0 ];then exit 1 elif ! killall -0 mysqld &>/dev/null;then exit 1 else exit 0 fi EOF Fi
MySQL更改狀態腳本chage_status.sh(BACKUP)
#!/bin/bash # in BACKUP CHK_VIP=`ip addr| awk -F"[ :]+" '/192.168.6.176/{print $3}'` if [ "$CHK_VIP" == "" ];then cat > /etc/keepalived/scripts/check_mysql.sh << EOF #!/bin/bash if [ \`df -h |grep "/dev/sdb1"|wc -l\` -eq 0 ];then exit 0 elif ! killall -0 mysqld &>/dev/null;then exit 0 else exit 0 fi EOF else cat > /etc/keepalived/scripts/check_mysql.sh << EOF #!/bin/bash if [ \`df -h |grep "/dev/sdb1"|wc -l\` -eq 0 ];then exit 1 elif ! killall -0 mysqld &>/dev/null;then pkill keepalived && exit 1 else exit 0 fi EOF fi
五、啓動並測試keepalived集羣資源轉換功能
啓動Server1的keepalived服務,查看keepalived的日誌
Jan 22 16:14:36 Server1 Keepalived[21561]: Opening file '/etc/keepalived/keepalived.conf'. Jan 22 16:14:36 Server1 Keepalived[21562]: Starting Healthcheck child process, pid=21563 Jan 22 16:14:36 Server1 Keepalived[21562]: Starting VRRP child process, pid=21564 Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP 10.17.83.174 added Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP 192.168.6.174 added Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP fe80::250:56ff:feb5:725f added Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP fe80::250:56ff:feb5:5a15 added Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Registering Kernel netlink reflector Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Registering Kernel netlink command channel Jan 22 16:14:36 Server1 Keepalived_healthcheckers[21563]: Opening file '/etc/keepalived/keepalived.conf'. Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Netlink reflector reports IP 10.17.83.174 added Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Netlink reflector reports IP 192.168.6.174 added Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Netlink reflector reports IP fe80::250:56ff:feb5:725f added Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Netlink reflector reports IP fe80::250:56ff:feb5:5a15 added Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Registering Kernel netlink reflector Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Registering Kernel netlink command channel Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Registering gratuitous ARP shared channel Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Opening file '/etc/keepalived/keepalived.conf'. Jan 22 16:14:36 Server1 Keepalived_vrrp[21564]: Truncating auth_pass to 8 characters Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) removing protocol VIPs. Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: SECURITY VIOLATION - scripts are being executed but script_security not enabled. Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: Sync group MySQL_HA_G1 has only 1 virtual router(s) - removing Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: Using LinkWatch kernel netlink reflector... Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Entering BACKUP STATE Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)] Jan 22 16:14:51 Server1 Keepalived_healthcheckers[21563]: Using LinkWatch kernel netlink reflector... Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: pid 21567 exited with status 1 Jan 22 16:14:51 Server1 Keepalived_vrrp[21564]: VRRP_Script(chage_status) succeeded Jan 22 16:14:57 Server1 Keepalived_vrrp[21564]: VRRP_Script(chk_mysql) succeeded Jan 22 16:14:58 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Transition to MASTER STATE Jan 22 16:14:59 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Changing effective priority from 100 to 120 Jan 22 16:15:00 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Entering MASTER STATE Jan 22 16:15:00 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) setting protocol VIPs. Jan 22 16:15:00 Server1 Keepalived_vrrp[21564]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:15:00 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP 192.168.6.176 added Jan 22 16:15:00 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Sending/queueing gratuitous ARPs on eth1 for 192.168.6.176 Jan 22 16:15:00 Server1 Keepalived_vrrp[21564]: Sending gratuitous ARP on eth1 for 192.168.6.176
而後再啓動Server2的keepalived服務,查看keepalived日誌
Jan 22 16:14:57 localhost Keepalived[26882]: Opening file '/etc/keepalived/keepalived.conf'. Jan 22 16:14:57 localhost Keepalived[26882]: daemon is already running Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) removing protocol VIPs. Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: SECURITY VIOLATION - scripts are being executed but script_security not enabled. Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: Sync group MySQL_HA_G1 has only 1 virtual router(s) - removing Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: Using LinkWatch kernel netlink reflector... Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Entering BACKUP STATE Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)] Jan 22 16:15:01 localhost Keepalived_healthcheckers[26874]: Using LinkWatch kernel netlink reflector... Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: VRRP_Script(chage_status) succeeded Jan 22 16:15:01 localhost Keepalived_vrrp[26875]: pid 26885 exited with status 1 Jan 22 16:15:07 localhost Keepalived_vrrp[26875]: VRRP_Script(chk_mysql) succeeded Jan 22 16:15:09 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Changing effective priority from 90 to 110
由日誌能夠看出,Server1正常進入了MASTER角色,同時掛載共享磁盤,啓動MySQL服務,而Server2根據check_mysql.sh檢測腳本返回的狀態,正常進入BACKUP角色。
查看Server1的資源服務狀態
# 共享存儲 [root@Server1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot /dev/sdb1 ext4 50G 263M 47G 1% /data #VIP [root@Server1 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.174/24 brd 192.168.6.255 scope global eth1 inet 192.168.6.176/24 scope global secondary eth1 #MySQL服務 [root@Server1 ~]# ps -ef | grep mysql root 21628 1 0 16:15 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql --pid-file=/data/mysql/mysql/Server1.pid mysql 21832 21628 0 16:15 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql/Server1.err --pid-file=/data/mysql/mysql/Server1.pid --socket=/tmp/mysql.sock --port=3306 root 22554 25788 0 16:22 pts/1 00:00:00 grep mysql [root@Server1 ~]# ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:10050 *:* LISTEN 0 80 :::3306 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 *:22 *:* LISTEN 0 100 ::1:25 :::* LISTEN 0 100 127.0.0.1:25 *:*
查看Server2的資源和服務狀態
# 是否掛載了存儲 [root@Server2 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot #是否有VIP [root@Server2 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.175/24 brd 192.168.6.255 scope global eth1 #是否有MySQL服務 [root@Server2 ~]# ps -ef | grep mysql root 27652 1807 0 16:24 pts/1 00:00:00 grep mysql [root@Server2 ~]# netstat -ntl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:25 :::* LISTEN
3、測試keepalived自動轉移MySQL服務
一、Server1上中止MySQL服務,查看Server2是否接管MySQL服務
查看Server1的keepalived日誌
Jan 22 16:29:58 Server1 Keepalived_vrrp[21564]: VRRP_Script(chk_mysql) failed Jan 22 16:29:58 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Changing effective priority from 120 to 100 Jan 22 16:29:58 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Received advert with higher priority 110, ours 100 Jan 22 16:29:58 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Entering BACKUP STATE Jan 22 16:29:58 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) removing protocol VIPs. Jan 22 16:29:58 Server1 Keepalived_healthcheckers[21563]: Netlink reflector reports IP 192.168.6.176 removed Jan 22 16:30:04 Server1 Keepalived_vrrp[21564]: pid 23227 exited with status 1 Jan 22 16:30:10 Server1 Keepalived_vrrp[21564]: pid 23233 exited with status 1 Jan 22 16:30:16 Server1 Keepalived_vrrp[21564]: VRRP_Script(chk_mysql) succeeded Jan 22 16:30:16 Server1 Keepalived_vrrp[21564]: VRRP_Instance(MySQL_HA_1) Changing effective priority from 100 to 120
查看Server2的keepalived日誌
Jan 22 16:15:09 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Changing effective priority from 90 to 110 Jan 22 16:17:01 localhost Keepalived_vrrp[26875]: pid 27059 exited with status 126 Jan 22 16:29:57 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) forcing a new MASTER election Jan 22 16:29:59 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Transition to MASTER STATE Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Entering MASTER STATE Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) setting protocol VIPs. Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost Keepalived_healthcheckers[26874]: Netlink reflector reports IP 192.168.6.176 added Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Sending/queueing gratuitous ARPs on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:01 localhost kernel: EXT4-fs (sdb1): warning: mounting fs with errors, running e2fsck is recommended Jan 22 16:30:01 localhost kernel: EXT4-fs (sdb1): mounted filesystem with ordered data mode. Opts: Jan 22 16:30:06 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176 Jan 22 16:30:06 localhost Keepalived_vrrp[26875]: VRRP_Instance(MySQL_HA_1) Sending/queueing gratuitous ARPs on eth1 for 192.168.6.176 Jan 22 16:30:06 localhost Keepalived_vrrp[26875]: Sending gratuitous ARP on eth1 for 192.168.6.176
二、查看Server2是否正常接管MySQL服務
Server2
[root@Server2 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot /dev/sdb1 ext4 50G 263M 47G 1% /data [root@Server2 ~]# ip a | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.175/24 brd 192.168.6.255 scope global eth1 inet 192.168.6.176/24 scope global secondary eth1 [root@Server2 ~]# ps -ef | grep mysql root 28124 1 0 16:30 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql --pid-file=/data/mysql/mysql/Server2.pid mysql 28327 28124 0 16:30 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql/Server2.err --pid-file=/data/mysql/mysql/Server2.pid --socket=/tmp/mysql.sock --port=3306 root 28685 1807 0 16:33 pts/1 00:00:00 grep mysql
Server1
[root@Server1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot [root@Server1 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.174/24 brd 192.168.6.255 scope global eth1 [root@Server1 ~]# ps -ef | grep mysql root 23617 25788 0 16:34 pts/1 00:00:00 grep mysql
三、再測試Server2異常時,是否將服務轉移至Server1上
[root@Server2 ~]# /etc/init.d/mysqld stop Shutting down MySQL.. SUCCESS!
Server1
[root@Server1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot /dev/sdb1 ext4 50G 263M 47G 1% /data [root@Server1 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.174/24 brd 192.168.6.255 scope global eth1 inet 192.168.6.176/24 scope global secondary eth1 [root@Server1 ~]# ps -ef | grep mysql root 23845 1 0 16:37 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql --pid-file=/data/mysql/mysql/Server1.pid mysql 24048 23845 0 16:37 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql/Server1.err --pid-file=/data/mysql/mysql/Server1.pid --socket=/tmp/mysql.sock --port=3306 root 24144 25788 0 16:38 pts/1 00:00:00 grep mysql
Server2
[root@Server2 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot [root@Server2 ~]# ip a | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.175/24 brd 192.168.6.255 scope global eth1 [root@Server2 ~]# ps -ef | grep mysql root 29219 1807 0 16:38 pts/1 00:00:00 grep mysql
四、測試當Server1網卡掉線時,keepalived是否自動轉移
Server1,中止eth1網卡
[root@Server1 ~]# ifconfig eth1 down [root@Server1 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:50:56:B5:72:5F inet addr:10.17.83.174 Bcast:10.17.83.255 Mask:255.255.252.0 inet6 addr: fe80::250:56ff:feb5:725f/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:12403837 errors:0 dropped:0 overruns:0 frame:0 TX packets:915130 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:918776939 (876.2 MiB) TX bytes:58055577 (55.3 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:14 errors:0 dropped:0 overruns:0 frame:0 TX packets:14 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:956 (956.0 b) TX bytes:956 (956.0 b)
中止網卡後,Keepalived移除Server1的資源,從新選舉MASTER角色,並將資源切換到Server2節點
[root@Server1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot [root@Server1 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000 inet 192.168.6.174/24 brd 192.168.6.255 scope global eth1 [root@Server1 ~]# ps -ef | grep mysql root 24553 25788 0 16:42 pts/1 00:00:00 grep mysql
Server2
[root@Server2 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot /dev/sdb1 ext4 50G 263M 47G 1% /data [root@Server2 ~]# ip a | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.175/24 brd 192.168.6.255 scope global eth1 inet 192.168.6.176/24 scope global secondary eth1 [root@Server2 ~]# ps -ef | grep mysql root 29425 1 0 16:40 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql --pid-file=/data/mysql/mysql/Server2.pid mysql 29628 29425 0 16:40 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql/Server2.err --pid-file=/data/mysql/mysql/Server2.pid --socket=/tmp/mysql.sock --port=3306 root 29839 1807 0 16:43 pts/1 00:00:00 grep mysql
五、一樣能夠測試keepalived服務自動down掉時是否發生轉移
Server2
[root@Server2 ~]# /etc/init.d/keepalived stop Stopping keepalived: [ OK ] [root@Server2 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot [root@Server2 ~]# ip a | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.175/24 brd 192.168.6.255 scope global eth1
Server1
[root@Server1 ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 47G 2.5G 43G 6% / tmpfs tmpfs 939M 0 939M 0% /dev/shm /dev/sda1 ext4 190M 35M 145M 20% /boot /dev/sdb1 ext4 50G 263M 47G 1% /data [root@Server1 ~]# ip addr | grep eth1 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 inet 192.168.6.174/24 brd 192.168.6.255 scope global eth1 inet 192.168.6.176/24 scope global secondary eth1 [root@Server1 ~]# ps -ef | grep mysql root 24912 1 0 16:46 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/mysql --pid-file=/data/mysql/mysql/Server1.pid mysql 25115 24912 0 16:46 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql/Server1.err --pid-file=/data/mysql/mysql/Server1.pid --socket=/tmp/mysql.sock --port=3306 root 25204 25788 0 16:46 pts/1 00:00:00 grep mysql
總結
MySQL共享存儲與Keepalived模式、MySQL複製與Keepalived模式,這兩種方式各有各自的優缺點。對於簡單的HA集羣,都能實現其高可用。本篇只是簡單介紹前者的實現方式,而且結合keeplived靈活的腳本定製,能夠實現MySQL HA全自動切換,提升MySQL HA高可用的穩定性。那麼使用共享存儲的缺點也顯而易見,就是存儲單點了,若是共享存儲數據的被損壞,那麼整個HA也就都不可用了。所以,要提升安全性,最好按期備份數據庫,避免數據丟失。