一、数据库高可用集群
- 相关概念
- 集群:多台服务器提供相同服务
- 集群分类: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