標籤:style blog http io ar os 使用 sp for
一、MHA的簡單介紹
MHA是由perl語言編寫的,用外掛指令碼的方式實現mysql主從複製的高可用性。
MHA可以自動檢測mysql是否宕機,如果宕機,在10-30s內完成new master的選舉,應用所有差異的binlog日誌到所有slave,將所有的slave切換到新的master上來。
MHA除了自動檢測mysql是否宕機,還能夠互動切換master,在日常的資料庫維護中,這個功能還是挺有用的。
由於MHA本身只負責資料庫主從的切換,但是應用程式並不知道資料庫的master變了。針對這種情況,可以使用MHA預留的幾個指令碼介面,通過虛擬IP或者修改全域設定檔的方法通知應用程式,master資料庫已經改變。
MHA還是一個很活躍的項目,生產環境的使用者眾多,不乏大公司,MHA的版本也很快,MHA作者在持續更新版本,最新版本已經支援GTID了。
二、環境部署
OS : Centos /RedHat 6.x
Mysql: Percona 5.5/5.6
主機(hostname) |
角色 |
IP |
安裝 |
master.mysql.com |
Master |
192.168.56.110 |
Mysq,mha node,keepalived |
Slave1.mysq.com |
Candidate master ( slave1 ) |
192.168.56.111 |
Mysql, MHA node, keepalived |
Slave2.mysql.com |
slave2 |
192.168.56.112 |
Mysql,keepalived |
mha.mysql.com |
MHA manager |
192.168.56.111 |
MHA manager |
Vip |
192.168.56.188 |
|
|
三、軟體安裝
yum源準備(修改 /etc/yum.repos.d/)
epel yum源:http://blog.csdn.net/yiyuf/article/details/40148125
Percona yum源:http://blog.csdn.net/yiyuf/article/details/40148183
關閉selinux
#cat /etc/sysconfig/selinux
SELINUX=disabled
關閉 iptables
#service iptables stop
chkconfig iptables off
修改 /etc/hosts 增加如下:
192.168.56.110 master.mysql.com
192.168.56.112 slave1.mysql.com
192.168.56.113 slave2.mysql.com
並scp /etc/hosts 到其它各個節點。
mysql 安裝:
yum -y install Percona-Server-server-55.x86_64 (5.5 版本)
yum -y install Percona-Server-server-56.x86_64 (5.6版本 )
搭建mysql 一主兩從配置 (略)
SSH互信配置:
在master(192.168.56.110)上執行:ssh-keygen (一路斷行符號)
# cd ~/.ssh
#cat id_rsa.pub >authorized_keys
#chmod 600 *
scp -r .ssh 192.168.56.111:~/
scp -r .ssh 192.168.56.112:~/
scp -r .ssh 192.168.56.113:~/
至此,mysql的主從也搭建好了,並可以正常運行了。接下來開始安裝MHA軟體:
1. mha manager節點安裝(192.168.56.111上):
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -----安裝perl相關庫檔案
從https://code.google.com/p/mysql-master-ha/wiki/Downloads上面下載:
MHA Manager 0.56 rpm RHEL6
MHA Node 0.56 rpm RHEL6
MHA Manager 0.56 tarball #####下載此tar包的目的是為了copy相關的設定檔和scripts
在192.168.56.111上安裝:
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
#rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
2. mha node節點安裝(192.168.56.110, 192.168.56.112,192.168.56.113):
# yum -y install perl-DBD-MySQL
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
3. MHA配置 (只需要在mha manager端配置即可):
該設定檔預設是分為兩個(appxxx.cnf ,masterha_default.cnf ),其中masterha_default.cnf 是屬於全域設定檔,當管理多個叢集時,就顯得特別有用。避免app.conf寫的太長。app1.conf作用範圍為master/slave結構,
全域參數檔案配置(masterha_default.cnf)
#cat /etc/masterha_default.cnf
[server default]
user=yyf
password=yyf
ssh_user=root
repl_user=replica
repl_password=zjjzjj
master_binlog_dir=/var/lib/mysql3307
#monitor
ping_interval=1
shutdown_script=""
secondary_check_script="masterha_secondary_check -s 192.168.56.112 -s 192.168.56.113" #此處 56.112和56.113在每次切換完後必須要調整。例:當前112和113是slave,110是master,如果MHA發生自動切換,master由110切換到112後,下次這部分就該修改為:-s 192.168.56.110 -s 192.168.56.113。否則下次切換時,將導致失敗。
master_ip_failover_script="/root/scripts/master_ip_failover.sh" ## 點擊開啟連結(master_ip_failover.sh)
參數解釋:
user |
用於管理MySQL的使用者名稱。這個最後需要root使用者,因為它需要執行:stop slave; change master to , reset slave. 預設: root |
password |
MySQL的系統管理使用者的密碼。 預設是空的 |
ssh_user |
當前使用的系統使用者,用於ssh登入檢測狀態 |
repl_user |
MySQL用於複製的使用者 |
repl_password |
MySQL用於複製的使用者的密碼 |
ping_interva l |
設定MHA Manager多長時間去ping一下master(執行一些SQL語句). 當3次ping失敗後,MHA Manager會認為MySQL Master死掉了。也就是說,最大的故障切換時間是4次ping_interval的時間,預設是3秒。 |
shutdown_script |
定義關掉主master的指令碼 |
secondary_check_script |
當MHA Manager檢測master失敗後,不會立即判斷該master已宕機,而是通過ssh到secondary_check_script定義的主機再次進行檢測失敗後,方可認為master無法響應。這從一定程度上也防止腦裂的現象出現。 |
master_ip_failover_script |
failvoer時,控制VIP轉移的指令碼。通常有兩種方式實現: (1)通過命令 "/sbin/ifconfig eth1:1 192.168.56.188"; (2) 結合keepalived 來實現 |
master_binlog_dir |
用於儲存binary日誌的全路徑。這個參數用於當master上mysql死掉後,通過ssh連到mysql伺服器上,找到需要binary日誌事件。這個參數可以協助用於無法找到master進程死掉後binary日誌儲存位置。可以設定多個存放位置用逗號隔開如:/var/lib/mysql , /var/lib/mysql3307 |
app1.conf參數檔案介紹(作用於某組master / slave結構)
#cat /etc/app1.conf
[server default]
manager_log=/var/log/masterha/app1/app1.log
manager_workdir=/var/log/masterha/app1
remote_workdir=/var/log/masterha/app1
[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.56.112
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.56.110
port=3306
[server3]
check_repl_delay=0
hostname=192.168.56.113
ignore_fail=1
no_master=1
port=3306
參數解釋:
manager_log |
指定MHA manager的絕對路徑的檔案名稱記錄檔 |
manager_workdir |
指定MHA manager產生相關狀態檔案全路徑。 如果沒設定 預設是/var/tmp |
remote_workdir |
MHA node上工作目錄的全路徑名。如果不存在,MHA node會自動建立,如果不允許建立,MHA Node自動異常退出 |
[server1] [server2] [server3] |
在各個APP中所包含,定義每個主機的屬性。 |
candidate_master |
作用是當設計candidate_master = 1時,這個伺服器有較高的優先權提升為新的master(條件:開啟binglog,服務無延遲)如果設定了多台機器的caddidate_master = 1 , 優先策略依賴於塊名字([server_xxx]),如:[server_1] 優銜權高於[server_2] |
check_repl_delay |
在預設情況下,當一個slave同步延遲超過100M relay log(需要應用超過100M relay log), MHA在做故障切換時不會選擇這個slave做為新的master,因為恢複需要經過很長時間.當設定了check_repl_delay = 0, MHA將忽略被選擇的slave上的同步延遲。 這個選項在設定了candidate_master = 1特聲明的期望這台機器成為master的情況下特別有用。 |
hostname |
配置MySQL伺服器的機器名或是IP地址,這個配置項是必須的,而且只能配置在[server_xxx]這個塊下面。 |
ignore_fail |
在預設情況下,MHA manager不會在slave存在故障的情況下進行Master的故障切換。當設定了ignore_fail = 1時,MHA會在所有的機器有問題的時間也會進行故障切換。 預設是0. |
no_master |
當設定了no_master = 1的伺服器,這個伺服器永遠不會提升為新的master |
port |
db的連接埠號碼,預設是3306 :port=3307 |
中繼日誌的處理:
預設情況下,從伺服器上的中繼日誌在SQL線程執行完後會被自動刪除的。但是這些中繼日誌在恢複其他從伺服器時候可能會被用到,
因此需要禁用中繼日誌的自動清除和定期清除舊的中繼日誌。定期清除中繼日誌需要考慮到複製延時的問題。在ext3檔案系統下,
刪除大的檔案需要一定的時間,會導致嚴重的複製延時。為了避免複製延時,暫時為中繼日誌建立永久連結。
MHA節點包含pure_relay_logs命令工具,它可以為中繼日誌建立永久連結,執行SET GLOBAL relay_log_purge=1,等待幾秒中以便SQL線程切換到新的中繼日誌,
再執行SET GLOBAL relay_log_purge=0。
pure_relay_logs參數如下所示:
–user mysql使用者名稱
–password mysql密碼
–host mysql伺服器位址
–port 連接埠號碼
–workdir 建立和刪除中繼日誌永久連結目錄。成功執行指令碼後,永久連結的中繼記錄檔將被刪除。預設目錄是/var/tmp。
因此purge_relay_logs指令碼刪除中繼日誌不會阻塞SQL線程,在每台從節點上設定計劃任務
定期清除中繼日誌
0 15 * * * /usr/bin/purge_relay_logs -user=yyf -password=yyf -disable_relay_log_purge -port=3307 -host=192.168.56.110 >> /var/log/masterha/app1/purge_relay_logs.log 2>&1
至此,MHA的配置已經完成。很簡單吧。設定檔只需存在於MHA Manager端即可。相關測試:將在下篇文章介紹,請戳開:點擊開啟連結
接下來就可以啟動 MHA 監控了:
[[email protected] scripts]#nohup masterha_manager --conf=/etc/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &
查看MHA狀態:
[[email protected] ~]# masterha_check_status --conf=/etc/app1.cnf
app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110
停止MHA監控:
[[email protected] ~]# masterha_stop --conf=/etc/app1.cnf
解釋:
--conf 一組master/slave的設定檔,會同時讀取全域設定檔
/etc/masterha_default.cnf
--remove_dead_master_conf 該參數代表當發生主從切換後,老的主庫的IP將會從設定檔(app1.conf)中移除.
--ignore_last_failover 在預設情況下,如果MHA檢測到連續發生宕機,且兩次宕機間隔不足8小時的話,則不會進行Failover.這樣限制是為了避免ping-pong效應。該參數代表忽略上次MHA觸發切換產生的檔案,預設情況下,MHA發生切換後會在日誌目錄,也就是上面我設定的/var/log/masterha/app產生app1.failover.complete檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換,除非在第一次切換後收到刪除該檔案,為了方便,這裡設定為--ignore_last_failover。
監控開啟後,就可以做相關測試了,把master上的mysql進程kill掉(pkill mysql )。測試下會不會自動進行failover測試,為了縮短文章篇幅,相關測試
請戳開:點擊開啟連結
keepalived 安裝:
軟體下載最新版本:http://www.keepalived.org/software/
keepalived-1.2.13.tar.gz
#yum -y install openssl-devel
#tar -zxvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
#./configure --prefix=/usr/local/keepalived
#make && make install
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
keepalived配置及設定檔(在主master 192.168.56.110上的配置)
[[email protected] ~]# cat /etc/keepalived/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 LVS_DEVEL
}
vrrp_instance VI_1 {
state backup
interface eth1
nopreempt
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.188
}
notify_master "/etc/keepalived/arp.sh"
}
其中router_id MySQL HA表示設定keepalived組的名稱,將192.168.56.188這個虛擬ip綁定到該主機的eth1網卡上,並且設定了狀態為backup模式,將keepalived的模式設定為非搶佔模式(nopreempt),priority 150表示設定的優先順序為150。下面的配置略有不同,但是都是一個意思。
在候選master上配置(192.168.56.112)如下:
[[email protected] ~]# cat /etc/keepalived/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 LVS_DEVEL
}
vrrp_instance VI_1 {
state master
interface eth1
nopreempt
virtual_router_id 51
priority 100 #此處很重要,一定要低於當前master的優先順序別。值比主master小即可
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.188
}
notify_master "/etc/keepalived/arp.sh" ###定義的清除arp路由的指令碼。
}
至此,依次把主master和候選master上的keepalived進程開啟:
service keepalived start|stop|restart
#ip add 命令查看VIP的綁定情況:
[[email protected] keepalived]# ip add
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 08:00:27:70:b3:d8 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.40/24 brd 192.168.2.255 scope global eth0
inet6 fe80::a00:27ff:fe70:b3d8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:75:5b:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.110/24 brd 192.168.56.255 scope global eth1
inet 192.168.56.188/32 scope global eth1
inet6 fe80::a00:27ff:fe75:5b94/64 scope link
valid_lft forever preferred_lft forever
MySQL MHA+Keepalived