博主疯狂踩坑完成了搭建一个MHA架构,一套优秀的MySQL故障切换和主从提升的高可用软件,解决mysql主服务器单点故障的方法。
目录
前言
MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本人 youshimaton 开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。在 MySQL 故障切换过程中,MHA 能做到 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能最大程度上保证数据库的一致性,以达到真正意义上的高可用。MHA 由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当 Master 出现故障是,它可以自动将最新数据的Slave 提升为新的 Master,然后将所有其他的 Slave 重新指向新的 Master。整个故障转移过程对应用程序是完全透明的。
适用场景:
目前 MHA 主要支持一主多从的架构,要搭建 MHA,要求一个复制集群必须最少有 3 台数据库服务器,一主二从,即一台充当 Master,一台充当备用 Master,另一台充当从库。出于成本考虑,淘宝在此基础上进行了改造,目前淘宝开发的 TMHA 已经支持一主一从。
MHA概述
- 目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本人youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
- 在MySQL故障
切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用。 - 当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。
MHA工作原理:
1.从宕机崩溃的 Master 保存二进制日志事件(binlog event);
2. 识别含有最新更新的 Slave;
3. 应用差异的中继日志(relay log)到其他 Slave;
4. 应用从 Master 保存的二进制日志事件;
5. 提升一个 Slave 为新的 Master;
6. 使其他的 Slave 连接新的 Master 进行复制;
MHA组件介绍
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
Manager工具包主要包括以下几个工具:
(1)masterha_check_ssh #检查MHA的SSH配置状况;
(2)masterha_check_repl #检查MySQL复制状况;
(3)masterha_manger #启动MHA;
(4)masterha_check_status #检测当前MHA运行状态;
(5)masterha_master_monitor #检测master是否宕机;
(6)masterha_master_switch #控制故障转移(自动或者手动);
(7)masterha_conf_host #添加或删除配置的server信息;
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
(1)save_binary_logs #保存和复制master的二进制日志;
(2)apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave;
(3)purge_relay_logs #清除中继日志(不会阻塞SQL线程);
三、MHA的项目
3.1:项目需求
本案例要求通过MHA监控MySQL数据库在故障时进行自动切换,不影响业务。
3.2:案例实现思路
1、 安装MySQL数据库
2、 配置MySQl一主两从
3、 安装MHA软件
4、 配置无密码认证
5、 配置MySQL MHA 高可用
6、 模拟 master 故障切换
3.3:项目环境
管理 | ip |
---|---|
master | 192.168.158.10 |
slave1 | 192.168.158.20 |
slave2 | 192.168.158.30 |
manager | 192.168.158.40 |
操作系统:CentOS7-4 版本, MHA版本是0.57版本, Mysql数据库安装的是5.6版本
先在三台服务器上安装 MYSQL 数据库。这里我就不再展示了,具体的搭建过程见之前的博客
三、具体搭建过程
通过修改主机名或者xshell中的名称区分服务器,一面混淆
3.4:实现MySQL的一主两从
- 主服务器
vim /etc/my.cnf
#添加
server-id = 1 //指定id号,服务器的唯一标识,不能相同
log-bin=master-bin //主服务器日志文件
log-slave-updates=true //从服务器更新二进制日志
- 从服务器1
vim /etc/my.cnf
server-id = 2 #不能相同
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
- 从服务器2
vim /etc/my.cnf
server-id = 3 #不能相同
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
注意:如果你的 mysql 手工编译安装的是 5.7 版本,从服务器一定要在client段把 utf-8 这行注释掉,否则在最后检查MHA健康状况时报错。
[root@server1 ~]# mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.158.%' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'192.168.158.%' identified by 'manager';
mysql> flush privileges;
- 数据库重启服务
systemctl restart mysqld
- Mysql1、Mysql2、Mysql3 分别做两个软链接,软链接是为 HMA 服务的。
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
- 数据库的授权。在所有的数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用监控,即在master、slave1、slave2 上搭建。
mysql -u root -p
mysql> grant replication slave on *.* to 'myslave'@'192.168.158.%' identified by '123';
mysql> grant all privileges on *.* to 'mha'@'192.168.158.%' identified by 'manager';
flush privileges; //刷新数据库的权限相关表
select host,user,password from mysql.user; #查看授权表
- 在master主机上查看二进制文件和同步点
mysql> show master status;
- 在slave1和slave2分别执行同步
mysql> change master to
master_host='192.168.158.10',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=675; #'master-bin.000001',master_log_pos=675;这是master主机上查看二进制文件和同步点
mysql> start slave;
- 查看 IO 和 SQL 线程都是 yes 代表同步是否正常。
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
必须设置两个从库为只读模式:
mysql> set global read_only=1;
- 在master主库插入两条数据,测试是否同步。
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
mysql> use test_db;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.13 sec)
mysql> insert into test(id) values (1);
Query OK, 1 row affected (0.03 sec)
- 在两个从库分别查询如下所示说明主从同步正常。
mysql> select * from test_db.test; +------+
| id | +------+
| 1 | +------+
1 row in set (0.00 sec)
#同步正常
3.5:安装 MHA 软件
- 所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源。将CentOS7-Base-163.repo和epel.repo移动到/etc/yum.repo/下
[root@MHA-