1. 程式人生 > >Mysql 的高可用之 MHA

Mysql 的高可用之 MHA

mysql 的高可用 郵件報警

Mysql 的高可用之 MHA

MHA作為MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。

該軟件由兩部分組成:MHA Manager(管理節點)MHA Node(數據節點)。MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave集群,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然後將所有其 他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明。

目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器。

技術分享圖片


MHA工作原理

(1)從宕機崩潰的master保存二進制日誌事件(binlog events);

(2)識別含有最新更新的slave;

(3)應用差異的中繼日誌(relay log) 到其他slave;

(4)應用從master保存的二進制日誌事件(binlog events);

(5)提升一個slave為新master;

(6)使用其他的slave連接新的master進行復制。


MHA軟件由兩部分組成,Manager工具包和Node工具包,具體的說明如下。

Manager工具包主要包括以下幾個工具:

masterha_check_ssh              檢查MHA的SSH配置狀況
masterha_check_repl 檢查MySQL復制狀況
masterha_manger 啟動MHA
masterha_check_status 檢測當前MHA運行狀態
masterha_master_monitor 檢測master是否宕機
masterha_master_switch 控制故障轉移(自動或者手動)
masterha_conf_host 添加或刪除配置的server信息

Node工具包主要包括以下幾個工具:
save_binary_logs 保存和復制master的二進制日誌
apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)


配置環境,高可用要在主從復制基礎前提下實現

實驗:

Monitor host and master server1 192.168.122.11
Candicate master server2 192.168.122.12

Slave server3 192.168.122.13


首先確保主從復制

查看slave狀態時發現,IO線程為NO;

技術分享圖片


如下解決:

重啟master庫:/etc/init.d/mysqld restart

mysql> show master status;

技術分享圖片

關閉slave,mysql> slave stop;

mysql> change master to master_log_file='binlog.000004',master_log_pos=154;

如下,已經OK!

技術分享圖片



繼續實驗:


主上授權 mysql> grant replication slave on *.* to cara@'192.168.122.%' identified by 'LH=liuhuan123';

兩從 mysql> change master to master_host='192.168.122.11',master_user='cara',master_password='LH=liuhuan123',master_log_file='mysql-bin.000003',master_log_pos=1401;


最好禁掉密碼插件(server2,3同理)

[root@server1 ~]# vim /etc/init.d/mysqld

技術分享圖片


一、進行環境配置


在master上進行授權

技術分享圖片


修改配置文件my.cnf

master(server1)

技術分享圖片

slave(server2)

技術分享圖片

slave (server3)

技術分享圖片

查看狀態

技術分享圖片


二、安裝 MHA 及相關配置


1)Server1 安裝

mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-5.el6.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MIME-Lite-3.027-2.el6.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm

Server2,3 安裝
mha4mysql-node-0.56-0.el6.noarch.rpm


2).編輯配置文件

將配置文件拷貝到指定目錄下

技術分享圖片


修改配置文件


技術分享圖片


[server default]
user=root
password=LH=liuhuan123
ssh_user=root
repl_password=LH=liuhuan123
repl_user=repl
master_binlog_dir=/var/lib/mysql
remote_workdir=/tmp
ping_interval=1
#master_ip_failover_script=/script/masterha/master_ip_failover
#shutdown_script=/script/masterha/power_manager
#report_script=/script/masterha/send_report
#master_ip_online_change_script=/script/masterha/master_ip_online_change
#secondary_check_script=masterha_secondary_check -s remote_host1 -s
remote_host2
manager_workdir=/usr/local/masterha/

manager_log=/usr/local/masterha/manager.log

[server1]
hostname=192.168.122.11


[server2]
hostname=192.168.122.12
candidate_master=1
check_repl_delay=0

[server3]
hostname=192.168.122.13
no_master=1


3).使 master 和 slave 相互之間可以無密碼連接

[root@server1 masterha]# ssh-keygen -t rsa
[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server2 ~]# ssh-keygen -t rsa
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
[root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server3 ~]# ssh-keygen -t rsa
[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

[root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]


ssh-copy-id命令可以把本地主機的公鑰復制到遠程主機的authorized_keys文件上,ssh-copy-id命令也會給遠程主機的用戶主目錄(home)和~/.ssh, 和~/.ssh/authorized_keys設置合適的權限。


三、測試及結果


[root@server1 masterha]# masterha_check_ssh --conf=/usr/local/masterha/app1.cnf

技術分享圖片


技術分享圖片



[root@server1 masterha]# masterha_check_repl --conf=/usr/local/masterha/app1.cnf

技術分享圖片

技術分享圖片


分析報錯後發現時沒有在master端給prelroot授權的緣故


mysql> grant replication slave on *.* to repl@'%' identified by 'LH=liuhuan123';

mysql> grant replication slave on *.* to root@'%' identified by 'LH=liuhuan123';

技術分享圖片


技術分享圖片


建立授權用戶

授權後,可遠程登錄


mysql> grant all on *.* to root@'%' identified by 'LH=liuhuan123';

技術分享圖片

技術分享圖片


技術分享圖片


測試,master是否切換

[root@server1 masterha]# nohup masterha_manager --conf=/usr/local/masterha/app1.cnf & 在管理主機啟動管理程序


技術分享圖片

[root@server1 masterha]# pkill -9 mysqld 殺掉master端的進程

在server2和server3上查看

server2已經繼承master


技術分享圖片


server3上看到master狀態已經變為server2


技術分享圖片


手動切換:當master端數據庫關掉後可用下面手動方法切換

masterha_master_switch --master_state=dead --conf=/usr/local/masterha/app1.cnf --dead_master_host=192.168.122.12 --dead_master_port=3306 --new_master_host=192.168.122.11 --new_master_port=3306 --ignore_last_failover


手動熱切換:可以在master正常工作時使其數據庫關掉,讓備用mastre機接替其工作

masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.12 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000


當把master切換到備用master上時,若再次想切回master,需要手動將備master和slave上做change master

備用master上:

技術分享圖片

技術分享圖片


查看日誌 [root@server2 ~]# cat /var/log/mysqld.log

技術分享圖片


技術分享圖片


技術分享圖片


技術分享圖片


slave端:

技術分享圖片

網上查找得如下:

不帶MASTER_LOG_FILE,MASTER_LOG_POS參數,執行change master 語句,按照mysql官方文檔的說法,執行語句後的復制點應該與之前的復制點一致


技術分享圖片



測試: 停掉備用主機的io,然後在master主機加入數據,造成備用mastermaster主機二進制數據不一致,然後關掉master主機的mysql,執行manager命令,使備用master成為master,看數據是否會一致

change master to master_host='192.168.122.11', master_user='cara', master_password='LH=liuhuan123', master_auto_position=1; #使master指向server1(註意:每次執行需刪除app1.failover.complete,否則出錯)


1)stop slave io_thread; 停掉備用主機io線程(server2)

技術分享圖片

2)在主master主機插入數據(server1)

技術分享圖片

3)在另一臺slave中查看數據是否同步過去(server3)

技術分享圖片


4)主master上,關掉mysql

技術分享圖片


技術分享圖片


5)使備用成為master後,查看數據是否根據差異日誌恢復過來

技術分享圖片


slave端master已經改變

技術分享圖片


再切回master

技術分享圖片

server2上: 指定master_auto_position=1,不會遇到上面change master 時的錯誤;
技術分享圖片


server3上:

技術分享圖片


四、使用腳本控制master狀態


技術分享圖片

將所需腳本移至指定目錄

技術分享圖片


修改app1.cnf文件

技術分享圖片

技術分享圖片

vim master_ip_failover #master添加虛擬ip


技術分享圖片


vim master_ip_online_change #同樣只需添加虛擬ip

技術分享圖片

vim send_report #添加郵箱和密碼

技術分享圖片


chmod +x send_report master_ip_failover master_ip_online_change #給腳本添加執行權限

在測試時需要虛擬機進行聯網

在物理主機添加路由

[root@foundation12 MHA]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE

在需要聯網的虛擬機上添加網關,為物理機ip

[root@server1 masterha]# vim /etc/sysconfig/network-scripts/ifcfg-eth0或

[root@server1 masterha]#route add default gw 192.168.122.1

添加本地解析,使其可以上網

[root@server1 masterha]# vim /etc/resolv.conf

技術分享圖片

重啟網絡使其生效

[root@server1 masterha]# /etc/init.d/network restart

技術分享圖片


以上可以實現郵件報警!

[root@server1 masterha]# masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.11 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000


技術分享圖片

技術分享圖片

技術分享圖片




Mysql 的高可用之 MHA