天天看點

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(寫入)
CandicateMaster(備用master) 172.16.1.120 2 從mysql(讀) CenOS 7.3
slave 172.16.1.130 3

其中master對外提供寫服務,備選master(實際的slave,主機名CandicateMaster)提供讀服務,slave也提供相關的讀服務,一旦master當機,将會把備選master提升為新的master,slave指向新的master,manager作為管理伺服器(無需安裝mysql)。

一,基礎環境準備

1,在配置好ip位址後檢查selinux,iptables設定,關閉selinux,iptables服務以便後期主從同步不出錯,注:時間要同步。

#配置時間同步

//安裝ntpdate工具:
[root@manager ~]# yum -y install ntp ntpdate
//設定系統時區為上海:
[root@manager ~]# timedatectl set-timezone Asia/Shanghai 
//設定系統時間與網絡時間同步:
[root@manager ~]# ntpdate 2.asia.pool.ntp.org
//将系統時間寫入硬體時間:
[root@manager ~]# hwclock --systohc
//強制系統時間寫入CMOS中防止重新開機失效:
[root@manager ~]# hwclock -w            

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會在配置檔案裡要求能遠端登入到資料庫,所有要進行必要的賦權。

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+半同步複制
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           
#計劃任務:
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