溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL高可用之MHA部署

發(fā)布時(shí)間:2020-08-06 19:49:45 來源:網(wǎng)絡(luò) 閱讀:227 作者:warrent 欄目:MySQL數(shù)據(jù)庫

MHA(Master High Availability)目前在MySQL高可用方面是一個(gè)相對(duì)成熟的解決方案,在MySQL故障切換過程中,MHA能做到在0~30秒之內(nèi)自動(dòng)完成數(shù)據(jù)庫的故障切換操作,并且在進(jìn)行故障切換的過程中,MHA能在最大程度上保證數(shù)據(jù)的一致性,以達(dá)到真正意義上的高可用。 MHA里有兩個(gè)角色一個(gè)是MHA Node(數(shù)據(jù)節(jié)點(diǎn))另一個(gè)是MHA Manager(管理節(jié)點(diǎn))。 MHA Manager可以單獨(dú)部署在一臺(tái)獨(dú)立的機(jī)器上管理多個(gè)master-slave集群,也可以部署在一臺(tái)slave節(jié)點(diǎn)上。MHA Node運(yùn)行在每臺(tái)MySQL服務(wù)器上,MHA Manager會(huì)定時(shí)探測(cè)集群中的master節(jié)點(diǎn),當(dāng)master出現(xiàn)故障時(shí),它可以自動(dòng)將最新數(shù)據(jù)的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個(gè)故障轉(zhuǎn)移過程對(duì)應(yīng)用程序完全透明。

MHA工作架構(gòu)示意圖如下:

MySQL高可用之MHA部署

在MHA架構(gòu)中,可以采用半同步復(fù)制的方式,來最大限度的保證數(shù)據(jù)的一致性,MySQL的主從復(fù)制中,默認(rèn)是采用異步來做主從復(fù)制的,但是異步有些弊端,下面是對(duì)異步、半同步的一個(gè)簡(jiǎn)單介紹:

  • 異步與半同步:默認(rèn)情況下MySQL的復(fù)制是異步的,Master上所有的更新操作寫入Binlog之后并不確保所有的更新都被復(fù)制到Slave之上。異步操作雖然效率高,但是在Master/Slave出現(xiàn)問題的時(shí)候,存在很高數(shù)據(jù)不同步的風(fēng)險(xiǎn),甚至可能丟失數(shù)據(jù)。 MySQL5.5引入半同步復(fù)制功能的目的是為了保證在master出問題的時(shí)候,至少有一臺(tái)Slave的數(shù)據(jù)是完整的。在超時(shí)的情況下也可以臨時(shí)轉(zhuǎn)入異步復(fù)制,保障業(yè)務(wù)的正常使用,直到一臺(tái)salve追趕上之后,繼續(xù)切換到半同步模式。

MHA相比較于其他HA軟件,MHA的目的在于維持MySQL replication中master庫的高可用性,其最大的特點(diǎn)是可以修復(fù)多個(gè)slave之間的差異日志,最終使所有slave保持?jǐn)?shù)據(jù)一致,然后從中選擇一個(gè)充當(dāng)新的master,并將其他slave指向它。

大概流程如下:
1、從宕機(jī)的master保存二進(jìn)制日志事件;
2、識(shí)別含有最新更新的slave;
3、應(yīng)用差異的中繼日志(relay log)到其他slave;
4、應(yīng)用從master保存的二進(jìn)制日志事件;
5、提升一個(gè)slave為新master;
6、使其他的slave連接到新的master進(jìn)行復(fù)制。

目前MHA主要支持一主多從的架構(gòu),要搭建MHA,一般MySQL集群中最少有三臺(tái)數(shù)據(jù)庫節(jié)點(diǎn),一主二從,即:一臺(tái)充當(dāng)master,一臺(tái)充當(dāng)備用master,另外一臺(tái)充當(dāng)slave。

MHA主要特性如下:

1、MHA切換不依賴實(shí)例使用存儲(chǔ)引擎和BINLOG格式;
2、MHA不會(huì)增加MySQL服務(wù)器性能開銷,除MHA管理節(jié)點(diǎn)外無需增加額外服務(wù)器;
3、在MySQL服務(wù)器上部署MHA數(shù)據(jù)節(jié)點(diǎn)不會(huì)影響當(dāng)前實(shí)例運(yùn)行;
4、MHA實(shí)現(xiàn)自動(dòng)故障切換,也可以手動(dòng)觸發(fā)在線切換;
5、MHA可以實(shí)現(xiàn)秒級(jí)的故障切換;
6、MHA可以將任意slave提升master,也可以在切換時(shí)指定master候選節(jié)點(diǎn);
7、MHA提供擴(kuò)展接口,允許在MHA切換過程中的特定時(shí)間點(diǎn)執(zhí)行用戶自定義腳本。

MHA支持與限制:

1、只支持BINLOG V4版本,要求MySQL 5.0或更高版本。
2、候選master節(jié)點(diǎn)必須開啟log-bin參數(shù),如果所有從節(jié)點(diǎn)都為開啟,則不進(jìn)行故障轉(zhuǎn)移。
3、在MHA 0.52版本前不支持多master模式
4、MHA默認(rèn)不支持多級(jí)主從復(fù)制,通過修改配置文件和設(shè)置multi_tier_slave參數(shù)

一、環(huán)境準(zhǔn)備

OS IP地址 主機(jī)名&角色 類型
Centos 7.5 192.168.20.2 master 主master(寫操作)
Centos 7.5 192.168.20.3 slave1 從(備主)mysql(讀操作)
Centos 7.5 192.168.20.4 slave2 從mysql(讀操作)
Centos 7.5 192.168.20.5 manager 管理節(jié)點(diǎn)

在上述環(huán)境中,master對(duì)外提供寫服務(wù),slave提供讀操作,一旦master宕機(jī),將會(huì)把其中一臺(tái)slave(我這里將指定的是備主)提升為新的master,slave同時(shí)也指向新的master,manager作為管理服務(wù)器。

1、 配置hosts文件,主機(jī)之間可互相解析

以下操作在其中一個(gè)節(jié)點(diǎn)執(zhí)行即可。

#編寫host文件
[root@master ~]# cat >> /etc/hosts << EOF
> 192.168.20.2    master
> 192.168.20.3    slave1
> 192.168.20.4    slave2
> 192.168.20.5    manager
> EOF
> #將編寫好的hosts文件分發(fā)到其他節(jié)點(diǎn)
[root@master ~]# for i in master slave1 slave2 manager;do scp /etc/hosts $i:/etc/;done
2、配置ssh免密登錄

注:集群中的所有主機(jī)都需要保證互相可以免密登錄。

將以下兩條命令在所有節(jié)點(diǎn)上執(zhí)行一次,即可完成主機(jī)間的免密登錄

# 創(chuàng)建密鑰對(duì)
[root@master ~]# ssh-keygen -t rsa
#將公鑰分發(fā)到其他節(jié)點(diǎn)
[root@master ~]# for i in master slave1 slave2 manager;do ssh-copy-id $i;done

當(dāng)所有節(jié)點(diǎn)都執(zhí)行上面的兩條命令,即可使用以下命令來驗(yàn)證,免密登錄是否成功:

#如果每臺(tái)主機(jī)上執(zhí)行以下指令不用輸入密碼就可以獲取所有主機(jī)的主機(jī)名,說明免密登錄配置無誤
[root@master ~]# for i in master slave1 slave2 manager;do ssh $i hostname;done
master
slave1
slave2
manager
3、配置epel并安裝MHA所需依賴

注:以下命令需要在所有節(jié)點(diǎn)執(zhí)行。

#配置阿里的epel源(為加快安裝速度),若非國(guó)內(nèi)環(huán)境,執(zhí)行yum -y install epel-release進(jìn)行配置即可
[root@master ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@master ~]# yum makecache           #建立元數(shù)據(jù)緩存
# 安裝所需依賴
[root@master ~]# 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

二、基于半同步進(jìn)行主從復(fù)制

注:接下來所有操作,如果沒有特別說明,是需要在所有數(shù)據(jù)庫服務(wù)器上進(jìn)行執(zhí)行的。

1、查找半同步所需插件
mysql> show variables like '%plugin_dir%';    #查找插件所在目錄(每臺(tái)DB服務(wù)器可能不一樣)
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.01 sec)
mysql> show variables like '%have_dynamic%';       #檢查是否支持動(dòng)態(tài)檢測(cè)
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.01 sec)

[root@master ~]# ls /usr/local/mysql/lib/plugin/ | egrep 'master|slave'
#確定插件的目錄下有以下兩個(gè)文件(默認(rèn)安裝數(shù)據(jù)庫后就有這些的)
semisync_master.so
semisync_slave.so
2、安裝插件
# semisync_master.so和semisync_slave.so為上面查詢到的插件名字
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
3、檢查Plugin是否已正確安裝:
mysql> show plugins;
# 或者
mysql> select * from information_schema.plugins;

show plugins執(zhí)行后返回如下結(jié)果,表示沒有問題:

MySQL高可用之MHA部署

4、查看半同步相關(guān)信息
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         |
+-------------------------------------------+------------+

可以看到半同步插件還是未啟用的off狀態(tài),所以需要修改my.cnf配置文件,如下:

master主機(jī)完整配置文件如下:

[root@master ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
server_id=1 
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin=mysql-bin
binlog_format=mixed
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
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表示關(guān)閉
  • rpl_semi_sync_master_timeout=1000:毫秒單位 ,該參數(shù)主服務(wù)器等待確認(rèn)消息10秒后,不再等待,變?yōu)楫惒椒绞健?/li>

slave1主機(jī)完整配置文件如下:

[root@slave1 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
server_id=2
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin=mysql-bin
binlog_format=mixed
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log = relay-bin
relay-log-index = slave-relay-bin.index

slave2主機(jī)的完整配置文件如下:

[root@slave2 ~]# cat /etc/my.cnf 
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
server_id=3
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin = mysql-bin
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
rpl_semi_sync_slave_enabled=1
#由于slave2只是用來做一個(gè)slave主機(jī),所以無需開啟master的半同步

在配置主從復(fù)制中,由于主和備主這兩臺(tái)主機(jī)上設(shè)置了參數(shù)relay_log_purge=0(表示不自動(dòng)清除中繼日志),所以slave節(jié)點(diǎn)需要定期刪除中繼日志,建議每個(gè)slave節(jié)點(diǎn)刪除中繼日志的時(shí)間錯(cuò)開。

crontab -e
0 5 * * * /usr/local/bin/purge_relay_logs - -user=root --password=pwd123 --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1

更改配置文件后,需要執(zhí)行以下命令進(jìn)行重啟MySQL。

[root@master ~]# systemctl restart mysqld

查看半同步狀態(tài),確認(rèn)已開啟:

mysql> show variables like '%rpl_semi_sync%';       #查看半同步是否開啟
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |    #這個(gè)值要為ON
| rpl_semi_sync_master_timeout              | 1000       |
| 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         |    #這個(gè)值也要為ON。
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.00 sec)

mysql> show status like '%rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |  
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)
#關(guān)于上個(gè)命令查看到的信息,有幾個(gè)狀態(tài)值得關(guān)注,將在下面寫下來。
  • rpl_semi_sync_master_status :顯示主服務(wù)是異步復(fù)制模式還是半同步復(fù)制模式,ON為半同步;
  • rpl_semi_sync_master_clients :顯示有多少個(gè)從服務(wù)器配置為半同步復(fù)制模式;
  • rpl_semi_sync_master_yes_tx :顯示從服務(wù)器確認(rèn)成功提交的數(shù)量
  • rpl_semi_sync_master_no_tx :顯示從服務(wù)器確認(rèn)不成功提交的數(shù)量
  • rpl_semi_sync_master_tx_avg_wait_time :事務(wù)因開啟 semi_sync ,平均需要額外等待的時(shí)間
  • rpl_semi_sync_master_net_avg_wait_time :事務(wù)進(jìn)入等待隊(duì)列后,到網(wǎng)絡(luò)平均等待時(shí)間
5、創(chuàng)建相關(guān)用戶

1)master主機(jī)操作如下:

# 創(chuàng)建用于同步的用戶
mysql> grant replication slave on *.* to mharep@'192.168.20.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (1.00 sec)
# 創(chuàng)建用戶mha的manager監(jiān)控的用戶
mysql> grant all on *.* to manager@'192.168.20.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
# 查看master二進(jìn)制相關(guān)的信息
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 744
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

2)slave1主機(jī)操作如下:

# 創(chuàng)建用于同步的用戶
mysql> grant replication slave on *.* to mharep@'192.168.20.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (1.00 sec)
# 創(chuàng)建用戶mha的manager監(jiān)控的用戶
mysql> grant all on *.* to manager@'192.168.20.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)

3)slave2主機(jī)操作如下:

由于slave2無需做備主,所以不用創(chuàng)建用于同步數(shù)據(jù)的賬戶

#創(chuàng)建manager監(jiān)控賬號(hào)
mysql> grant all on *.* to manager@'192.168.20.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
6、配置主從復(fù)制

以下操作需要在slave1和slave2主機(jī)上分別執(zhí)行一次,以便同步master主機(jī)的數(shù)據(jù)。

#指定master主機(jī)的相關(guān)信息
mysql> change master to
    -> master_host='192.168.20.2',
    -> master_port=3306,
    -> master_user='mharep',
    -> master_password='123.com',
    -> master_log_file = 'mysql-bin.000001',     #這是在master主機(jī)上查看到的二進(jìn)制日志名
    -> master_log_pos=744;     #同上,這是查看到的二進(jìn)制日志的position
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;      #啟動(dòng)slave
Query OK, 0 rows affected (0.00 sec)

最后查看slave主機(jī)的狀態(tài):

MySQL高可用之MHA部署

在master主機(jī)上查看半同步相關(guān)信息,會(huì)發(fā)現(xiàn)同步的client已經(jīng)變成了2,如下:

MySQL高可用之MHA部署

7、安裝MHA-node

注:需要MHA-node需要在所有節(jié)點(diǎn)安裝(包括manager主機(jī)節(jié)點(diǎn))

#下載包
[root@master src]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
#安裝
[root@master src]# tar zxf mha4mysql-node-0.58.tar.gz 
[root@master src]# cd mha4mysql-node-0.58/
[root@master mha4mysql-node-0.58]# perl Makefile.PL 
[root@master mha4mysql-node-0.58]# make && make install

注:接下來的所有操作,如果沒有特別標(biāo)注,則只需要在manager主機(jī)節(jié)點(diǎn)上執(zhí)行即可。

8、安裝MHA-manager

#下載包
[root@manager src]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
#安裝
[root@manager src]# tar zxf mha4mysql-manager-0.58.tar.gz 
[root@manager src]# cd mha4mysql-manager-0.58/
[root@manager mha4mysql-manager-0.58]# perl Makefile.PL 
[root@manager mha4mysql-manager-0.58]# make && make install

9、創(chuàng)建相應(yīng)目錄及復(fù)制所需文件

[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]# pwd
/usr/src/mha4mysql-manager-0.58     #確定當(dāng)前所在目錄
[root@manager mha4mysql-manager-0.58]# cp samples/conf/* /etc/masterha/
[root@manager mha4mysql-manager-0.58]# cp samples/scripts/* /scripts/

10、修改mha-manager配置文件

注:manager共有兩個(gè)主要的配置文件,一個(gè)是通用默認(rèn)的,一個(gè)是單獨(dú)的。需要將默認(rèn)通用的配置文件的內(nèi)容清空,如下:

#清空默認(rèn)的配置文件
[root@manager masterha]# > /etc/masterha/masterha_default.cnf

然后修改單獨(dú)的配置文件:

[root@manager ~]# cat /etc/masterha/app1.cnf   #修改如下:
[server default]
manager_workdir=/masterha/app1    #指定工作目錄
manager_log=/masterha/app1/manager.log     #指定日志文件
user=manager           #指定manager管理數(shù)據(jù)庫節(jié)點(diǎn)所使用的用戶名
password=123.com       #對(duì)應(yīng)的是上面用戶的密碼
ssh_user=root        #指定配置了ssh免密登錄的系統(tǒng)用戶
repl_user=mharep    #指定用于同步數(shù)據(jù)的用戶名
repl_password=123.com    #對(duì)應(yīng)的是上面同步用戶的 密碼
ping_interval=1        #設(shè)置監(jiān)控主庫,發(fā)送ping包的時(shí)間間隔,默認(rèn)是3秒,嘗試三次沒有回應(yīng)時(shí)自動(dòng)進(jìn)行切換

[server1]
hostname=192.168.20.2
port=3306
master_binlog_dir=/usr/local/mysql/data     #指定master保存二進(jìn)制日志的路徑,以便MHA可以找到master的日志
candidate_master=1     #設(shè)置為候選master,設(shè)置該參數(shù)后,發(fā)生主從切換以后將會(huì)將此庫提升為主庫

[server2]
hostname=192.168.20.3
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1      #設(shè)置為候選master

[server3]
hostname=192.168.20.4
port=3306
master_binlog_dir=/usr/local/mysql/data
no_master=1      #設(shè)置的不為備選主庫

完整無注釋的配置文件如下:

[root@manager ~]# cat /etc/masterha/app1.cnf 
[server default]
manager_workdir=/masterha/app1   
manager_log=/masterha/app1/manager.log    
user=manager
password=123.com
ssh_user=root
repl_user=mharep
repl_password=123.com
ping_interval=1

[server1]
hostname=192.168.20.2
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1

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

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

11、啟動(dòng)前測(cè)試

驗(yàn)證SSH有效性:

MySQL高可用之MHA部署

驗(yàn)證集群復(fù)制的有效性(MySQL必須都啟動(dòng)),如下:

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

執(zhí)行上述命令可能會(huì)報(bào)錯(cuò)如下:

MySQL高可用之MHA部署

這是因?yàn)闆]有在mysql節(jié)點(diǎn)上找到mysqlbinlog這個(gè)命令,只需要在所有MySQL主機(jī)節(jié)點(diǎn)上執(zhí)行以下命令創(chuàng)建軟連接即可,如下:

#注:以下命令是在所有數(shù)據(jù)庫服務(wù)節(jié)點(diǎn)執(zhí)行
[root@master ~]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

我這里再次執(zhí)行命令,還報(bào)錯(cuò)如下:
MySQL高可用之MHA部署

解決辦法:

[root@master ~]# rpm -qa |grep -i dbd       #查找下面的軟件包
perl-DBD-MySQL-4.023-6.el7.x86_64
perl-DBD-SQLite-1.39-3.el7.x86_64
#卸載下面的軟件包
[root@master ~]# rpm -e --nodeps perl-DBD-MySQL-4.023-6.el7.x86_64
[root@master ~]# yum -y install perl-DBD-MySQL    #再次yum安裝即可解決報(bào)錯(cuò)

最后檢查命令執(zhí)行成功,如下:

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

返回以下信息,表示無誤:

MySQL高可用之MHA部署

12、啟動(dòng)manager

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

注:可以多次執(zhí)行上述命令,指定不同的app.cnf配置文件,以便監(jiān)控多個(gè)MySQL集群,我這里就一個(gè)MySQL集群,所以只需要執(zhí)行上述一條命令即可。

13、驗(yàn)證故障轉(zhuǎn)移

可以自行查看當(dāng)前MySQL集群中目前的主是哪臺(tái)服務(wù)器,我這里MySQL集群中的主是master主機(jī),如下:

MySQL高可用之MHA部署

現(xiàn)在模擬master主機(jī)故障,然后再查看集群中的master是哪臺(tái),如下:

# 在master主機(jī)停止MySQL服務(wù)
[root@master ~]# systemctl stop mysqld
# 再次在slave2主機(jī)上查看當(dāng)前的主是哪臺(tái)?
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.20.3    # 可以看到當(dāng)前的主是slave1這臺(tái)備主
                  Master_User: mharep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 744
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320

三、MHA Manager端日常維護(hù)

1)檢查是否有以下文件,有則刪除

MHA Manager服務(wù)發(fā)生主從切換后,MHA manager服務(wù)會(huì)自動(dòng)停止,且在manager_workdir(/masterha/app1/)目錄下面生成app1.failover.complete文件,若要再次啟動(dòng)MHA,必須先確保沒有這個(gè)文件,如果有app1.failover.complete或者app1.failover.error這個(gè)文件,則會(huì)報(bào)錯(cuò)如下:

MySQL高可用之MHA部署

只需要?jiǎng)h除這個(gè)文件在將master主機(jī)指向新的master(也就是slave1)即可成功啟動(dòng)manager服務(wù),如下:

# 刪除
[root@manager app1]# rm -rf /masterha/app1/app1.failover.complete 
# 在manager服務(wù)的日志中查看指定master的信息,如下:
[root@manager app1]# cat /masterha/app1/manager.log | grep MASTER
#如果服務(wù)已運(yùn)行很久,那么肯定是看最后一條信息,日志里已經(jīng)把指向新的master需要執(zhí)行的指令記錄了下來
#但是需要自己手動(dòng)寫密碼
Fri Feb 21 17:57:37 2020 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.20.3', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=744, MASTER_USER='mharep', MASTER_PASSWORD='xxx';
Fri Feb 21 17:57:38 2020 - [info]  Executed CHANGE MASTER.
# 在master主機(jī)上執(zhí)行下面命令,以便指定slave2為主:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.20.3', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=744, MASTER_USER='mharep', MASTER_PASSWORD='123.com';
#啟動(dòng)slave功能
mysql> start slave;

#再次啟動(dòng)manager服務(wù)
[root@manager app1]#  nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /var/log/mha_manager.log &
[1] 16130
# 通過jobs -l查看到狀態(tài)為“運(yùn)行中”,即說明manager重新運(yùn)行成功
[root@manager app1]# jobs -l
[1]+ 16130 運(yùn)行中               nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/var/log/mha_manager.log &
2)檢查MHA復(fù)制
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
3)停止MHA
[root@manager ~]# masterha_stop --conf=/etc/masterha/app1.cnf
4)啟動(dòng)MHA
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &

當(dāng)有slave節(jié)點(diǎn)宕機(jī)時(shí),manager服務(wù)是無法啟動(dòng)的,建議在配置文件中暫時(shí)注釋掉宕機(jī)節(jié)點(diǎn)的信息,待修復(fù)后再取消注釋。

5)檢查狀態(tài)
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf   #manager沒有啟動(dòng)時(shí)的狀態(tài)如下
app1 is stopped(2:NOT_RUNNING).
#啟動(dòng)manager服務(wù)再進(jìn)行檢查如下
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
[1] 19651
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf 
app1 (pid:19651) is running(0:PING_OK), master:192.168.20.3
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI