參考:http://www.javashuo.com/article/p-calmawvn-k.htmlhtml
MySQL雙主複製 + keepalived 能夠實現數據高可用。雙主即互爲master-slave,其中任意一個改變,另一個會跟着改變(與主從不一樣,主從是單向);能夠實現數據庫服務器的熱備,可是一個Master宕機後不能實現動態切換。使用Keepalived,能夠經過虛擬IP,實現雙主對外的統一接口以及自動檢查、失敗切換機制,從而實現MySQL數據庫的高可用方案。mysql
1、雙主配置linux
一、服務器規劃sql
master1:192.168.116.128數據庫
master2:192.168.116.130vim
vip:192.168.116.129bash
二、mysql 配置服務器
(1) master1(192.168.116.128) mysql服務器配置ide
進入mysql配置文件:測試
cd /etc/my.cnf
log-bin=mysql-bin
binlog_format=mixed
server-id=128
auto-increment-increment=2
auto-increment-offset=1
log-slave-updates
sync-binlog=1
黑色的是以前主從複製配置信息,紅色的是主主配置須要新增的配置信息。
(2) master2(192.168.116.130) mysql服務器配置
進入mysql配置文件:
cd /etc/my.cnf
log-bin=mysql-bin
binlog_format=mixed
server-id=130
auto-increment-increment=2
auto-increment-offset=2
log-slave-updates
sync-binlog=1
黑色的是以前主從複製配置信息,紅色的是主主配置須要新增的配置信息。
(3) master1,master2 分別建立複製帳號
master1 執行下列語句:
grant replication slave on *.* to 'latiny130'@'192.168.116.130' identified by '123456';
建立的帳號是給做爲從服務器master2使用
master2 執行下列語句:
grant replication slave on *.* to 'latiny128'@'192.168.116.128' identified by '123456';
建立的帳號是給做爲從服務器master1使用
(4) 登陸到命令行分別查看master1,master2做爲主數據庫的狀態
master1
File爲mysql-bin.000001,Position爲154纔是初始狀態,若是不是這兩個值,最好重置一下,輸入reset master便可。
master2
change master to master_host='192.168.116.130',master_user='latiny130',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
啓動master1的slave線程
start slave;
change master to master_host='192.168.116.128',master_user='latiny128',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
啓動master2的slave線程
start slave;
[root@master1 ~]# yum install -y openssl-devel [root@master1 ~]# cd /usr/local/src/ [root@master1 src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz [root@master1 src]# tar -zvxf keepalived-1.3.5.tar.gz [root@master1 src]# cd keepalived-1.3.5 [root@master1 keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived [root@master1 keepalived-1.3.5]# make && make install [root@master1 keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ [root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@master1 keepalived-1.3.5]# mkdir /etc/keepalived/ [root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@master1 keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@master1 keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
bal_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } #檢測mysql服務是否在運行。有不少方式,好比進程,用腳本檢測等等 vrrp_script chk_mysql_port { #這裏經過腳本監測 script "/opt/chk_mysql.sh" #腳本執行間隔,每2s檢測一次 interval 2 #腳本結果致使的優先級變動,檢測失敗(腳本返回非0)則優先級 -5 weight -5 #檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) fall 2 #檢測1次成功就算成功。但不修改優先級 rise 1 } vrrp_instance VI_1 { state MASTER #指定虛擬ip的網卡接口 interface eth0 mcast_src_ip 192.168.116.128 #路由器標識,MASTER和BACKUP必須是一致的 virtual_router_id 51 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP priority 101 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.116.129 } track_script { chk_mysql_port } }
編寫切換腳本 vim /opt/chk_mysql.sh
MYSQL=/usr/bin/mysql MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD=123456 CHECK_TIME=3 #mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0 MYSQL_OK=1 function check_mysql_helth (){ $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1 if [ $? = 0 ] ;then MYSQL_OK=1 else MYSQL_OK=0 fi return $MYSQL_OK } while [ $CHECK_TIME -ne 0 ] do let "CHECK_TIME -= 1" check_mysql_helth if [ $MYSQL_OK = 1 ] ; then CHECK_TIME=0 exit 0 fi if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ] then pkill keepalived exit 1 fi sleep 1 done
對腳本受權:chmod 755 /opt/chk_mysql.sh
啓動keepalived:/etc/init.d/keepalived start
bal_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { script "/opt/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface eth0 mcast_src_ip 191.168.116.130 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.116.129 } track_script { chk_mysql_port } }
編寫切換腳本 vim /opt/chk_mysql.sh
MYSQL=/usr/bin/mysql MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD=123456 CHECK_TIME=3 #mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0 MYSQL_OK=1 function check_mysql_helth (){ $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1 if [ $? = 0 ] ;then MYSQL_OK=1 else MYSQL_OK=0 fi return $MYSQL_OK } while [ $CHECK_TIME -ne 0 ] do let "CHECK_TIME -= 1" check_mysql_helth if [ $MYSQL_OK = 1 ] ; then CHECK_TIME=0 exit 0 fi if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ] then pkill keepalived exit 1 fi sleep 1 done
對腳本受權:chmod 755 /opt/chk_mysql.sh
啓動keepalived:/etc/init.d/keepalived start
四、兩臺服務器受權容許root用戶或者其用戶(chk_mysql.sh裏配置的),用戶在客戶端登陸測試
登陸命令行:grant all on *.* to root@
'192.168.116.129'
identified by
"123456"
;
千萬注意:
nopreempt這個參數只能用於state爲backup的狀況,因此在配置的時候要把master和backup的state都設置成backup,這樣纔會實現keepalived的非搶佔模式!
也就是說:(1) 當state狀態一個爲master,一個爲backup的時候,加不加nopreempt這個參數都是同樣的效果。即都是根據priority優先級來決定誰搶佔vip資源的,是搶佔模式!(2) 當state狀態都設置成backup,若是不配置nopreempt參數,那麼也是看priority優先級決定誰搶佔vip資源,即也是搶佔模式。(3) 當state狀態都設置成backup,若是配置nopreempt參數,那麼就不會去考慮priority優先級了,是非搶佔模式!即只有vip當前所在機器發生故障,另外一臺機器才能接管vip。即便優先級高的那一臺機器恢復 後也不會主動搶回vip,只能等到對方發生故障,纔會將vip切回來。