10.0.0.7 lemon
10.0.0.8 lemon2
10.0.0.9 lemon3
程序代碼里只需寫一個VIP連接數據庫即可,后面是連接在哪一台通過,keepalived的在服務端實現;通過檢測腳本哪一台是master就把VIP飄在哪一台上
一、Mysql的組復制集群
參考前面博文
二、安裝keepalived
wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz tar -zxvf keepalived-1.2.24.tar.gz cd keepalived-1.2.24 ./configure --prefix=/usr/local/keepalived make && make install
三、添加對應的配置文件
mkdir /etc/keepalived cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
四、修改keepalived配置文件
在這里,有幾台mysql,就得在這些mysql上都裝上keepalived ;
vim /etc/keepalived/keepalived.conf 把原來的全部刪除,直接用這個就行
! Configuration File for keepalived #指定mysql服務檢測腳本 vrrp_script chk_mysql_port { script "/root/chk_mysql.sh" #腳本路徑 interval 2 #腳本檢測頻率 weight -5 #腳本執行成功與否,權重怎么計算 fall 2 #如果連續兩次檢測失敗,認為節點服務不可用 rise 1 #如果連續2次檢查成功則認為節點正常 } vrrp_script chk_mysql_master { script "/root/chk_mysql2.sh" interval 2 weight 10 } vrrp_instance VI_1 { state MASTER interface eth0 #節點IP的網卡 virtual_router_id 88 #同一個instance相同 priority 100 # 優先級,數值越大,優先級越高 advert_int 1 authentication { #節點間的認證,所有的必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #VIP,自定的,我覺得和外網的IP要一個網段 192.168.2.28 } track_script { #指定前面腳本的名字 chk_mysql_port chk_mysql_master } }
三台機器的不同點就是:
lemon: priority 100
lemon2: priority 98
lemon3: priority 96
這三個值不要相差太大,最好自己模擬一下算一下,看各種情況下是否是按照自己的預期得到權重;如果相差太大,weight值也比較小的時候,可能會導致備機的權重比主機的大
原理:
當通過chk_mysql.sh腳本檢測mysql服務是否存在,如果執行了改變權重
通過/root/chk_mysql2.sh腳本檢測本機是否是master機,是的話,改變權重
整體來說就是通過改變機器的權重來把VIP飄在權重最大的機器上的;我們要做的就是通過腳本判斷是否執行,使得master的權重最高;這里的權限一定得控制好;
權重策略是:
當weight > 0時:腳本執行成功了 Priority+Weight 執行失敗 Priority
當weight < 0時:腳本執行成功了 Priority 執行失敗 Priority+Weight
每執行一次他的權重是重新開大會算的,並不是接着上一次的來
五、兩個mysql檢測腳本(三台機器上都要有)
1:檢測mysql服務是否存在 chk_mysql.sh
#!/bin/bash nc -z 127.0.0.1 3306 |grep succeeded a=`echo $?` echo 1 > /tmp/ll if [ $a -eq 1 ] ;then service keepalived stop fi
注:這里的nc命令得先在自己的機器上安裝,yum -y install nc ;稍不注意沒安裝的話,后面測試的時候總不對,因為這個腳本總是返回錯,就會到這priority與weight值不對
2:檢測自己是不是master
#!/bin/bash host=`/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'` host2=`hostname` if [ $host == $host2 ] ;then exit 0 else exit 1 fi
注:第一句是判斷mysql組復制的master的hostname是什么,然后獲取自己的master,看master是不是自己,如果是的話,返回0,返回0表示腳本執行成功了,則與配置文件里對應,weight+10;如果不是,返回1,表示腳本沒有執行成功,weight不變;
/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')"
通過不需要直接登錄進去打印出哪一台是主,這個是讀操作,因此在所有機器上都能執行
在上面的基礎上把hostname過濾出來與本機的hostname做對比(hostname也可以改成IP,但是考慮到可能一台機器有多個IP,不好判斷),這樣就知道自己是不是主,是的話就使優先級增加,這樣keepalived的vip就會綁定到這台機器上,就能進行讀寫操作了
/usr/local/mysql/bin/mysql -h127.0.0.1 -uroot -p123456 -e "SELECT * FROM performance_schema.replication_group_members WHERE MEMBER_ID = (SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member')" |awk 'NR==2{print}'|awk -F" " '{print $3}'
這里還有一個重要的點是判斷的時候,不能用echo去表示結果,因為echo總會執行,這樣的話,不管是不是都會返回0,就會導致結果有問題
腳本里也可以把發送郵件加進去,這樣每次切換的時候就知道
六、啟動keepalived
1)service keepalived start ;啟動完成后,看是否啟動成功,ps -ef 和查看日志
keepalived的日志默認在
/var/log/messages下,這里看到報錯了
報這個錯是因為:該平台的Virtual_router_id與其它平台的Virtual_router_id重復,把配置文件里的
virtual_router_id 88這個改一下,重啟后,看日志如下:
這就表明啟動成功了。
七、測試
1)首先通過mysql查看哪一台是mysql的master
這里可以看到是lemon機器,然后在主機名為lemon的這台機器上查看VIP是否在這台機器上綁定ip -a
2)查看VIP
注:查看是否綁定IP
ip a命令 用
ifconfig查看不到這里糾結了一下午,怎么改都看不到
這里可以看到VIP是綁定成功的
3)測試,把lemon這台機器的mysql停掉
然后通過這兩台機器可以看mysql組復制的master在那台機器上,這里可以看到是lemon3上
然后去看,VIP是否綁定在lemon3那台機器上
4)通過VIP訪問mysql,看是否能連接成功,並寫入
在三台機器上都要添加權限
grant all on *.* to root@'%' identified by "1234567"; flush privileges;
然后通過VIP可以連接上,並能寫入數據:
把原來的lemon上的mysql啟動,把master3的mysql停掉,繼續通過VIP連接mysql看能不能寫入和查看
報錯了;說只有讀權限;一看VIP綁定到lemon2去了,但是查看數據庫的master是lemon
這是為什么呢,還以為是權限的問題呢;不是,是開始的時候lemon的mysql停掉了,就執行了把keepalived停掉的腳本,剛剛沒有把keepalived開啟,所以keepalived的VIP飄到另外一台去了
當一台mysql掛掉,找到問題解決好,一定要做的操作有:
1)啟動mysql
/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
2)打開組復制
set global group_replication_allow_local_disjoint_gtids_join=ON;
start group_replication;
3)啟動keepalived
service keepalived restart
注:
測試的時候這里的腳本有可能不執行,這里經過排查是因為
配置文件大括號前一定要有一個空格,加上重啟后就執行了
