1. MHA
MHA数据高可用集群,是一套优秀的作为MySQL高可用性环境下故障切换主从的软件,在故障切换过程中,MHA 能够做到 在 30s自动完成数据的高可用的故障切换,并在切换的过程中最大程度的保证数据的一致性,以达到真正意义上的高可用。
2. MHA 特点
1) 实现MySQL故障转移
2)保证数据的一致性
3. MHA 的工作流程
1)把宕机的master二进制日志保存下来。
2)找到binlog位置点最新的slave。
3)在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。
4)将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
5)将含有最新位置点binlog所在的slave提升为master。
6)将其它slave重新指向新提升的master,并开启主从复制。
- 当监控的集群中的主MySQL宕机后,会尝试获取主库中的二进制文件,获取到之后,找到已经同步最新数据的从库,将把该从库的中继日志同步给其他的从库,来同步数据,保证从库之间的一致性,之后再从库中找到一台,作为新的主库,同步获取到的二进制文件,其余的从库从这个新的主库中同步数据,保证主从服务的群集正常的工作
4. MHA 组成
- 该软件由两部分组成:
- MHA Manager (管理节点):
- 管理节点可以单独部署在一台独立的机器上,管理多个 master-slave 集群,也可以部署在一台 slave 节点上
- MHA Node (数据节点):
- MHA Node 运行在每台MySQL服务器上 ,管理节点,会定时探测集群中master 接地那,当master出现故障时,他可以自动将最新数据的slave 提升为新的 master, 然后将所有其他的slave 重新指向 master
- MHA Manager (管理节点):
1) Manager 工具包
工具 | 作用 |
---|---|
masterha_check_ssh | 检查MHA的SSH配置状况 |
masterha_check_repl | 检查MySQL复制状况 |
masterha_manger | 启动MHA |
masterha_check_status | 检测当前MHA 运行状态 |
masterha_master_monitor | 检测master是否宕机 |
masterha_master_switch | 监控故障转移(自动或者手动) |
masterha_conf_host | 添加或是删除配置的 server信息 |
2) Node 工具包
工具 | 作用 |
---|---|
save_binary_logs | 保存和复制master的二进制日志 |
apply_diff_relay_logs | 识别差异的中继日志事件并将其差异的事件应用于其他的slave |
filter_mysqlbinlog | 去除不必要的 ROLLBACK 事件(MHA已不再使用) |
purge_relay_logs | 清除中继日志(不会阻塞SQL线程) |
5. MHA 工作原理
1) 从宕机崩溃的 master 保存二进制日志时间(binlog events)
2) 识别含有最新数据的slave;
3) 应用差异的中继日志(relay log) 到其他的slave
4) 提升一个 slave 为新的master;
4) 应用从 master 保存的二进制,移交给 最新的slave
6) 使其他的slave 连接新的master 进行复制
6. 部署一主两从MySQL
6.1 Master 配置
- Master 创建授权用户
mysql> GRANT ALL ON *.* TO 'slave'@'%' IDENTIFIED BY '123.cim';
Query OK, 0 rows affected (0.00 sec)
- Master 开启二进制日志文件
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin=master-bin
log-slave-updates=true
- 重启服务
systemctl restart mysqld
6.2 Slave-1 配置
- 开启中继日志与 二进制日志 Slave-1
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
- 重启服务
systemctl restart mysqld
6.3 Slave-2 配置
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server-id=3
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
- 重启服务
systemctl restart mysqld
6.4 重新指定 Slave-1 的Master
- 查看 Master 二进制日志文件
mysql> SHOW master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 120 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
- Slave-1 配置
mysql> CHANGE MASTER TO
MASTER_USER='slave',
MASTER_HOST='192.168.116.104',
MASTER_PASSWORD='123.com',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=120;
- 启动 slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
- 查看Slave 状态
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.5 Slave-2 指定 Master
mysql> CHANGE MASTER TO
MASTER_USER='slave',
MASTER_HOST='192.168.116.104',
MASTER_PASSWORD='123.com',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=120;
- 启动 slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
- 查看Slave 状态
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.6 主从测试
- 在 Master 中创建测试库 aaa
# 原有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
# 创建测试库 aaa
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)
- Slave 查看
# Node查看测试库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
7. MHA 实现故障转移
实验环境:
- mysql 部署环境为; 一主两从
Host | IP | 环境 |
---|---|---|
MHA | 192.168.116.104/8 | 联网,网络yum源 |
MySQL-M | 192.168.116.103/8 | 联网,网络yum源 |
MySQL-S1 | 192.168.116.102/8 | 联网,网络yum源 |
MySQL-S2 | 192.168.116.101/8 | 联网,网络yum源 |
再生产环境中,可能会遇到多个 主从的mysql,那么我们可以使用 一个 MHA Manager 来管理多组主从复制的数据库。
主需要将不同组中的配置信息单独写道 app*.cnf当中
1) 在 master MySQL中创建授权用户
- 创建MHA 授权用户,使mha 可以控制数据库
- 在 master MySQL中做一台就可以( 会将user 表中的数据复制下去)
mysql> GRANT ALL ON *.* TO 'mha'@'192.168.116.%' IDENTIFIED BY '123.com';
Query OK, 0 rows affected (0.00 sec)
2) 在所有节点中部署 免密登录
-
四台服务可以互相登录任意主机
-
MHA
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.101
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.102
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.103
- MySQL-M
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.101 [root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.102 [root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.104
- MySQL-S1
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.101
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.103
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.104
- MySQL-S2
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.102
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.103
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.116.104
4) 为所有节点安装 MHA Node 所需要的 perl 模块
- 解决 perl 依赖关系
- epel 是社区强烈打造的免费开关的发型软件版本库
[root@localhost ~]# rpm -ivh epel-release-latest-7.noarch.rpm
[root@localhost ~]# yum -y install perl-DBD-mysql perl-DBI
- 安装node节点
[root@localhost ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
5) 在 MHA 节点安装 MHA Manager 管理节点
[root@localhost ~]# yum -y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
[root@localhost ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
6) 配置 MHA Manager
- 配置全局配置文件
[root@localhost ~]# vim /etc/masterha_default.cnf
[ server default]
user=mha # 数据库授权管理节点用户
password=123.com # 登录密码
repl_user=slave # 主从复制的用户
repl_password=123.com # 登录密码
ssh_user=root # 管理节点和节点的直接连接的协议
master_binlog_dir=/usr/local/mysql/data # 主数据库存放二进制文件的目录
remote_workdir=/data/login # 当获取二进制文件时,存放的目录
ping_interval=2 # 管理节点和节点通讯时间
shutdown_script="" # 当主数据库宕机时,执行的脚本,可以为空
- 配置Manager 节点配置文件
- 创建配置文件目录
[root@localhost ~]# mkdir /etc/mha
[root@localhost ~]# vim /etc/mha/app1.cnf
[ server default]
manager_workdir=/var/lib/manager # Manager节点的工作目录
manager_log=/var/log/manager/manager.log # Manager节点日志文件
[server1] # 监控的节点 1
hostname=192.168.116.103 # 监控节点1 的IP
port=3306 # 监控的 端口号
ssh_port=22 # ssh登录端口
[server2]
hostname=192.168.116.102
port=3306
ssh_port=22
candidate_master=1 # 当主节点宕机后,该节点作为主
[server3]
hostname=192.168.116.101
port=3306
ssh_port=22
7) 测试 Manager
- 测试 manager 与 数据库节点之间的ssh通信是否正常
- 全部返回 ok
[root@localhost ~]# masterha_check_ssh --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
- 检测节点之间的主从复制是否正常
- 没有问题则返回 ok
[root@localhost ~]# masterha_check_repl --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf MySQL Replication Health is OK.
- 启动 MHA Manager 服务
- 开启后会处以监控状态
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
Wed Feb 12 19:15:39 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:15:39 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:15:39 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
Cannot write to '/var/log/manager/manager.log': 没有那个文件或目录 at /usr/share/perl5/vendor_perl/Log/Dispatch/File.pm line 109.
以上报错,表示 没有’/var/log/manager/manager.log 这个文件或目录
因为 该目录是我们手动指定的,需要手动建立一个目录
[root@localhost ~]# mkdir /var/log/manager
- 再次启动
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
Wed Feb 12 19:18:20 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
- 模拟 MySQL 主宕机
- 当我们把 192.168.116.103主机的 MySQL服务停掉之后,这里会显示 二进制日志已经存放至 /data/login下, 这个时候,我们在 192.168.116.102主机中,创建数据192.168.116.101中查看是否被复制
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
Wed Feb 12 19:18:20 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
Creating /data/login if not exists.. ok.
Checking output directory is accessible or not..
ok.
Binlog found at /usr/local/mysql/data, up to mysql-bin.000003
Wed Feb 12 19:21:53 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:21:53 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:21:53 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..