溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql之MHA架構

發(fā)布時間:2020-07-22 17:35:57 來源:網絡 閱讀:285 作者:半句再見 欄目:MySQL數據庫

角色

Ip地址

主機名

Server id

類型

master

192.168.1.131

master1

1

主(寫)

Mastercandicate

192.168.1.132

Master2

2

從(讀)

Slave

192.168.1.133

Slave1

3

從(讀)

Manager

192.168.1.134

Manager


管理節(jié)點

 

 

 

準備基礎環(huán)境:

1.在配置好 IP 地址后檢查 selinux,iptables 設置,關閉 selinux ,iptables 服務以便后期主從同步不出錯,時間要同步

 

2. 在四臺機器上配置epelyum和用到perl

[root@master1 ~]# yum -y install epel-rpm-macros.noarch

 

[root@master1 ~]#  yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles  ncftp  perl-Params-Validate perl-CPAN  perl-Test-Mock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

 

3. 配置hosts環(huán)境

[root@master1 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.131 master1

192.168.1.132 master2

192.168.1.133 slave1

192.168.1.134 manager

[root@master1 ~]# for i in master2 slave1 manager; do scp /etc/hosts $i:/etc/ ;done

 

4. 建立ssh交互登錄環(huán)境,四臺都要做

[root@master1 ~]# ssh-keygen -t rsa

[root@master1 ~]# for i in master1 master2 slave1 manager ;do ssh-copy-id -i ~/.ssh/id_rsa.pub $i;done

 

 

配置mysql的半同步復制

為了盡可能的減少主庫硬件損壞宕機造成的數據丟失,因此在配置 MHA 的同時建議配置成MySQL 的半同步復制。

注:mysql 半同步插件是由谷歌提供,具體位置/usr/local/mysql/lib/plugin/下,一個是 master

用的 semisync_master.so,一個是 slave 用的 semisync_slave.so,下面我們就來具體配置一下。如果不清楚 Plugin 的目錄,用如下查找:

 

 

mysql> show variables like '%plugin_dir%';

+---------------+------------------------------+

| Variable_name | Value                        |

+---------------+------------------------------+

| plugin_dir    | /usr/local/mysql/lib/plugin/ |

+---------------+------------------------------+

1 row in set (0.01 sec)

 

 

1、 分別在主從節(jié)點上安裝相關的插件(master, Candicate master,slave

MySQL 上安裝插件需要數據庫支持動態(tài)載入。檢查是否支持,用如下檢測

 

mysql> show variables like '%have_dynamic_loading%';

+----------------------+-------+

| Variable_name        | Value |

+----------------------+-------+

| have_dynamic_loading | YES   |

+----------------------+-------+

 

 

所有 mysql 數據庫服務器,安裝半同步插件(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';

 

 

檢查 Plugin 是否已正確安裝:

mysql> show plugins;

 

| partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |

| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |

| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     |

| ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |

| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |

| rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |

+----------------------------+----------+--------------------+--------------------+---------+

 

mysql> select * from information_schema.plugins;

查看半同步相關信息

 

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         |

+-------------------------------------------+------------+

 

 

2. 修改mysql配置文件,設置主從同步

[root@master1 ~]# 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=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 表示關閉

rpl_semi_sync_master_timeout=10000:毫秒單位 ,該參數主服務器等待確認消息 10 秒后,

不再等待,變?yōu)楫惒椒绞健?/span>

 

[root@master2 ~]# 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 線程在執(zhí)行完一個 relay log 后自動將其刪除,對于 MHA

場景下,對于某些滯后從庫的恢復依賴于其他從庫的 relay log,因此采取禁用自動刪除功能

 

[root@slave1 ~]# 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

 

 

master上查看半同步相關信息

mysql> show variables like '%rpl_semi_sync%';

mysql之MHA架構 

查看半同步狀態(tài):

mysql> show status like '%rpl_semi_sync%';

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 :事務進入等待隊列后,到網絡平均等待時間

 

 

主從同步

 

Master1主機

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql> show master status;

mysql之MHA架構 

第一條 grant 命令是創(chuàng)建一個用于主從復制的帳號,在 master candicate master 的主機上創(chuàng)建即可。

第二條 grant 命令是創(chuàng)建 MHA 管理賬號,所有 mysql 服務器上都需要執(zhí)行。MHA 會在配置文件里要求能遠程登錄到數據庫,所以要進行必要的賦權。

 

Master2主機

mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;

mysql> start slave;

mysql> show slave slave;

mysql之MHA架構 

 

Slave1主機

mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';

mysql>  change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;

mysql> start slave;

mysql> show slave status\G;

mysql之MHA架構 

 

查看 master1 服務器的半同步狀態(tài)

mysql> show status like '%rpl_semi_sync%';

mysql之MHA架構 

 

配置mysql-mha

 

在所有數據庫節(jié)點上安裝 mha4mysql-node-0.56.tar.gz

 

[root@master1 ~]# tar zxf mha4mysql-node-0.56.tar.gz

[root@master1 ~]# cd mha4mysql-node-0.56/

[root@master1 mha4mysql-node-0.56]# perl Makefile.PL

[root@master1 mha4mysql-node-0.56]# make &&make install

其他兩個數據節(jié)點也安裝 mha4mysql-node-0.56.tar.gz(過程略)

 

在管理節(jié)點需要兩個都安裝:mha4mysql-node-0.56.tar.gz mha4mysql-manager-0.56.tar.gz

[root@manager ~]# tar zxf mha4mysql-node-0.56.tar.gz

[root@manager ~]# cd mha4mysql-node-0.56/

[root@manager mha4mysql-node-0.56]# perl Makefile.PL

[root@manager mha4mysql-node-0.56]# make && make install

 

[root@manager mha4mysql-node-0.56]# cd

[root@manager ~]# tar zxf mha4mysql-manager-0.56.tar.gz

[root@manager ~]# cd mha4mysql-manager-0.56/

[root@manager mha4mysql-manager-0.56]# perl Makefile.PL

[root@manager mha4mysql-manager-0.56]# make &&make install

 

[root@manager mha4mysql-manager-0.56]# mkdir /etc/masterha

[root@manager mha4mysql-manager-0.56]# mkdir -p /masterha/app1

[root@manager mha4mysql-manager-0.56]# mkdir /scripts

[root@manager mha4mysql-manager-0.56]# cp samples/conf/* /etc/masterha/

[root@manager mha4mysql-manager-0.56]# cp samples/scripts/* /scripts/

 

 

[root@manager mha4mysql-manager-0.56]# vim /etc/masterha/app1.cnf

[server default]

manager_workdir=/masterha/app1

manager_log=/masterha/app1/manager.log

user=manager

password=123

ssh_user=root

repl_user=rep

repl_password=123

ping_interval=1

 

[server1]

hostname=192.168.1.131

port=3306

master_binlog_dir=/usr/local/mysql/data

candidate_master=1

 

[server2]

hostname=192.168.1.132

port=3306

master_binlog_dir=/usr/local/mysql/data

candidate_master=1

 

 

[server3]

hostname=192.168.1.133

port=3306

master_binlog_dir=/usr/local/mysql/data

no_master=1

保存退出

[root@manager mha4mysql-manager-0.56]# > /etc/masterha/masterha_default.cnf

 

 

manager_workdir=/masterha/app1 //設置 manager 的工作目錄

manager_log=/masterha/app1/manager.log //設置 manager 的日志

user=manager //設置監(jiān)控用戶 manager

password=123456 //監(jiān)控用戶 manager 的密碼

ssh_user=root //ssh 連接用戶

repl_user=mharep //主從復制用戶

repl_password=123.abc //主從復制用戶密碼

ping_interval=1 //設置監(jiān)控主庫,發(fā)送 ping 包的時間間隔,默認是 3 秒,嘗試三次沒有回

應的時候自動進行 railover

master_binlog_dir=/usr/local/mysql/data //設置 master 保存 binlog 的位置,以便 MHA

以找到 master 的日志,我這里的也就是 mysql 的數據目錄

candidate_master=1 //設置為候選 master,如果設置該參數以后,發(fā)生主從切換以后將會

將此從庫提升為主庫。

 

 

ssh有效性驗證:

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

正確顯示結果沒有報錯

mysql之MHA架構 

 

集群復制的有效性驗證(mysql必須都啟動):

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

命令執(zhí)行完最后報錯的地方

mysql之MHA架構 

 

解決辦法在所有服務器上執(zhí)行:

[root@manager mha4mysql-manager-0.56]# ln -s /usr/local/mysql/bin/* /usr/local/bin/

mysql之MHA架構 

 

 

啟動manger

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

[1] 1319

 

狀態(tài)檢查

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

app1 (pid:1319) is running(0:PING_OK), master:192.168.1.131

 

故障轉移驗證:

1. 停掉master1

[root@master1 mha4mysql-node-0.56]# service mysqld stop

2. 查看MHA日志

[root@manager ~]# tail -f /masterha/app1/manager.log

mysql之MHA架構 

 

3. 登錄slave1mysql查看slave狀態(tài)

mysql> show slave status\G;

mysql之MHA架構 

 

MHA Manager 端日常主要操作步驟

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

發(fā)生主從切換后,MHAmanager 服務會自動停掉,且在 manager_workdir/masterha/app1

目錄下面生成文件 app1.failover.complete,若要啟動 MHA,必須先確保無此文件)

 

[root@manager ~]# ll /masterha/app1/

total 24

-rw-r--r-- 1 root root     0 Aug  8 02:02 app1.failover.complete

-rw-r--r-- 1 root root 20955 Aug  8 02:02 manager.log

[root@manager ~]# rm -rf /masterha/app1/app1.failover.complete

 

 

 

2)檢查 MHA 復制檢查:(需要把 master1 設置成 candicatade 的從服務器)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='123';

mysql> start slave;

mysql之MHA架構 

3)停止 MHAmasterha_stop --conf=/etc/masterha/app1.cnf

 

4)啟動 MHA

#nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &

當有 slave 節(jié)點宕掉時,默認是啟動不了的,加上 --ignore_fail_on_start 即使有節(jié)點宕掉也

能啟動 MHA,如下:

#nohup  masterha_manager  --conf=/etc/masterha/app1.cnf  --ignore_fail_on_start

&>/tmp/mha_manager.log &

 

5) 檢查狀態(tài):

# masterha_check_status --conf=/etc/masterha /app1.cnf

 

6) 檢查日志:

#tail -f /masterha/app1/manager.log

 

7)主從切換后續(xù)工作

重構:

重構就是你的主掛了,切換到 Candicate master 上,Candicate master 變成了主,因此重構的一種方案原主庫修復成一個新的 slave主庫切換后,把原主庫修復成新從庫,然后重新執(zhí)行以上 5 步。原主庫數據文件完整的情況下,可通過以下方式找出最后執(zhí)行的 CHANGE MASTER 命令:

[root@manager ~]#  grep "CHANGE MASTER TO MASTER" /masterha/app1/manager.log | tail -1

Wed Aug  8 02:02:40 2018 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='xxx';

 

定期刪除中繼日志

在配置主從復制中,slave 上設置了參數 relay_log_purge=0,所以 slave 節(jié)點需要定期刪除中繼日志,建議每個 slave 節(jié)點刪除中繼日志的時間錯開。

corntab -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

 

 

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI