前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql通过MHA实现高可用

Mysql通过MHA实现高可用

作者头像
iginkgo18
修改2021-05-14 15:12:21
9290
修改2021-05-14 15:12:21
举报
文章被收录于专栏:devops_k8s
简介

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节点

代码语言:javascript
复制
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的脚本触发,无须认为操作

代码语言:javascript
复制
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地址。
工作原理
代码语言:javascript
复制
# 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
代码语言:javascript
复制
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免密

注意是四台机器互相喔

代码语言:javascript
复制
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 不启动监控和故障转移

备份主库数据
代码语言:javascript
复制
配置主节点master
代码语言:javascript
复制
[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节点
代码语言:javascript
复制
[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节点

代码语言:javascript
复制
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节点

代码语言:javascript
复制
change master to 
master_host='192.168.43.18', 
master_user='slave', 
master_password='ZHOUjian.20',
master_auto_position=0;

start slave;
show slave status\G;
安装配置MHA

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

代码语言:javascript
复制
 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • MHA原理
    • 服务角色
      • 提供的工具
        • 工作原理
        • 环境配置
          • 解析hosts
            • 配置ssh免密
            • 准备Mysql主从复制环境
              • 备份主库数据
                • 配置主节点master
                  • 配置slave节点
                    • 配置一主多从复制
                    • 安装配置MHA
                    相关产品与服务
                    云数据库 SQL Server
                    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档