1. 程式人生 > >MySQL架構之MHA架構實戰

MySQL架構之MHA架構實戰

fault arc 獨立 支持 ignore llb ssh 啟動 pda

一、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架構實戰