MySQL架構之MHA架構實戰
1、簡介:
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作為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試圖從宕機的主服務器上保存二進制日誌,最大程度的保證數據的不丟失,但這並不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失了最新的數據。使用MySQL 5.5的半同步復制,可以大大降低數據丟失的風險。MHA可以與半同步復制結合起來。如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性。
目前MHA主要支持一主多從的架構,要搭建MHA,要求一個復制集群中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫,因為至少需要三臺服務器,出於機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支持一主一從。
我們自己使用其實也可以使用1主1從,但是master主機宕機後無法切換,以及無法補全binlog。master的mysqld進程crash後,還是可以切換成功,以及補全binlog的。
(1)從宕機崩潰的master保存二進制日誌事件(binlog events);
(2)識別含有最新更新的slave;
(3)應用差異的中繼日誌(relay log)到其他的slave;
(4)應用從master保存的二進制日誌事件(binlog events);
(5)提升一個slave為新的master;
(6)使其他的slave連接新的master進行復制;
2、MHA組成
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工具包(這些工具通常由MHA Manager的腳本觸發,無需人為操作)主要包括以下幾個工具:
save_binary_logs 保存和復制master的二進制日誌
apply_diff_relay_logs 識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)
二、環境準備
主機 | ip | 描述 | 系統 |
---|---|---|---|
linux-node1 | 192.168.56.11 | master以及MHA管理節點 | centos 7.4 |
linux-node2 | 192.168.56.12 | slave節點 | centos 7.4 |
linux-node3 | 192.168.56.13 | slave節點 | centos 7.4 |
三、MHA部署實戰
1、安裝依賴
[root@linux-node1 ~]# yum install -y perl-DBD-MySQL
[root@linux-node1 ~]# yum install -y perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
[root@linux-node2 ~]# yum install -y perl-DBD-MySQL
[root@linux-node3 ~]# yum install -y perl-DBD-MySQL
#如果無法安裝,需要安裝epel源:yum install -y epel-release
2、安裝軟件
[root@linux-node1 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
準備中... ################################# [100%]
正在升級/安裝...
1:mha4mysql-node-0.56-0.el6 ################################# [100%]
[root@linux-node2 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
準備中... ################################# [100%]
正在升級/安裝...
1:mha4mysql-node-0.56-0.el6 ################################# [100%]
[root@linux-node3 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:mha4mysql-node-0.56-0.el6 ################################# [100%]
3、修改/etc/my.cnf
修改服務節點my.cnf,這裏做臨時配置,最終生效要配置到my.cnf
MySQL [(none)]> set global relay_log_purge=0;
Query OK, 0 rows affected (0.04 sec)
MySQL [(none)]> grant all privileges on *.* to mha@‘192.168.56.%‘ identified by ‘123456‘;
Query OK, 0 rows affected, 1 warning (0.04 sec)
MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.03 sec)
配置如下:
[client]
port = 3306
socket = /data/mysql/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /data/mysql/mysql.sock
datadir = /data/mysql/data
log-bin = /data/mysql/mysql-bin
server-id = 6
#skip-grant-tables
relay_log_purge=0
4、管理節點配置MHA
[root@linux-node1 ~]# mkdir /etc/mha
[root@linux-node1 ~]# mkdir /var/log/mha/app1 -p
[root@linux-node1 ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log #設置manager的日誌
manager_workdir=/var/log/mha/app1.log #設置manager的工作目錄
master_binlog_dir=/data/mysql/data #設置master 保存binlog的位置,以便MHA可以找到master的日誌
user=mha #設置監控用戶mha
password=123456 #設置mysql中root用戶的密碼,這個密碼是前文中創建監控用戶的那個密碼
ping_interval=2 #設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行railover
repl_password=123456 #設置復制用戶的密碼
repl_user=rep #設置復制環境中的復制用戶名
ssh_user=root #設置ssh的登錄用戶名
[server1]
hostname=192.168.56.11
port=3306
[server2]
candidate_master=1 #設置為候選master,如果設置該參數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是集群中事件最新的slave
check_repl_delay=0 #默認情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢復需要花費很長時間,通過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略復制延時,這個參數對於設置了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master
hostname=192.168.56.12
port=3306
[server3]
hostname=192.168.56.13
port=3306
5、配置SSH登錄
[root@linux-node1 ~]# ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[root@linux-node1 ~]# ssh 192.168.56.12
Last login: Tue Jan 9 17:03:24 2018 from 192.168.56.1
[root@linux-node2 ~]# logout
Connection to 192.168.56.12 closed.
[root@linux-node1 ~]# ssh 192.168.56.13
Last login: Tue Jan 9 21:25:59 2018 from 192.168.56.1
[root@linux-node3 ~]# logout
Connection to 192.168.56.13 closed.
[root@linux-node1 ~]# ssh 192.168.56.11
Last failed login: Wed Jan 10 17:08:07 CST 2018 from linux-node2 on ssh:notty
There were 3 failed login attempts since the last successful login.
Last login: Sat Jan 6 08:52:06 2018 from 192.168.56.1
[root@linux-node1 ~]# logout
Connection to 192.168.56.11 closed.
6、檢查SSH登錄
[root@linux-node1 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Wed Jan 10 17:11:00 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Jan 10 17:11:00 2018 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Jan 10 17:11:00 2018 - [info] Reading server configuration from /etc/mha/app1.cnf..
Wed Jan 10 17:11:00 2018 - [info] Starting SSH connection tests..
Wed Jan 10 17:11:03 2018 - [debug]
Wed Jan 10 17:11:00 2018 - [debug] Connecting via SSH from [email protected](192.168.56.11:22) to [email protected](192.168.56.12:22)..
Wed Jan 10 17:11:01 2018 - [debug] ok.
Wed Jan 10 17:11:01 2018 - [debug] Connecting via SSH from [email protected](192.168.56.11:22) to [email protected](192.168.56.13:22)..
Wed Jan 10 17:11:02 2018 - [debug] ok.
Wed Jan 10 17:11:03 2018 - [debug]
Wed Jan 10 17:11:01 2018 - [debug] Connecting via SSH from [email protected](192.168.56.12:22) to [email protected](192.168.56.11:22)..
Wed Jan 10 17:11:02 2018 - [debug] ok.
Wed Jan 10 17:11:02 2018 - [debug] Connecting via SSH from [email protected](192.168.56.12:22) to [email protected](192.168.56.13:22)..
Wed Jan 10 17:11:02 2018 - [debug] ok.
Wed Jan 10 17:11:03 2018 - [debug]
Wed Jan 10 17:11:02 2018 - [debug] Connecting via SSH from [email protected](192.168.56.13:22) to [email protected](192.168.56.11:22)..
Wed Jan 10 17:11:02 2018 - [debug] ok.
Wed Jan 10 17:11:02 2018 - [debug] Connecting via SSH from [email protected](192.168.56.13:22) to [email protected](192.168.56.12:22)..
Wed Jan 10 17:11:03 2018 - [debug] ok.
Wed Jan 10 17:11:03 2018 - [info] All SSH connection tests passed successfully.
7、檢查mysql replication是否配置成功
[root@linux-node1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
[root@linux-node1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
#必須要做軟連接,或者添加到PATH環境變量,否則會報錯
ot@linux-node1 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
8、啟動監控
[root@linux-node1 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[1] 20640
[root@linux-node1 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 monitoring program is now on initialization phase(10:INITIALIZING_MONITOR). Wait for a while and try checking again.
9、測試
(1)停止主庫
[root@linux-node1 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
(2)登錄從庫查看,node2變成了主庫,node3的主庫ip變成了192.168.56.12
[root@linux-node2 ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
MySQL [(none)]> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
[root@linux-node3 ~]# mysql -uroot -p123456
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.56.12
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 154
Relay_Log_File: linux-node3-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
MySQL架構之MHA架構實戰