MySQL——MHA集羣(筆記需補充)

一、數據庫高可用集羣

  • 相關概念
  1. 集羣:多臺服務器提供相同服務
  2. 集羣分類:HA高可用集羣、LB負載均衡集羣
  3. 集羣服務軟件: LVS 、haproxy 、nginx 、keepalived

1.1、MHA簡介

  • MHA(Master High Availability)
  1. 數據庫的自動故障切換操作能做到在0~30秒內完成
  2. MHA能確保在故障切換過程中最大限度保證數據的一致性,以達到真正意義上的高可用

1.2、MHA組成

  • MHA Manager (管理節點)
  1. 管理所有數據庫服務器
  2. 可以單獨部署在一臺獨立的機器上
  3. 也可以部署在某臺數據庫服務器上
  • MHA Node (數據節點)
  1. 存儲數據的MySQL服務器
  2. 運行在每臺MySQL服務器上

1.3、MHA工作過程

  1. Manager定時探測集羣中的master節點
  2. 當master故障時,Manager自動將擁有最新數據的slave提升爲新的master。
  3. MHA也可以同時管理多個主從複製組。

二、搭建集羣環境

2.1、實驗拓撲

2.2、環境準備

2.2.1、軟件安裝

  1. 準備如下軟件
[root@manager mha]# ls
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm          
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm 
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
  1. 安裝軟件(51、52、53、57)
]# yum -y install perl-*.rpm

2.2.2、配置ssh免密登錄

  • 配置三臺數據庫之間免密登錄
  1. 數據庫1
[root@db1 ~]# ssh-keygen	//創建密鑰對
[root@db1 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db1 ~]# ssh-copy-id root@192.168.4.52
[root@db1 ~]# ssh-copy-id root@192.168.4.53
  1. 數據庫2
[root@db2 ~]# ssh-keygen
[root@db2 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db2 ~]# ssh-copy-id root@192.168.4.51
[root@db2 ~]# ssh-copy-id root@192.168.4.53
  1. 數據庫3
[root@db3 ~]# ssh-keygen
[root@db3 ~]# ls .ssh
id_rsa  id_rsa.pub
[root@db3 ~]# ssh-copy-id root@192.168.4.51
[root@db3 ~]# ssh-copy-id root@192.168.4.52
  • 配置管理主機可以免密登錄所有數據庫服務器
[root@manager ~]# ssh-keygen
[root@manager ~]# ssh-copy-id root@192.168.4.51
[root@manager ~]# ssh-copy-id root@192.168.4.52
[root@manager ~]# ssh-copy-id root@192.168.4.53

2.3、配置MySQL一主多從同步結構

2.3.1、配置主服務器

[root@db1 ~]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master

[root@db1 ~]# systemctl restart mysqld
[root@db1 ~]# mysql -uroot -p123456
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

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

2.3.2、配置從服務器

  1. 第一臺從服務器
[root@db2 ~]# vim /etc/my.cnf
[mysqld]
server_id=52

[root@db2 ~]# systemctl restart mysqld
[root@db2 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master.000001",master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.11 sec)

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

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: db2-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 第二臺從服務器
[root@db3 ~]# vim /etc/my.cnf
[mysqld]
server_id=53

[root@db3 ~]# systemctl restart mysqld
[root@db3 ~]# mysql -uroot -p123456
mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master.000001",master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: db3-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

三、配置管理節點

3.1、安裝MHA相關軟件

[root@manager mha]# ls                                
mha4mysql-manager-0.56.tar.gz                   
mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager mha]# yum -y install perl-ExtUtils-*  perl-CPAN*

[root@manager mha]# tar -zxf mha4mysql-manager-0.56.tar.gz
[root@manager mha]# ls mha4mysql-manager-0.56
AUTHORS  COPYING  inc  Makefile.PL  META.yml  rpm      t
bin      debian   lib  MANIFEST     README    samples  test
[root@manager mha]# cd mha4mysql-manager-0.56
[root@manager mha4mysql-manager-0.56]# perl Makefile.PL
*** Module::AutoInstall version 1.03
*** 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.56)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
Writing MYMETA.yml and MYMETA.json

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

3.2、創建並編輯主配置文件

3.2.1、 創建配置文件

[root@manager mha4mysql-manager-0.56]# ls samples/conf/
app1.cnf  masterha_default.cnf
[root@manager mha4mysql-manager-0.56]# mkdir /etc/mha
[root@manager mha4mysql-manager-0.56]# cp samples/conf/app1.cnf  /etc/mha/

3.2.2、編輯配置文件

]# vim /etc/mha/app1.cnf
[server default]		//管理服務默認配置
manager_workdir=/etc/mha	//指定工作目錄
manager_log=/etc/mha/manager.log	//指定日誌文件
master_ip_failover_script=/etc/mha/master_ip_failover	//指定故障切換腳本

ssh_user=root	//訪問ssh服務用戶
ssh_port=22		//ssh服務端口

repl_user=repluser	//數據同步授權用戶
repl_password=123456	//密碼

user=root	//監控用戶
password=123456		//密碼

[server1]		//指定第一臺數據庫服務器地址
hostname=192.168.4.51	//服務器IP地址
port=3306				//服務端口
candidate_master=1		//競選主服務器

[server2]		//指定第二臺數據庫服務器
hostname=192.168.4.52		
port=3306
candidate_master=1

[server3]		//指定第三臺數據庫服務器
hostname=192.168.4.53
port=3306
candidate_master=1

3.3、創建故障切換腳本

鏈接:腳本文件共享地址
提取碼:3mxv

]# vim /etc/mha/master_ip_failover
 35 my $vip = '192.168.4.100/24';  //定義了vip地址
 36 my $key = "1";					//定義了地址編號
 37 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";	//綁定了vip地址
 38 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";	//釋放vip地址
  • 賦予腳本可執行權限
]# chmod +x /etc/mha/master_ip_failover

四、配置數據庫節點

4.1、給主服務器配置vip地址

[root@db1 ~]# ifconfig ens33:1 192.168.4.100/24
[root@db1 ~]# ifconfig ens33:1 
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.4.100  netmask 255.255.255.0  broadcast 192.168.4.255
        ether 00:0c:29:4c:16:33  txqueuelen 1000  (Ethernet)

4.2、配置數據庫服務器

4.2.1、配置數據庫服務器1

  1. 加載master和slave角色模塊 並啓用模塊,禁止自動刪除中繼日誌文件
]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
  1. 重啓數據庫服務
[root@db1 ~]# systemctl restart mysqld          
[root@db1 ~]# netstat -utnlp | grep mysql
  1. 安裝MHA-node
[root@db1 ~]# cd mha
[root@db1 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加監控用戶
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

4.2.2、配置數據庫服務器2

  1. 加載master和slave角色模塊 並啓用模塊,禁止自動刪除中繼日誌文件
[root@db2 ~]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
  1. 啓用binlog日誌
[root@db2 ~]# vim /etc/my.cnf
log_bin=master52
  1. 同步連接用戶
mysql> grant replication slave on *.*  to  repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
  1. 重啓數據庫服務
[root@db2 ~]# systemctl restart mysqld          
[root@db2 ~]# netstat -utnlp | grep mysql
  1. 查看slave狀態
mysql> show slave status \G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 安裝MHA-node
[root@db2 ~]# cd mha
[root@db2 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加監控用戶
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

4.2.3、配置數據庫服務器3

  1. 加載master和slave角色模塊 並啓用模塊,禁止自動刪除中繼日誌文件
[root@db3 ~]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
  1. 啓用binlog日誌
[root@db3 ~]# vim /etc/my.cnf
log_bin=master53
  1. 同步連接用戶
mysql> grant replication slave on *.*  to  repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
  1. 重啓數據庫服務
[root@db3 ~]# systemctl restart mysqld          
[root@db3 ~]# netstat -utnlp | grep mysql
  1. 查看slave狀態
mysql> show slave status \G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 安裝MHA-node
[root@db3 ~]# cd mha
[root@db3 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 添加監控用戶
mysql> grant all on  *.*  to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)

五、測試配置

  1. 測試ssh免密登錄
[root@manager ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf
			All SSH connection tests passed successfully.
  1. 測試主從同步配置
[root@manager ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.

六、啓動管理服務

  • 啓動管理服務會佔用一個終端
[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf

–remove_dead_master_conf
刪除宕機主庫的配置

–ignore_last_failover
忽略xxx.health文件

  • 查看服務狀態
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:2964) is running(0:PING_OK), master:192.168.4.51
[root@manager ~]# ls /etc/mha/
app1.cnf  master_ip_failover
啓動前的目錄
[root@manager ~]# ls /etc/mha/
app1.cnf  app1.master_status.health  manager.log  master_ip_failover
啓動後的目錄

manager.log
日誌文件

七、測試集羣配置

7.1、客戶端訪問集羣存取數據

  1. 在主數據服務器授權連接用戶
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)

mysql> create table mydb1.t1(id int);
Query OK, 0 rows affected (0.01 sec)

mysql> grant select , insert on mydb1.* to abcd@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.00 sec)
  1. 從服務器上檢查同步情況
mysql> show grants for abcd;
  1. 客戶端連接VIP訪問數據庫
[root@client ~]# mysql -h192.168.4.100 -uabcd -p123456
  1. 插入數據
mysql> insert into mydb1.t1 values(123);
Query OK, 1 row affected (0.02 sec)

mysql> insert into mydb1.t1 values(456);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mydb1.t1 values(789);
Query OK, 1 row affected (0.00 sec)

mysql> select * from mydb1.t1;
+------+
| id   |
+------+
|  123 |
|  456 |
|  789 |
+------+
3 rows in set (0.00 sec)

7.2、測試集羣高可用

  1. 停止主數據庫服務
[root@db1 ~]# systemctl stop mysqld

停止主庫服務後,管理主機會重新選舉主服務器,VIP會切換到從服務器上。
配置文件中也會把server1的部分刪除
2. 重新使用客戶端登錄

[root@client ~]# mysql -h192.168.4.100 -uabcd -p123456

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| db2        |
+------------+
1 row in set (0.00 sec)

主服務器由數據庫2繼承
3. 插入數據

mysql> insert into mydb1.t1 values(1234);
Query OK, 1 row affected (0.00 sec)

mysql> insert into mydb1.t1 values(5678);
Query OK, 1 row affected (0.00 sec)
  1. 數據庫3上查看數據同步情況和slave狀態
mysql> select * from mydb1.t1;
+------+
| id   |
+------+
|  123 |
|  456 |
|  789 |
| 1234 |
| 5678 |
+------+
5 rows in set (0.00 sec)
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.52
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  1. 查看集羣狀態
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
  1. 重新開啓MHA服務
[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4219) is running(0:PING_OK), master:192.168.4.52

7.3、恢復故障主機

7.3.1、配置數據庫1

  1. 同步數據
    在以數據庫2爲主服務器的基礎上,備份數據,將數據庫2的數據全部導出到數據庫1,並進行恢復。
[root@db2 ~]# mysqldump -uroot -p123456 --master-data mydb1 > /root/mydb1.sql

[root@db2 ~]# scp /root/mydb1.sql  root@192.168.4.51:/root/

[root@db1 ~]# systemctl start mysqld

[root@db1 ~]# mysql -uroot -p123456 mydb1 < /root/mydb1.sql
  1. 在數據庫1上指定數據庫2爲主服務器。
查看數據庫2的binlog日誌
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 |      934 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> change master to master_host="192.168.4.52" , master_user="repluser",master_password="123456" ,master_log_file="master52.000001" , master_log_pos=934;
  1. 啓動slave進程
mysql> start slave;

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.52
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master52.000001
          Read_Master_Log_Pos: 934
               Relay_Log_File: db1-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master52.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

7.3.2、配置管理主機

  1. 重新添加配置文件
[root@manager ~]# vim /etc/mha/app1.cnf
[server1]
hostname=192.168.4.51
port=3306
candidate_master=1

  1. 測試集羣環境
[root@manager ~]# masterha_check_repl --conf=/etc/mha/app1.cnf 
MySQL Replication Health is OK.
  1. 重新啓動
[root@manager ~]# masterha_stop --conf=/etc/mha/app1.cnf

[root@manager ~]# masterha_manager --remove_dead_master_conf --ignore_last_failover  --conf=/etc/mha/app1.cnf
Mon Mar 30 08:23:42 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Mar 30 08:23:42 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Mon Mar 30 08:23:42 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..

[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4733) is running(0:PING_OK), master:192.168.4.52

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