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。整個故障轉移過程中對應用程式完全透明。

在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環境:
拷貝給其他主機:
[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> 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)。
#檢視半同步狀态:
有幾個參數值得關注的:
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> 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,代表從伺服器能正常連接配接主伺服器
#檢視master伺服器的半同步狀态:
可以看到目前已經有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
4)叢集複制的有效性驗證(mysql服務必須保持開啟狀态)
[root@manager ~]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
驗證成功的話會自動識别出所有伺服器和主從狀況;
注:在驗證時若遇到這個錯誤: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
從MHA的日志資訊出可以看出,原來的master主機已經挂掉了,并且通過mha機制進行故障切換,最後備用master(candicatemaster主機)成功的替換為新的master。
3)檢查slave2的複制:
#登陸slave主機的mysql,檢視slave狀态
可以看到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)
#上面配置主從的指令在mha日志可以檢視到(密碼是不可見的),是以其實也無需登陸master主機檢視狀态:
#叢集複制驗證:
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
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