一、數據庫高可用集羣
- 相關概念
- 集羣:多臺服務器提供相同服務
- 集羣分類:HA高可用集羣、LB負載均衡集羣
- 集羣服務軟件: LVS 、haproxy 、nginx 、keepalived
1.1、MHA簡介
- MHA(Master High Availability)
- 數據庫的自動故障切換操作能做到在0~30秒內完成
- MHA能確保在故障切換過程中最大限度保證數據的一致性,以達到真正意義上的高可用
1.2、MHA組成
- MHA Manager (管理節點)
- 管理所有數據庫服務器
- 可以單獨部署在一臺獨立的機器上
- 也可以部署在某臺數據庫服務器上
- MHA Node (數據節點)
- 存儲數據的MySQL服務器
- 運行在每臺MySQL服務器上
1.3、MHA工作過程
- Manager定時探測集羣中的master節點
- 當master故障時,Manager自動將擁有最新數據的slave提升爲新的master。
- MHA也可以同時管理多個主從複製組。
二、搭建集羣環境
2.1、實驗拓撲
2.2、環境準備
2.2.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
- 安裝軟件(51、52、53、57)
]# yum -y install perl-*.rpm
2.2.2、配置ssh免密登錄
- 配置三臺數據庫之間免密登錄
- 數據庫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
- 數據庫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
- 數據庫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、配置從服務器
- 第一臺從服務器
[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
- 第二臺從服務器
[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
- 加載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
- 重啓數據庫服務
[root@db1 ~]# systemctl restart mysqld
[root@db1 ~]# netstat -utnlp | grep mysql
- 安裝MHA-node
[root@db1 ~]# cd mha
[root@db1 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
- 添加監控用戶
mysql> grant all on *.* to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
4.2.2、配置數據庫服務器2
- 加載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
- 啓用binlog日誌
[root@db2 ~]# vim /etc/my.cnf
log_bin=master52
- 同步連接用戶
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
- 重啓數據庫服務
[root@db2 ~]# systemctl restart mysqld
[root@db2 ~]# netstat -utnlp | grep mysql
- 查看slave狀態
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 安裝MHA-node
[root@db2 ~]# cd mha
[root@db2 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
- 添加監控用戶
mysql> grant all on *.* to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
4.2.3、配置數據庫服務器3
- 加載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
- 啓用binlog日誌
[root@db3 ~]# vim /etc/my.cnf
log_bin=master53
- 同步連接用戶
mysql> grant replication slave on *.* to repluser@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (0.39 sec)
- 重啓數據庫服務
[root@db3 ~]# systemctl restart mysqld
[root@db3 ~]# netstat -utnlp | grep mysql
- 查看slave狀態
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 安裝MHA-node
[root@db3 ~]# cd mha
[root@db3 mha]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
- 添加監控用戶
mysql> grant all on *.* to root@"%" identified by "123456";
Query OK, 0 rows affected, 1 warning (10.00 sec)
五、測試配置
- 測試ssh免密登錄
[root@manager ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
All SSH connection tests passed successfully.
- 測試主從同步配置
[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、客戶端訪問集羣存取數據
- 在主數據服務器授權連接用戶
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)
- 從服務器上檢查同步情況
mysql> show grants for abcd;
- 客戶端連接VIP訪問數據庫
[root@client ~]# mysql -h192.168.4.100 -uabcd -p123456
- 插入數據
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、測試集羣高可用
- 停止主數據庫服務
[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)
- 數據庫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
- 查看集羣狀態
[root@manager ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
- 重新開啓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
- 同步數據
在以數據庫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上指定數據庫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;
- 啓動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、配置管理主機
- 重新添加配置文件
[root@manager ~]# vim /etc/mha/app1.cnf
[server1]
hostname=192.168.4.51
port=3306
candidate_master=1
- 測試集羣環境
[root@manager ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
- 重新啓動
[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