Mysql5.6.29雙主復(fù)制+Keepalived實(shí)現(xiàn)高可用服務(wù)
1.準(zhǔn)備工作
1、節(jié)點(diǎn)主機(jī)系統(tǒng):Linux操作系統(tǒng),Centos6.5(64位)
2、高可用集群軟件:Keepalived
3、Service:mysql
4、Mysql版本:5.6.29
? ? ?Keepalived版本:1.2.13
(2)主機(jī)/IP劃分
1、兩臺(tái)節(jié)點(diǎn)主機(jī)node1,node2:
Node1: IP:192.168.1.128 host name:node1;
Node2: IP:192.168.1.129 host name:node2;
VIP: 192.168.1.140
MYSQL服務(wù)器A,對(duì)于Keepalived來(lái)說(shuō)則是MASTER機(jī),首先托管著虛擬IP。
MYSQL服務(wù)器B,對(duì)于Keepalived來(lái)說(shuō)則是BACKUP機(jī),當(dāng)MASTER機(jī)出故障時(shí),將接管VIP,接替MASTER機(jī)繼續(xù)為外部提供服務(wù),直到MASTER機(jī)恢復(fù)。
2.MYSQL雙主復(fù)制配置
如果有正在寫(xiě)數(shù)據(jù),先通過(guò)“flush tables with read lock;”命令讓表只讀,手工備份完后,再“unlock
tables;”。
2.1配置賬號(hào)和權(quán)限
在主機(jī)(MASTER)和備機(jī)BUCKUP)上,分別創(chuàng)建Mysql數(shù)據(jù)庫(kù)賬號(hào)“rep1”,密碼為“123”。
創(chuàng)建語(yǔ)句如下:
create user 'rep1'@'%' identified by '123';
通過(guò)如下SQL語(yǔ)句,授予賬號(hào)“rep1”可用于復(fù)制的權(quán)限
grant replication slave on *.* to 'rep1'@'%' identified by '123';
“rep1” 是賬號(hào),“%”(可以指定具體IP)表示任意主機(jī)均可通過(guò)賬號(hào)“rep1”復(fù)制數(shù)據(jù),密碼為“123”。執(zhí)行“GRANT”語(yǔ)句后,再執(zhí)行“flush privileges;”使授權(quán)生效。
2.2配置MASTER
分別對(duì)兩臺(tái)主機(jī)的Mysql配置文件進(jìn)行修改,Msql配置文件一般為“my.cnf”(通過(guò)“./mysql
--help | grep my.cnf”命令找到首選配置文件,這里是“/usr/local/mysql/my.cnf”),對(duì)my.cnf文件加入(或放開(kāi))下面的語(yǔ)句,即可開(kāi)啟復(fù)制功能(通過(guò)二進(jìn)制日志復(fù)制)。兩臺(tái)主機(jī)開(kāi)啟binlog后,均變成MASTER機(jī)(即雙主,但如果只一臺(tái)開(kāi)啟binlog,則為主從),彼此都會(huì)向?qū)Ψ酵扑投M(jìn)制日志。
具體內(nèi)容如下:
server_id = 1#另一臺(tái)此處設(shè)置為2(兩臺(tái)必須不同)
log-bin = binlog ?#開(kāi)啟binlog功能
log-bin-index = binlog.index
2.3配置SLAVE
雙主復(fù)制下,兩臺(tái)主機(jī)彼此均向?qū)Ψ酵扑腿罩荆瑫r(shí)也從對(duì)方哪里接受日志。當(dāng)它推送日志時(shí),它就
是MASTER機(jī),當(dāng)它接受數(shù)據(jù)時(shí),它則變成SLAVE機(jī)。
(1)配置主機(jī)A的SLAVE功能
當(dāng)主機(jī)A變成SLAVE機(jī)時(shí),它將從主機(jī)B(MASTER)那里復(fù)制日志。
u獲取MASTER(主機(jī)B)的二進(jìn)制日志文件名稱和起始復(fù)制位置
在主機(jī)B的Mysql中,執(zhí)行“show master status;”命令,查看二進(jìn)制日志文件名稱和起始復(fù)制位置。
u配置主機(jī)A的MASTER信息
SQL語(yǔ)句如下:
change master tomaster_host='192.168.1.129',master_port=3306, master_user='rep1', master_password='123', master_log_file='binlog.000004', master_log_pos=557;
語(yǔ)句說(shuō)明:
master_host:MASTER Mysql的IP
master_port:MASTER Mysql的端口
master_user:MASTER Mysql用于復(fù)制的賬號(hào)
master_password:MASTER Mysql用于復(fù)制的賬號(hào)對(duì)應(yīng)的密碼
master_log_file:MASTER Mysql二進(jìn)制文件名稱
master_log_pos:MASTER Mysql二進(jìn)制文件開(kāi)始復(fù)制的起始位置
u啟動(dòng)主機(jī)A的SLAVE功能
start slave;
開(kāi)啟后,主機(jī)A作為SLAVE接受MASTER(主機(jī)B)推送過(guò)來(lái)的二進(jìn)制日志)
u查看復(fù)制狀態(tài)
show slave status \G;
show processlist \G;
(2)配置主機(jī)B的SLAVE功能
當(dāng)主機(jī)B變成SLAVE機(jī)時(shí),它將從主機(jī)A(MASTER)那里復(fù)制日志。
u獲取MASTER(主機(jī)A)的二進(jìn)制日志文件名稱和復(fù)制的起始位置
在主機(jī)A的Mysql中,執(zhí)行“show master status;”命令,查看二進(jìn)制日志文件名稱和復(fù)制的起始位置。
u配置主機(jī)B的MASTER信息
change master tomaster_host='192.168.1.128',master_port=3306, master_user='rep1', master_password='123', master_log_file='binlog.000001', master_log_pos=120;
u啟動(dòng)主機(jī)B的SLAVE功能
start slave;
開(kāi)啟后,主機(jī)B作為SLAVE接受主機(jī)A(MASTER)推送過(guò)來(lái)的二進(jìn)制日志
u查看復(fù)制狀態(tài)(“\G”表示每列一行輸出)
show slave status \G;
show processlist \G;
3.雙主復(fù)制測(cè)試
(1)在主機(jī)A(192.168.1.128)的test庫(kù)中創(chuàng)建表“repl_test”
在主機(jī)B的test庫(kù)中查詢 “repl_test” 表
從結(jié)果中可以看到,在主機(jī)A創(chuàng)建的表“repl_test”結(jié)構(gòu)已經(jīng)成功復(fù)制到主機(jī)B的MYSQL庫(kù)中。
(2)在主機(jī)B(192.168.1.129)中,對(duì)test庫(kù)repl_test表插入數(shù)據(jù)。見(jiàn)下圖。
回到主機(jī)A(192.168.1.128),查看test數(shù)據(jù)庫(kù)repl_test表,可以看在主機(jī)B(192.168.1.129)中插入的數(shù)據(jù)“from192.168.1.129”成功復(fù)制到主機(jī)A(192.168.1.128)MYSQL數(shù)據(jù)庫(kù)中了。見(jiàn)下圖。
4.高可用配置
高可用配置,主要是配置Keepalived,利用Keepalived設(shè)置虛擬IP,并在MASTER機(jī)與BACKUP機(jī)之間
進(jìn)行心跳檢測(cè),當(dāng)MASTER機(jī)出故障時(shí),BACKUP機(jī)立即無(wú)縫地接管虛擬IP,接替MASTER機(jī)職責(zé)繼續(xù)為外部提供服務(wù),直到MASTER機(jī)恢復(fù)。
4.1Keepalived配置
首先在兩臺(tái)主機(jī)上分別安裝Keepalived,然后分別修改keepalived.conf文件,內(nèi)容如下:
! Configuration File for keepalived
#全局配置
global_defs {
notification_email {
xxx@xxx.com
}
notification_email_from xxx@xxx.com
smtp_server xxx.com
smtp_connect_timeout 30
router_id 1688
}
#VRRP監(jiān)控腳本定義
vrrp_script MONITOR_MYSQL {
script "/usr/local/mysql/monitor/monitor.sh"#腳本路徑
interval 2#監(jiān)控腳本執(zhí)行頻率(秒)
weight 2
}
#VRRP實(shí)例
vrrp_instance KEEPALIVED_MYSQL_1 {
state MASTER
interface eth0
virtual_router_id 51#此處,MASTER與BACKUP一致
priority 100#BACKUP配置的值比MASTER小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#VRRP監(jiān)控腳本使用
track_script {
MONITOR_MYSQL
}
#虛擬IP配置
virtual_ipaddress {
192.168.119.140
}
}
4.2編寫(xiě)Mysql服務(wù)器進(jìn)程檢測(cè)腳本
Keepalived心跳檢測(cè)主要檢測(cè)主機(jī)是否可以訪問(wèn),如果檢測(cè)到托管VIP的主機(jī)不可以訪問(wèn)(keepalived
進(jìn)程沒(méi)有在運(yùn)行),它會(huì)立即將VIP轉(zhuǎn)移到有效的BACKUP機(jī)上。但對(duì)于我們業(yè)務(wù)來(lái)說(shuō)(MYSQL數(shù)據(jù)庫(kù)讀寫(xiě)),除了主機(jī)固然必須處在運(yùn)行狀態(tài)外,MYSQL數(shù)據(jù)庫(kù)本身也必須正常運(yùn)行,否則數(shù)據(jù)庫(kù)無(wú)法讀寫(xiě),服務(wù)將不可用。所有我們就要編寫(xiě)一個(gè)腳本(命名為monitor.sh,配置到keepalived.conf中,keepalived會(huì)根據(jù)設(shè)定的頻率進(jìn)行調(diào)用),用于檢測(cè)MYSQL數(shù)據(jù)庫(kù)是否正常運(yùn)行,如果檢測(cè)到MYSQL數(shù)據(jù)庫(kù)掛掉了,說(shuō)明本機(jī)MYSQL服務(wù)器不可用,必須進(jìn)行故障切換。
腳本內(nèi)容如下:
#!/bin/bash
#查看是否有MYSQL進(jìn)程在運(yùn)行(進(jìn)程個(gè)數(shù))
mysql_process_count=`netstat -nlt | grep 3306 | wc -l`
#查看是否有keepalived進(jìn)程在運(yùn)行
keepalived_process_count=`ps -C keepalived --no-header | wc -l`
#如果檢測(cè)到?jīng)]有MYSQL進(jìn)程在運(yùn)行(說(shuō)明數(shù)據(jù)庫(kù)掛掉了)
if [ $mysql_process_count -eq 0 ] && [ $keepalived_process_count -gt 0 ]
then
#殺掉keepalived進(jìn)程,讓BACKUP機(jī)檢測(cè)不到MASTER上的keepalived,從而B(niǎo)ACKUP接管VIP
killall keepalived
fi
chmod 755 /usr/local/mysql/monitor/monitor.sh
5.高可用測(cè)試
(1)開(kāi)啟兩臺(tái)主機(jī)上的keepalived
啟動(dòng)MASTER機(jī)(192.168.1.128)上的keepalived,如圖,VIP(192.168.119.140)設(shè)置成功。
啟動(dòng)BACKUP機(jī)(192.168.1.129)上的keepalived
(2)關(guān)閉MASTER機(jī)(192.168.1.128)上的MYSQL,如圖,MASTER機(jī)上托管的VIP消失。
這時(shí)觀察BACKUP機(jī)(192.168.1.129),從下圖可以看到,BACKUP機(jī)成功接管了VIP(192.168.119.140)。
(3)恢復(fù)MASTER機(jī)上的MYSQL數(shù)據(jù)庫(kù),如下圖,可以看到VIP(192.168.119.140)又回來(lái)了。
再看看BACKUP機(jī),VIP沒(méi)有了,因?yàn)镸ASTER機(jī)上的MYSQL恢復(fù)正常,MASTER機(jī)重新接管了VIP。
(4)通過(guò)VIP訪問(wèn)數(shù)據(jù)庫(kù)
如下圖,通過(guò)VIP(192.168.119.140),成功訪問(wèn)數(shù)據(jù)庫(kù)。