https://blog.csdn.net/yiyuf/article/details/40340895
http://www.cnblogs.com/yuanermen/p/3726572.html
http://www.cnblogs.com/yuanermen/p/3726961.html
http://www.cnblogs.com/yuanermen/p/3735263.html
一、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.comMaster192.168.56.110Mysq,mha node,keepalived
Slave1.mysq.comCandidate master
( slave1 )
192.168.56.111Mysql, MHA node,
keepalived
Slave2.mysql.comslave2192.168.56.112Mysql,keepalived
mha.mysql.comMHA manager192.168.56.111MHA manager
Vip192.168.56.188
三、軟體安裝
yum源準備(修改 /etc/yum.repos.d/)
epel yum源:
http://blog.csdn.net/yiyuf/article/details/40148125Percona 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_userMySQL用于複制的使用者
repl_passwordMySQL用于複制的使用者的密碼
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_scriptfailvoer時,控制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
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]
hostname=192.168.56.110
[server3]
hostname=192.168.56.113
ignore_fail=1
no_master=1
manager_log指定MHA manager的絕對路徑的檔案名日志檔案
manager_workdir指定MHA manager産生相關狀态檔案全路徑。 如果沒設定 預設是/var/tmp
remote_workdirMHA 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
portdb的端口号,預設是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 {
}
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)如下:
[root@agent ~]# cat /etc/keepalived/keepalived.conf
state master
nopreempt
priority 100 #此處很重要,一定要低于目前master的優先級别。值比主master小即可
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: 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: 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
3: eth1: 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