所需腳本文件到這里下載:http://note.youdao.com/share/web/file.html?id=ae8b11a61f7a8aa7b52aac3fcf0c4b83&type=note
環境:
centos 6.5 x64
192.168.0.32 # master
192.168.0.33 #管理節點和從節點slave
VIP:192.168.0.62
iptables打開mysql端口
selinx關閉:
shell > vim /etc/selinux/config
SELINUX=disabled
1.安裝mysql 5.5.x以上的版本(如果是5.6以上的版本,不建議開啟GTID復制),並搭建好雙主復制,復制用戶:repl,復制用戶密碼:123456
主從復制搭建好后,從庫執行下面兩個命令(不要加入到my.cnf中,因為從庫隨時可能被提升為master)
mysql -e 'set global read_only=1;set global relay_log_purge=0;'
如果是剛剛初始化安裝完成的mysql,建議進行安全清理:
mysql > delete from mysql.user where user!='root' or host !='localhost';
mysql > truncate table mysql.db;
mysql > drop database test;
mysql > flush privileges;
2.所有服務器之間建立ssh互信(如果管理節點和數據節點共用,要自己能免密鑰登錄自己):
在master上:
shell > ssh-keygen -t rsa #創建密鑰
shell > ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.33 #發送ssh密鑰到其他服務器
shell > ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.32 #發送ssh密鑰到自己
在slave上:
shell > ssh-keygen -t rsa #創建密鑰
shell > ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.32 #發送ssh密鑰到其他服務器
shell > ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.0.33 #發送ssh密鑰到自己
3.安裝epel源(所有節點):
shell > rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
shell > rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
4.安裝mha(一主一從的架構建議兩個節點都安裝manager和node包)
MHA的配置,只需要在manager節點上配置即可正常工作,配置文件最少一個,一般可以分成兩個部分,這樣一個manager管理多個集群時可以少寫一點配置(當然,為了方便故障時快速恢復manager,可以在備主上也進行配置一,只是需要把配置里的主動關系做對應修改):
master:
shell > yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
解壓mha_packge.zip:
shell > cd packge
shell > rpm -Uvh mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm
shell > cp -ar masterha /etc/
shell > mkdir /var/log/masterha/app1 -p
slave安裝:
shell > yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
解壓mha_packge.zip:
shell > cd packge
shell > rpm -Uvh mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm
shell > cp -ar masterha /etc/
shell > mkdir /var/log/masterha/app1 -p
5.配置Mha
master(master中的MHA配置只是用來做備用的,不需要啟動管理節點,在主庫切換成從庫之后,就可以快速切換管理節點,不需要重新配置),全局配置文件內容如下:
shell > cd /etc/masterha
shell > cat masterha_default.conf #修改全局配置文件
[server default]
#MySQL的用戶和密碼
user=root
password=4testHIGH
#系統ssh用戶
ssh_user=root
#復制用戶
repl_user=repl
repl_password= 123456
#監控
ping_interval=1
#shutdown_script=""
#切換調用的腳本
master_ip_failover_script= /etc/masterha/master_ip_failover
master_ip_online_change_script= /etc/masterha/master_ip_online_change
修改集群配置文件:
shell > cat app1.conf
[server default]
user=root
password=4testHIGH
#mha manager工作目錄
manager_workdir = /var/log/masterha/app1
manager_log = /var/log/masterha/app1/app1.log
remote_workdir = /var/log/masterha/app1
[server1]
hostname=192.168.0.33 #主庫的配置上,把從庫寫成主節點
master_binlog_dir = /data/mysql/data
port=3306
[server2]
hostname=192.168.0.32 #主庫的配置上,把主庫寫成備節點
master_binlog_dir=/data/mysql/data
port=3306
candidate_master=1
check_repl_delay = 0 #用防止master故障時,切換時slave有延遲,卡在那里切不過來。
注:如果有一主多從架構,那么只需要在app1/conf文件后面再多添加幾個配置即可,類似如下:
[server3]
hostname=192.168.0.x
port=3306
master_binlog_dir=/data/mysql/data6.修改master_ip_failover文件中的VIP和綁定網卡
shell > vim /etc/masterha/master_ip_failover
修改master_ip_online_change文件中的VIP和綁定網卡:
shell > vim /etc/masterha/master_ip_online_change
7.把drop_vip.sh和init_vip.sh中的網卡和VIP都改過來
把腳本賦予執行權限:shell > chmod +x drop_vip.sh init_vip.sh master_ip_*
8.這里我為了故障時能快速恢復MHA管理節點,在備主(slave)上也配置了manager,但是不啟動:
shell > cd /etc/masterha
shell > cat masterha_default.conf #修改全局配置文件
[server default]
#MySQL的用戶和密碼
user=root
password=4testHIGH
#系統ssh用戶
ssh_user=root
#復制用戶
repl_user=repl
repl_password= 123456
#監控
ping_interval=1
#shutdown_script=""
#切換調用的腳本
master_ip_failover_script= /etc/masterha/master_ip_failover
master_ip_online_change_script= /etc/masterha/master_ip_online_change
修改集群配置文件:
shell > cat app1.conf
[server default]
user=root
password=4testHIGH
#mha manager工作目錄
manager_workdir = /var/log/masterha/app1
manager_log = /var/log/masterha/app1/app1.log
remote_workdir = /var/log/masterha/app1
[server1]
hostname=192.168.0.32 #從庫上的配置,主庫就是主節點
master_binlog_dir = /data/mysql/data
port=3306
[server2]
hostname=192.168.0.33 #從庫上的配置,從庫就是備節點
master_binlog_dir=/data/mysql/data
port=3306
candidate_master=1
check_repl_delay = 0 #用防止master故障時,切換時slave有延遲,卡在那里切不過來。
修改master_ip_failover文件中的VIP和綁定網卡
shell > vim /etc/masterha/master_ip_failover
修改master_ip_online_change文件中的VIP和綁定網卡:
shell > vim /etc/masterha/master_ip_online_change
把drop_vip.sh和init_vip.sh中的網卡和VIP都改過來
把腳本賦予執行權限:shell > chmod +x drop_vip.sh init_vip.sh master_ip_*
9.配置文件測試(一主一從架構的主庫和從庫上的管理節點建議都要進行測試,不單單只測試從庫上的管理節點):
測試ssh連通性:
shell > masterha_check_ssh --conf=/etc/masterha/app1.conf
注意:如果你是用虛擬機做實驗,很可能碰到這步驟報錯,碰到兩邊都無法ssh或者一邊可以,一邊不可以,此時,可以重新創建密鑰試試,如果多次嘗試仍然不行,那么就把發起ssh連接而失敗的虛擬機換一台再試。或者,看看你的架構是不是把管理節點和數據節點放一起,而管理節點上又沒有配置自己到自己免密鑰登錄。
看到最后提示:[info] All SSH connection tests passed successfully.表示測試通過
測試集群中的主從復制:
shell > masterha_check_repl --conf=/etc/masterha/app1.conf --global_conf=/etc/masterha/masterha_default.conf
注意:執行這個檢測命令的時候使用的是user=root帳號去檢測,注意user=root帳號也要有遠程權限,另外,把mysql目錄下的命令做個鏈接:ln -s /usr/local/mysql/bin/* /usr/bin/
看到最后提示:MySQL Replication Health is OK.表示測試通過
10.啟動管理節點(只在從庫上啟動管理節點):
啟動管理節點最好使用screen啟動:
shell > nohup masterha_manager --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --remove_dead_master_conf --ignore_last_failover> /tmp/mha_manager.log 2>&1 &
sh /etc/masterha/init_vip.sh
確認VIP 綁定成功,如果業務按VIP 配置的訪問DB,應該已經可以正常訪問
注意:
第一次起動,主庫上的VIP 不會自動綁定,需要手功調用init_vip.sh 去綁定,主庫發生故障切換會進行vip 的漂移
11.啟動之后查看控制台輸出日志:
/tmp/mha_manager.log
查看app1日志輸出:
/var/log/masterha/app1/app1.log
查看master的健康狀況日志:
/var/log/masterha/app1/app1.master_status.health
檢查是否啟動成功:
shell > masterha_check_status --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
12.切換測試:
1).在線手工切換(維護切換,需要把MHA監控進程關掉):
shell > masterha_master_switch --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=192.168.0.33 --orig_master_is_new_slave --running_updates_limit=10000
--orig_master_is_new_slave:把舊的master配置為從庫
--running_updates_limit=10000:如果主從庫同步延遲在10000s內都允許切換,但是但是切換的時間長短是由recover時relay 日志的大小決定
切換成功需要看到類似下面的提示:
info] Switching master to 192.168.0.33(192.168.0.33:3306) completed successfully
同時要查看VIP是否已經漂移到了新的主庫上面
2).故障手工切換(MHA進程沒啟動或者掛了的同時主庫也掛了):
shell > masterha_master_switch --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --dead_master_host=old_ip --master_state=dead --new_master_host=new_ip --ignore_last_failover
切換成功需要看到類似如下提示:
Started manual(interactive) failover.
Invalidated master IP address on 192.168.0.32(192.168.0.32:3306)
The latest slave 192.168.0.33(192.168.0.33:3306) has all relay logs for recovery.
Selected 192.168.0.33(192.168.0.33:3306) as a new master.
192.168.0.33(192.168.0.33:3306): OK: Applying all logs succeeded.
192.168.0.33(192.168.0.33:3306): OK: Activated master IP address.
Generating relay diff files from the latest slave succeeded.
192.168.0.33(192.168.0.33:3306): Resetting slave info succeeded.
Master failover to 192.168.0.33(192.168.0.33:3306) completed successfully.
注意:如果是主庫服務器還活着,只是mysqld掛了的時候,VIP在切換的時候也會自動漂移,如果是服務器掛了,那么在掛掉的主庫重啟后,注意不要讓VIP隨開機啟動,因為此時VIP已經漂移到了從庫上,從庫上可能正在接管業務,故障主庫起來后,需要確認數據是否跟新的主庫一樣,如果一樣,那么就把故障主庫作為新的從庫加入新主庫下
3).故障自動切換(啟動MHA監控進程)手動把主庫mysqld停掉,觀察/var/log/masterha/app1.log日志輸出,看到如下信息:
Started automated(non-interactive) failover.
Invalidated master IP address on 192.168.0.32(192.168.0.32:3306)
The latest slave 192.168.0.33(192.168.0.33:3306) has all relay logs for recovery.
Selected 192.168.0.33(192.168.0.33:3306) as a new master.
192.168.0.33(192.168.0.33:3306): OK: Applying all logs succeeded.
192.168.0.33(192.168.0.33:3306): OK: Activated master IP address.
Generating relay diff files from the latest slave succeeded.
192.168.0.33(192.168.0.33:3306): Resetting slave info succeeded.
Master failover to 192.168.0.33(192.168.0.33:3306) completed successfully.
表示成功切換,切換成功后,查看VIP是否漂移到了從庫上(切換成功后,MHA進程會自動停止),同時查看/etc/masterha/app1.conf文件中的[server1]的配置是否都被刪除掉了
故障主庫起來后,需要確認數據是否跟新的主庫一樣,如果一樣,那么就把故障主庫作為新的從庫加入新主庫下。然后在故障主庫上啟動MHA進程。
附:
MHA 日常維護命令集:
1).查看ssh 登陸是否成功
shell > masterha_check_ssh --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
2).查看復制是否建立好
shell > masterha_check_repl --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
3).檢查啟動的狀態
shell > masterha_check_status--global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
4).停止mha
shell > #masterha_stop --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf
5).啟動mha
shell > nohup masterha_manager --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf > /tmp/mha_manager.log < /dev/null 2>&1 &
注意:當有slave 節點宕掉的情況是啟動不了的,加上--ignore_fail_on_start 即使有節點宕掉也能啟動mha,需要在配置文件中設置ignore_fail=1
6).failover 后下次重啟
每次failover 切換后會在管理目錄生成文件app1.failover.complete ,下次在切換的時候會發現有這個文件導致切換不成功,需要手動清理掉。
shell > rm -rf /masterha/app1/app1.failover.complete
也可以加上參數--ignore_last_failover
7).手工failover
手工failover 場景,master 死掉,但是masterha_manager 沒有開啟,可以通過手工failover:
shell > masterha_master_switch --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --dead_master_host=old_ip --master_state=dead --new_master_host=new_ip --ignore_last_failover
8).masterha_manager 是一種監視和故障轉移的程序。另一方面,masterha_master_switch 程序不監控主庫。masterha_master_switch 可以用於主庫故障轉移,也可用於在線總開關。
9).手動在線切換(master還或者,比如做維護切換時)
shell > masterha_master_switch --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=192.168.199.78 --orig_master_is_new_slave
或者
shell > masterha_master_switch --global_conf=/etc/masterha/masterha_default.conf --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=192.168.199.78 -orig_master_is_new_slave --running_updates_limit=10000
--orig_master_is_new_slave 切換時加上此參數是將原master 變為slave 節點,如果不加此參數,原來的master 將不啟動
--running_updates_limit=10000 切換時候選master 如果有延遲的話,mha 切換不能成功,加上此參數表示延遲在此時間范圍內都可切換(單位為s),但是切換的時間長短是由recover時relay 日志的大小決定
手動在線切換mha,切換時需要將在運行的mha 停掉后才能切換。
在備庫先執行DDL,一般先stop slave,一般不記錄mysql 日志,可以通過set SQL_LOG_BIN =0 實現。然后進行一次主備切換操作,再在原來的主庫上執行DDL。這種方法適用於增減索引,如果是增加字段就需要額外注意。
注意:Online master switch 開始只有當所有下列條件得到滿足。
1). IO threads on all slaves are running // 在所有slave 上IO 線程運行。
2). SQL threads on all slaves are running //SQL 線程在所有的slave 上正常運行。
3). Seconds_Behind_Master on all slaves are less or equal than --running_updates_limit
seconds // 在所有的slaves 上Seconds_Behind_Master 要小於等於running_updates_limit
seconds
4). On master, none of update queries take more than --running_updates_limit seconds in the
show processlist output // 在主上,沒有更新查詢操作多於running_updates_limit seconds