Mysql通过MHA实现高可用

时间:2022-07-25
本文章向大家介绍Mysql通过MHA实现高可用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

简介

MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。   MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的比较成熟的 MySQL 高可用方案。MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从.

MHA原理

服务角色

MHA服务有两种角色, MHA Manager(管理节点)和MHA Node(数据节点)

MHA Manager

通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个 master/slave 集群称作一个 application,用来管理统筹整个集群。

MHA node

运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移 主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地应用后提升为主节点。

 由上图我们可以看出,每个复制组内部和 Manager 之间都需要ssh实现无密码互连,只有这样,在 Master 出故障时, Manager 才能顺利的连接进去,实现主从切换功能。

提供的工具

MHA会提供诸多工具程序,常见的如下所示

Manager节点

masterha_check_ssh: # MHA 依赖的 ssh 环境监测工具;
masterha_check_repl:# MYSQL 复制环境检测工具;
masterga_manager:   # MHA 服务主程序;
masterha_check_status:# MHA 运行状态探测工具;
masterha_master_monitor: # MYSQL master 节点可用性监测工具;
masterha_master_swith:master:# 节点切换工具;
masterha_conf_host:  # 添加或删除配置的节点;
masterha_stop: # 关闭 MHA 服务的工具。

Node节点

这些工具都是由MHA Manager的脚本触发,无须认为操作

save_binary_logs: # 保存和复制 master 的二进制日志;
apply_diff_relay_logs:# 识别差异的中继日志事件并应用于其他 slave;
purge_relay_logs: # 清除中继日志(不会阻塞 SQL 线程);
# 自定义扩展:
secondary_check_script:# 通过多条网络路由检测master的可用性;
master_ip_failover_script:# 更新application使用的masterip;
report_script:# 发送报告;
init_conf_load_script:# 加载初始配置参数; 
master_ip_online_change_script;  # 更新master节点ip地址。
工作原理
# MHA工作原理总结为以下几条:
# 1 从宕机崩溃的 master 保存二进制日志事件(binlog events);
# 2 识别含有最新更新的 slave ;
# 3 应用差异的中继日志(relay log) 到其他 slave ;
# 4 应用从 master 保存的二进制日志事件(binlog events);
# 5 提升一个 slave 为新 master ;
# 6 使用其他的 slave 连接新的 master 进行复制。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性

环境配置

MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及中继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。

主机名

IP

服务角色

备注

Manager

192.168.43.159

Manager控制器

监控管理

master

192.168.43.18

数据库主

slave1

192.168.43.120

数据库从

slave2

192.168.43.154

数据库从

解析hosts
tail -4 /etc/hosts
192.168.43.159 manager
192.168.43.120 slave1
192.168.43.18 master
192.168.43.154 slave2
配置ssh免密

注意是四台机器互相喔

echo -e "n" |ssh-keygen  -t dsa -N "" 
ssh-copy-id -i .ssh/id_dsa.pub slave1
ssh-copy-id -i .ssh/id_dsa.pub slave2
ssh-copy-id -i .ssh/id_dsa.pub master

准备Mysql主从复制环境

注意

binlog-do-db 和 replicate-ignore-db 设置必须相同。 MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移

备份主库数据
配置主节点master
[root@master ~]# cat /etc/my.cnf
[mysqld]
server-id = 1			# 复制集群的各节点ID必须唯一
log-bin = master-log		# 开启二进制日志
relay-log = relay-log		# 开启中继日志
skip_name_resolve		# 关闭名称解析
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


systemctl restart mysqld
配置slave节点
[root@slave1 ~]# cat /etc/my.cnf
[mysqld]
server-id = 2			# 复制集群的各节点ID必须唯一
log-bin = master-log		# 开启二进制日志
relay-log = relay-log		# 开启中继日志
skip_name_resolve		# 关闭名称解析
read_only = ON			# 启用只读属性
relay_log_purge = 0		# 是否自动清空不再需要中继日志
log_slave_updates = 1		# 使得最新的数据写进二进制日志中

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[root@slave2 ~]# cat /etc/my.cnf
[mysqld]
server-id = 3			# 复制集群的各节点ID必须唯一
log-bin = master-log		# 开启二进制日志
relay-log = relay-log		# 开启中继日志
skip_name_resolve		# 关闭名称解析
read_only = ON			# 启用只读属性
relay_log_purge = 0		# 是否自动清空不再需要中继日志
log_slave_updates = 1		# 使得最新的数据写进二进制日志中

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


systemctl restart mysqld
配置一主多从复制

master节点

grant replication slave,replication client on *.* to 'slave'@'192.168.43.%' identified by 'ZHOUjian.20';
flush privileges;
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-log.000001 |      621 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

slave节点

change master to 
master_host='192.168.43.18', 
master_user='slave', 
master_password='ZHOUjian.20',
master_auto_position=0;

start slave;
show slave statusG;

安装配置MHA

在所有 Mysql 节点授权拥有管理权限的用户可在本地网络中有其他节点上远程访问。 当然, 此时仅需要且只能在 master 节点运行类似如下 SQL 语句即可。

 grant all on *.* to 'mhaadmin'@'192.168.43.%' identified by 'ZHOUjian.20';
 
 wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
 
 wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm

 
# 所有机器安装下面依赖包
install perl-DBD-MySQL -y

# mha manger需要安装
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y