mysql高可用之MHA+半同步複製

1,MHA概述

MHA目前在mysql高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作爲mysql高可用性環境下故障切換和主從提升的高可用軟件。在mysql故障切換過程中,MHA能做到在0-30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換操作的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用,MHA裏由兩個角色一個是MHA Node(數據節點),另一個是MHA Manager(管理節點)。MHA Manager可以單獨部署在一臺讀立的服務器上管理多個master-slave集羣,也可以部署在一臺slave節點上。
MHA Node運行在每臺mysql服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它可以自動將最新數據的slave提升爲新的master,然後將所有其他的slave重新指向新的master。整個故障轉移過程中對應用程序完全透明。
mysql高可用之MHA+半同步複製
在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日誌,最大程度地保證數據的不丟失,但這並不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失了最新的數據。使用mysql 5.5的半同步複製,可以大大降低數據丟失的風險。MHA可以與半同步複製結合起來,如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性。

注:從mysql5.5開始,mysql以插件的形式支持半同步複製。

2,如何理解半同步呢?

#首先我們來看看異步,全同步的概念:
異步複製:mysql默認的複製即是異步的,主庫在執行完客戶端提交的事務後會立即將結果返回給客戶端,並不關心從庫是否已經接收並處理,這樣就會有一個問題,主如果掛掉了,此時主上已經提交的事務可能並沒有傳到從上,如果此時強行將從提升爲主,可能導致新主上的數據不完整。

全同步複製:指當主庫執行完一個事務,所有的從庫都執行了該事務才返回給客戶端,因爲需要等待所有從庫執行完該事務才能返回,所以全同步複製的性能必然會受到嚴重的影響。

半同步複製:介於異步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少有一個從庫接收到並寫到relay log(中繼)中才返回給客戶端。相對於異步複製,半同步複製提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步複製最好在低延時的網絡中使用。

總結:異步與半同步異同,默認情況下mysql的複製是異步的,master上所有的更新操作寫入binglog之後並不確保所有的更新都被複制到slave上。異步操作雖然效率高,但是在master/slave出現問題的時候,存在很高數據不同步的風險,甚至可能丟失數據。mysql5.5引入半同步複製功能的目的是爲了保證在master出問題的時候,至少有一臺slave的數據是完整的。在超時的情況下也可以臨時轉入異步複製,保障業務的正常使用,直到一臺slave追趕上之後,繼續切換到半同步模式。

3,MHA的工作原理

相較於其他HA軟件,MHA目的在於維持mysql 主從複製中mater庫的高可用性,其最大特點是可以修復多個slave之間的差異日誌,最終使所有slave保持數據一致,然後從中選擇一個充當新的master,並將其它slave指向它。
1)從宕機崩潰的master保存二進制日誌事件(binglogevents)
2)識別含有最新更新的slave
3)應用差異的中繼日誌(relay log)到其他slave
4)應用從master保存的二進制日誌事件(binglogevents)
5)提升一個slave爲新master
6)使其它的slave連接新的master進行復制

4,部署MHA

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

具體的搭建環境如下:

主機名 ip地址 server id 類型 OS
Manager 172.16.1.100 管理節點 CentOS 7.3
Master 172.16.1.110 1 主mysql(寫入) CentOS 7.3
CandicateMaster(備用master) 172.16.1.120 2 從mysql(讀) CenOS 7.3
slave 172.16.1.130 3 從mysql(讀) CentOS 7.3

其中master對外提供寫服務,備選master(實際的slave,主機名CandicateMaster)提供讀服務,slave也提供相關的讀服務,一旦master宕機,將會把備選master提升爲新的master,slave指向新的master,manager作爲管理服務器(無需安裝mysql)。
一,基礎環境準備
1,在配置好ip地址後檢查selinux,iptables設置,關閉selinux,iptables服務以便後期主從同步不出錯,注:時間要同步。
#配置時間同步

設置時區(臨時生效),永久可修改/etc/sysconfig/clock文件,把ZONE的值改爲Asia/Shanghai,UTC值改爲false
[root@manager ~]# cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 
[root@manager ~]# hwclock
時間同步:
[root@manager ~]# ntpdate -u ntp.api.bz     //NTP服務器(上海)

2,在四臺機器都配置epel源
#下載epel源:
[root@manager ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

3,配置hosts環境:
mysql高可用之MHA+半同步複製

拷貝給其他主機:
[root@manager ~]# for i in 110 120 130; do scp /etc/hosts [email protected].$i:/etc/; done

4,建立ssh無交互登陸環境
(四臺主機都需操作,使其都能夠互相免密登錄)

[root@manager ~]# ssh-keygen -t rsa    #生成密鑰
[root@manager ~]# for i in manager master candicatemaster slave; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i; done

5,互相測試ssh無交互登錄(四臺主機上都需測試)

[root@manager ~]# for i in manager master candicatemaster slave; do ssh $i hostname; done 
manager
master
candicatemaster
slave
//ssh各臺主機,並執行hostname命令,驗證是否成功

二,配置mysql半同步複製
爲了儘可能的減少主庫硬件損壞宕機造成的數據丟失,因此在配置MHA的同時建議配置成mysql的半同步複製。
注:mysql半同步插件是由google提供,具體位置/usr/local/mysql/lib/plugin下,一個是master用的semisync_master.so,一個是slave用的semisync_slave.so,下面我們就來具體配置一下。如果不清楚Plugin的目錄,用如下查找:

mysql> show variables like '%plugin_dir%';  #查找plugin的目錄
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.00 sec)

1,分別在主從節點上安裝相關的插件(master,candicatemaster,slave)在mysql上安裝插件需要數據庫支持動態載入。檢查是否支持,用如下檢測:

mysql> show variables like '%have_dynamic%'
    -> ;
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)

#所有mysql數據庫服務器,安裝半同步插件(semisync_master.so,semisync_slave.so):

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.30 sec)

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

其他mysql主機採用同樣的方法安裝。

#確保每臺mysql主機都正確安裝plugin:
mysql> show plugins;
mysql高可用之MHA+半同步複製
或者使用:
mysql> select * from information_schema.plugins\G;

#查看半同步相關信息:

mysql> show variables like '%rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

從上面可以看到半同步複製插件已經安裝,只是還沒有啓用,所以是OFF。

2,修改my.cnf文件,配置主從同步

注:若主mysql服務器已經存在,只是後期才搭建從mysql服務器,在配置數據同步前應先將主mysql服務器的要同步的數據庫拷貝到從mysql服務器上(如先在主mysql上備份數據庫,再用備份在從mysql服務器上恢復)

master mysql主機:

[root@master ~]# vim /etc/my.cnf
添加內容如下:
server-id=1
log-bin=mysql-bin
binlog_format=mixed
log-bin-index=mysql-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log=relay-bin
relay-log-index=slave-relay-bin.index

注: rpl_semi_sync_master_enabled=1 1表是啓用,0表示關閉 ,
rpl_semi_sync_master_timeout=10000:毫秒單位 ,該參數主服務器等待確認消息10秒後,不再等待,變爲異步方式。

candicate master主機:

[root@candicatemaster ~]# vim /etc/my.cnf 
server-id=2
log-bin=mysql-bin
binlog_format=mixed
log-bin-index=mysql-bin.index
relay_log_purge=0
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1

注:relay_log_purge=0,禁止sql線程在執行完一個relay log後自動將其刪除,對於MHA場景下,對於某些滯後從庫的恢復依賴於其他從庫的relay log,因此採取禁用自動刪除功能。

slave主機:

[root@slave ~]# vim /etc/my.cnf 
server-id=3
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
read_only=1
rpl_semi_sync_slave_enabled=1

#依次重啓mysql服務(master,candicate master,slave):systemctl restart mysqld

#查看半同步相關信息:

mysql> show variables like '%rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

可以看到半同步複製已經啓用了(ON)。

#查看半同步狀態:
mysql高可用之MHA+半同步複製
有幾個參數值得關注的:

Rpl_semi_sync_master_status :顯示主服務是異步複製模式還是半同步複製模式
Rpl_semi_sync_master_clients:顯示有多少個從服務器配置爲半同步複製模式
Rpl_semi_sync_master_yes_tx:顯示從服務器確認成功提交的數量
Rpl_semi_sync_master_no_tx:顯示從服務器確認不成功提交的數量
Rpl_semi_sync_master_tx_avg_wait_time:事務因開啓semi_sync,平均需要額外等待的時間
Rpl_semi_sync_master_net_avg_wait_time:事務進入等待隊列後,到網絡平均等待時間。

master主機:

mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (10.01 sec)

mysql> grant all privileges on *.* to manager@'172.16.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      737 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

第一條grant命令是創建一個用於主從複製的賬號,在master和candicate master的主機上創建即可。第二條grant命令是創建MHA管理賬號,所有mysql服務器上都需要執行。MHA會在配置文件裏要求能遠程登錄到數據庫,所有要進行必要的賦權。

candicate master主機:

mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (10.00 sec)

mysql> grant all privileges on *.* to manager@'172.16.1.%' identified by  '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>  change master to master_host='172.16.1.110',master_port=3306,master_user='rep',master_password='1233.com',master_log_file='mysql-bin.000002',master_log_pos=737;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

#查看從的狀態,以下兩個值必須爲yes,代表從服務器能正常連接主服務器
mysql高可用之MHA+半同步複製

slave主機:

mysql> grant all privileges on *.* to manager@'172.16.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.28 sec)

mysql> change master to master_host='172.16.1.110',master_port=3306,master_user='rep',master_password='123.com',master_log_file='mysql-bin.000002',master_log_pos=737;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

#同樣查看從的狀態,以下兩個值必須爲yes,代表從服務器能正常連接主服務器
mysql高可用之MHA+半同步複製

#查看master服務器的半同步狀態:
mysql高可用之MHA+半同步複製
可以看到目前已經有2個slave服務器已經配置成了半同步模式。

三,配置mysql-mha
mha包括manager節點和data節點,data節點包括原有的mysql複製幾個中的主機,至少3臺,即1主2從,當masterfailover後,還能保證主從結構;只需安裝node包。
manager節點:運行監控腳本,負責monitoring和auto-failover;需要安裝node包和manager包。

1,在所有主機上安裝mha所依賴的軟件包(需要系統自帶的yum源並聯網)

yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-ParallelForkManager perl-Config-IniFiles ncftp perl-Params-Validate perl-CPAN perl-TestMock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

2,以下操作管理節點(manager)需要兩個都安裝,在3臺數據庫節點只要安裝MHA的node節點:
軟件下載地址:https://github.com/yoshinorim
1)在所有數據庫節點上安裝mha4mysql-node-0.56.tar.gz:

[root@master ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
[root@master ~]# tar zxf mha4mysql-node-0.58.tar.gz 
[root@master ~]# cd mha4mysql-node-0.58
[root@master mha4mysql-node-0.58]# perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@master mha4mysql-node-0.58]# make && make install
#將安裝包拷貝給其他主機:
[root@master ~]# for i in candicatemaster slave; do scp mha4mysql-node-0.58.tar.gz root@$i:/root; done
mha4mysql-node-0.58.tar.gz                                              100%   55KB  24.5MB/s   00:00    
mha4mysql-node-0.58.tar.gz                                              100%   55KB  23.1MB/s   00:00 

其他兩個數據庫節點依次進行安裝(過程略。。)

2)在管理節點安裝mha-node和mha-manager:

#下載安裝包:
[root@manager ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
[root@manager ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
//安裝mha-node:
[root@manager ~]# tar zxf mha4mysql-node-0.58.tar.gz 
[root@manager ~]# cd mha4mysql-node-0.58
[root@manager mha4mysql-node-0.58]# perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
[root@manager mha4mysql-node-0.58]# make && make install
//安裝mha-manager:
[root@manager ~]# tar zxf mha4mysql-manager-0.58.tar.gz 
[root@manager ~]# cd mha4mysql-manager-0.58
[root@manager mha4mysql-manager-0.58]# perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...loaded. (0.58)
*** Module::AutoInstall configuration finished.
Writing Makefile for mha4mysql::manager
[root@manager mha4mysql-manager-0.58]# make && make install

#在manager上創建所需要的目錄:

[root@manager mha4mysql-manager-0.58]# mkdir /etc/masterha
[root@manager mha4mysql-manager-0.58]# mkdir -p /masterha/app1
[root@manager mha4mysql-manager-0.58]# mkdir /scripts
[root@manager mha4mysql-manager-0.58]# cp samples/conf/* /etc/masterha/
[root@manager mha4mysql-manager-0.58]# cp samples/scripts/* /scripts/

3,配置mha
與絕大多數linux應用程序類似,MHA的正確使用依賴於合理的配置文件。MHA的配置文件與mysql的my.cnf文件配置相似,採取的是param=value的方式來配置,配置文件位於管理節點,通常包括每一個mysql server的主機名,mysql用戶名,密碼,工作目錄等。
1)編輯/etc/masterha/app1.conf文件,內容如下:

[root@manager mha4mysql-manager-0.58]# vim /etc/masterha/app1.cnf 
[server default]
manager_workdir=/masterha/app1    //設置manager的工作目錄
manager_log=/masterha/app1/manager.log  //設置manager的日誌
user=manager    //設置監控用戶manager
password=123.com    //監控用戶manager的密碼
ssh_user=root     //ssh連接用戶
repl_user=rep   //主從複製用戶
repl_password=123.com   //主從複製用戶密碼
ping_interval=1   //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行failover。

[server1]
hostname=172.16.1.110
port=3306
master_binlog_dir=/usr/local/mysql/data   //設置master保存binglog的位置,以便MHA可以找到master的日誌,我這裏的也就是myslq的數據目錄
candidate_master=1   //設置爲候選master,如果設置該參數之後,發生主從切換以後將會將此從庫提升爲主庫。

[server2]
hostname=172.16.1.120
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1

[server3]
hostname=172.16.1.130
port=3306
master_binlog_dir=/usr/local/mysql/data
no_master=1

2)清空masterha_default.cnf文件,連接MySQL的時候會自動尋找app1.cnf配置文件:

[root@manager ~]# >/etc/masterha/masterha_default.cnf 
[root@manager ~]# cat /etc/masterha/masterha_default.cnf 
[root@manager ~]# 

3)ssh有效性驗證:
[root@manager ~]# masterha_check_ssh --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
mysql高可用之MHA+半同步複製
4)集羣複製的有效性驗證(mysql服務必須保持開啓狀態)
[root@manager ~]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
mysql高可用之MHA+半同步複製
驗證成功的話會自動識別出所有服務器和主從狀況;
注:在驗證時若遇到這個錯誤:Can't exec "mysqlbinlog" ...... 解決方法是在所有服務器上執行:
ln -s /usr/local/mysql/bin/* /usr/local/bin/

5)啓動manager:

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /tmp/mha_manager.log &
[1] 19438

注意:在應用unix/linux時,我們一般想讓某個程序在後臺運行,於是我們將常會用&在程序結尾來讓程序自動運行。比如我們要運行mysql在後臺:/usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程序並不像mysqld一樣,這樣我們就需要nohub命令;

#狀態檢查:

[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:19438) is running(0:PING_OK), master:172.16.1.110
#可以看到manager角色運行正常,並且當前的主從架構中的master爲17.16.1.110。

四,故障轉移驗證(自動failover(故障切換))
master掛掉後,MHA當時已經開啓,候選master庫(slave)會自動failover爲master,驗證的方式是先停掉master(master主機),因爲之前的配置文件中,把candicate msaer(candicatemaster主機)作爲候選人,那麼就到slave(slave主機)上查看master的ip是否變爲了candicatemaster主機的ip。

1)停掉master主機的mysql服務,模擬故障:

[root@master ~]# systemctl stop mysqld
[root@master ~]# netstat -anput | grep mysqld
[root@master ~]# 

2)查看MHA的日誌文件:
[root@manager ~]# tailf /masterha/app1/manager.log
mysql高可用之MHA+半同步複製
從MHA的日誌信息出可以看出,原來的master主機已經掛掉了,並且通過mha機制進行故障切換,最後備用master(candicatemaster主機)成功的替換爲新的master。

3)檢查slave2的複製:
#登陸slave主機的mysql,查看slave狀態
mysql高可用之MHA+半同步複製
可以看到master的ip現在爲172.16.1.120,已經切換到和172.16.1.120同步了,本來是和172.16.1.110同步的,說明MHA已經把備用master(candicatemaster主機)提升爲了新的master,IO線程和SQL線程也正常運行,MHA搭建成功。。。

MHA Manager端日常主要操作步驟

1)檢查是否有下列文件,有則刪除。
#發生主從切換後,MHAmanager服務會自動停掉,且在manager的家目錄(/masterha/app1)下面生成文件app1.failover.complete,若要啓動MHA,必須確保無此文件,如果有下面的提示,那麼刪除此文件

//提示信息:
 masterha/app1/app1.failover.complete [error]
[/usr/share/perl5/vendor_perl/MHA/MasterFailover.pm, ln298] Last failover was done at 2015/01/09 10:00:47.
Current time is too early to do failover again. If you want to do failover, manually remove /
masterha/app1/app1.failover.complete and run this script again.
[root@manager ~]# ps -ef | grep manager  //發生failover後,我們可以看到服務會自動停止
root      20455  17892  0 15:28 pts/1    00:00:00 grep --color=auto manager
[root@manager ~]# ls /masterha/app1/
app1.failover.complete  manager.log
#刪除該文件
[root@manager ~]# rm -rf /masterha/app1/app1.failover.complete 

#我暫時先不啓動MHA服務,如果此時要啓動需要加上 ”--ignore_fail_on_start“ 參數,因爲當有slave節點宕掉時,默認是啓動不了的(原來的slave已經替換爲了master,所以MHA認爲是有一臺slave沒有運行的),若加上此參數後,即使由節點宕機也能啓動MHA,如下所示:
# #nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start &>/tmp/mha_manager.log &

2)檢查MHA複製檢查(需要把master設置成candicatade的從服務器)

#首先查看新master的狀態:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      737 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

#把恢復的master設置爲新master的從服務器:

[root@master ~]# systemctl start mysqld   #啓動mysql服務
// 登陸mysql,配置主從複製
mysql> change master to master_host='172.16.1.120',master_port=3306,master_log_file='mysql-bin.000002',mastter_log_pos=737,master_user='rep',master_password='123.com'
    -> ;
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> start slave;  
Query OK, 0 rows affected (0.00 sec)

mysql高可用之MHA+半同步複製
#上面配置主從的命令在mha日誌可以查看到(密碼是不可見的),所以其實也無需登陸master主機查看狀態:
mysql高可用之MHA+半同步複製

#集羣複製驗證:

[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf 

mysql高可用之MHA+半同步複製
3)啓動MHA:

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
[1] 20587
[root@manager ~]# ps -ef | grep manager
root      20587  17892  0 15:51 pts/1    00:00:00 perl /usr/local/bin/masterha_manager --conf=/etc/masterha/app1.cnf
root      20657  17892  0 15:52 pts/1    00:00:00 grep --color=auto manager
//可以看到MHA又重新恢復運行
若要停止MHA可以執行以下命令或者kill掉進程號:
masterha_stop --conf=/etc/masterha/app1.cnf

4)檢查日誌:
mysql高可用之MHA+半同步複製
通過MHA的日誌,得知,此時的master爲剛剛提升爲master,並且原來的master恢復後,成爲了當前master的slave,代表MHA又重新進行監控,如果此時的master掛掉的話,MHA依然會從上面的slave中推選一位成爲master。

5)定期刪除中繼日誌
在配置主從複製中,slave上設置了參數relay_log_purge=0,禁用了自動刪除功能,爲了保證mysql的性能,所以slave節點需要定期刪除中繼日誌(建議每個slave節點刪除中繼日誌的時間錯開)

#計劃任務:
crontab -e
0 5 * * * /usr/local/bin/purge_relay_logs - -user=root --password=123.com --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1 

總結:MHA軟件又兩部分組成,Manager工具包和Node工具包,具體說明如下。
manager工具包主要包括以下幾個工具:masterha_check_ssh (檢查MHA的ssh配置狀況),masterha_check_repl(檢查mysql複製狀況),masterha_manager(啓動MHA),master_check_status(檢測當前MHA運行狀態),masterha_master_monitor(檢測master是否宕機),masterha_master_switch(控制故障轉移【自動或手動】),master_conf_host(添加或刪除配置的server信息)。
Node工具包(這些工具通常由MHA Manager的腳本觸發,無需人爲操作)主要包括以下幾個工具:save_binary_logs(保存和複製master的二進制日誌),apply_diff_relay_logs(識別差異的中繼日誌事件並將其差異的事件應用於其他的slave),filter_mysqlbinlog(去除不必要的rollback事件【MHA已不再使用這個工具】),purge_relay_logs(清除中繼日誌【不會阻塞SQL線程】)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章