1、MHA的簡單介紹
MHA是由perl語言編寫的,用外掛腳本的方式實現mysql主從複製的高可用性。
MHA能夠自動檢測mysql是否宕機,若是宕機,在10-30s內完成new master的選舉,應用全部差別的binlog日誌到全部slave,將全部的slave切換到新的master上來。
MHA除了自動檢測mysql是否宕機,還可以交互式的切換master,在平常的數據庫維護中,這個功能仍是挺有用的。
因爲MHA自己只負責數據庫主從的切換,可是應用程序並不知道數據庫的master變了。針對這種狀況,可使用MHA預留的幾個腳本接口,經過虛擬IP或者修改全局配置文件的方法通知應用程序,master數據庫已經改變。php
MHA仍是一個很活躍的項目,生產環境的使用者衆多,不乏大公司,MHA的版本也很快,MHA做者在持續更新版本,最新版本已經支持GTID了。html
2、環境部署node
OS : Centos /RedHat 6.xmysql
Mysql: Percona 5.5/5.6linux
主機(hostname) | 角色 | IP | 安裝 |
master.mysql.com | Master | 192.168.56.110 | Mysq,mha node,keepalived |
Slave1.mysq.com | Candidate mastersql ( slave1 )數據庫 |
192.168.56.111 | Mysql, MHA node,服務器 keepalivedapp |
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 |
3、軟件安裝ssh
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 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 監控了:
[root@mha 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狀態:
[root@mha ~]# masterha_check_status --conf=/etc/app1.cnf
app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110
中止MHA監控:
[root@mha ~]# 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上的配置)
[root@master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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)以下:
[root@agent ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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的綁定狀況:
[root@master 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