高可用集群MHA方案
作者:互联网
1.什么是MHA
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。
MHA作用是保证MySQL主从复制集群中的master高可用性,也就保证整个数据库集群业务不被故障影响。
master故障时,MHA会在30s内实现故障自动检测+故障转移
选择一个最优的slave接替为新的master,并且保证new_master和其他slave继续保持数据一致性
2.学习MHA的优势
梳理MHA的优势
1.自动故障转移快
2.主库崩溃仍能保证数据一致性
3.安装配置过程,不需要调整当前mysql实例
4.不需要额外的服务器,一个manager可以管理N个replication,性能强悍
5.支持半同步复制,异步复制
6.只要replication支持的存储引擎,MHA软件都支持,支持多种引擎。
3.MHA架构原理
整个MHA软件由两部分角色组成,即MHA Manager(管理节点)和MHA Node(数据节点)。
MHA Manager服务可以独立部署在一台linux机器,也可以部署在某一台主从复制从节点或者其他应用服务器节点上。
而MHA Node服务需要运行在每一个MySQL服务器上。
MHA Manager会定时通过主库上的MHA Node服务监测主库,当master出现故障时,它可以自动将最优slave(可以提前指定或由MHA判定)提升为新的master,然后让所有其他的从库与新的主库重新保持正常的复制状态。
故障的整个切换和转移的过程对客户以及应用程序几乎是完全透明的(也就是用户不会感知到有故障发生)
4.MHA工作原理
MHA主要功能
master宕机、切换新的master,且保证其他slave和新的master保持一致复制
故障切换过程中,集群数据丢失量最小
一、选择新master
old_master宕机,在集群中选择一个新的slave作为new_master,这要根据MHA的配置,如根据其他slave的binlog位置点,选择最新的slave作为new_master
二、数据补全
进行故障切换、转移之前,必须要进行数据补全,否则即使故障切换了,数据丢了那也是不允许的
数据补全过程
old_master数据库服务器还可以连接,MHA会SSH连接主库,保存主库所有的binlog
若ssh无法连接,放弃主库的binlog数据
以切换好的new_master主库的binlog位置点位基准点,通过relay_log进行数据补全,使得其他所有slave和new_master数据一直
将宕机时从old_master上保存下来的binlog日志(如果存在的话)恢复到所有的数据库节点.
三、角色切换
已选择好的new_master正式提升为主库角色
其他的slave和new_master保持主从复制关系
5.MHA软件包介绍
MHA由2部分组成
Manager节点
Node节点
manager 组件
masterha_manger 启动MHA
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况,配置信息
masterha_master_monitor 检测master是否宕机
masterha_check_status 检测当前MHA运行状态
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
node 组件
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
manager 组件
masterha_manger 启动MHA
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况,配置信息
masterha_master_monitor 检测master是否宕机
masterha_check_status 检测当前MHA运行状态
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
node 组件
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
#manager 组件
masterha_manger 启动MHA
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况,配置信息
masterha_master_monitor 检测master是否宕机
masterha_check_status 检测当前MHA运行状态
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
node 组件
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
6.基础主从复制环境部署
db-51
db-52
db-53
注意同步时间
ntpdate -u ntp.aliyun.com
mysql基础环境部署
部署见昨日
7.MHA架构部署
1.软连接设置
MHA工具会检测mysql命令,这里还需要加软连接
# 所有机器
ln -s /opt/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /opt/mysql/bin/mysql /usr/bin/mysql
2.节点全部互相通信
yum install sshpass -y
ssh-keygen
sshpass -p '123123' ssh-copy-id 10.0.0.51 -o StrictHostKeyChecking=no
sshpass -p '123123' ssh-copy-id 10.0.0.52 -o StrictHostKeyChecking=no
sshpass -p '123123' ssh-copy-id 10.0.0.53 -o StrictHostKeyChecking=no
# 验证免密
for i in 51 52 53;do ssh root@10.0.0.$i "hostname;echo '超哥带你学linux,www.yuchaoit.cn'";done
3.所有节点安装MHA-node
yum install -y perl-DBD-MySQL -y
yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
# 检查rpm安装出的命令
[root@db-52 ~]#ls -l /usr/bin/*_*log*
-rwxr-xr-x 1 root root 17639 Mar 23 2018 /usr/bin/apply_diff_relay_logs
-rwxr-xr-x 1 root root 15704 Aug 9 2019 /usr/bin/db_log_verify
-rwxr-xr-x 1 root root 33032 Aug 9 2019 /usr/bin/db_printlog
-rwxr-xr-x 1 root root 4807 Mar 23 2018 /usr/bin/filter_mysqlbinlog
-rwxr-xr-x 1 root root 8337 Mar 23 2018 /usr/bin/purge_relay_logs
-rwxr-xr-x 1 root root 7525 Mar 23 2018 /usr/bin/save_binary_logs
-rwxr-xr-x. 1 root root 7910 Aug 4 2017 /usr/bin/scsi_logging_level
-rwxr-xr-x. 1 root root 94696 Aug 4 2017 /usr/bin/sg_logs
4.db-53安装MHA-Manager
因为Manager管理节点,通过ssh检测mysql集群,如果master节点服务器宕机,或者网络故障,MHA也无法完成故障切换了。
因此mha-manager不能装在master节点
[root@db-53 ~]#yum install epel-release -y
[root@db-53 ~]#yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN perl-Time-HiRes
[root@db-53 ~]#yum localinstall -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
# 检查mha-manager命令
[root@db-53 ~]#ls -l /usr/bin/masterha_*
-rwxr-xr-x 1 root root 1995 Mar 23 2018 /usr/bin/masterha_check_repl
-rwxr-xr-x 1 root root 1779 Mar 23 2018 /usr/bin/masterha_check_ssh
-rwxr-xr-x 1 root root 1865 Mar 23 2018 /usr/bin/masterha_check_status
-rwxr-xr-x 1 root root 3201 Mar 23 2018 /usr/bin/masterha_conf_host
-rwxr-xr-x 1 root root 2517 Mar 23 2018 /usr/bin/masterha_manager
-rwxr-xr-x 1 root root 2165 Mar 23 2018 /usr/bin/masterha_master_monitor
-rwxr-xr-x 1 root root 2373 Mar 23 2018 /usr/bin/masterha_master_switch
-rwxr-xr-x 1 root root 5172 Mar 23 2018 /usr/bin/masterha_secondary_check
-rwxr-xr-x 1 root root 1739 Mar 23 2018 /usr/bin/masterha_stop
5.所有节点创建mha用户
# 新建mha的用户
# 主库创建,三个机器也就同步了
# 在db-51创建即可
# mha有一个脚本,会对所有节点的主从状态监控
grant all privileges on *.* to mha@'%' identified by 'linux3306';
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
6.创建db-53的manager配置文件
mkdir -p /etc/mha #<==在/etc下创建mha目录。
mkdir -p /var/log/mha/app1 #<==在/etc下创建mha目录。
# /etc/mha/app1.cnf #<==编辑mha配置文件,增加配置内容。
配置文件详解
[server default] #<==默认模块标签。
manager_log=/var/log/mha/app1/manager.log #<==配置日志路径。
manager_workdir=/var/log/mha/app1.log #<==配置工作日志路径。
master_binlog_dir=/mysql_binlog/ #<==配置MHA保存主库binlog日志的路径。
user=mha #<==MySQL数据中授权的用户。
password=www.yuchaoit.cn #<==MySQL数据中授权的用户。
ping_interval=2 #<==设置监控主库发送ping数据包的时间间隔,
若尝试三次没有回应则自动进行failover。
repl_user=repl #<==主从复制对应的用户。
repl_password=www.yuchaoit.cn #<==主从复制用户对应的密码。
ssh_user=root #<==ssh远程连接服务器的用户。
report_script=/usr/local/send_report #<==设置故障发生切换后触发执行的脚本。
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 10.211.55.9 -s 10.211.55.11 --user=root --master_host=mysql-server56 --master_ip=10.211.55.12 --master_port=3306
#<==当MHA Manager节点到MASTER节点(mysql-server56)的监控之间出现问题时,MHA Manager将会尝试从其他路径登录到MASTER(mysql-server56)节点。
#<==注:此配置在MHA Manager节点只有单独一台机器时起作用。意思就是,在Manager节点联系不上Master时,通过两个从节点(chaoge_slave1 、chaoge_slave2)去探视Master(mysql-server56)节点的状态。
shutdown_script="" #<==设置故障发生后执行主机脚本关闭故障机(防止故障机活过来发生脑裂)
[server1] #<==第一个mysql-master主机模块标签。
hostname=10.211.55.12 #<==第一个mysql-master主机IP。
port=3306 #<==第一个mysql主机端口。
[server2]
hostname=10.211.55.11
port=3306
candidate_master=1 #<==设定此参数后,server2标签的主机,将优先作为主库,宕机的候选服务器(切换主库优先选择)。
check_repl_delay=0 #<==设定此参数后,MHA会忽略主从复制延迟,将此服务器作为后选主机。
[server3]
hostname=10.211.55.9
port=3306
使用该配置即可
cat > /etc/mha/app1.cnf << 'EOF'
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1.log
master_binlog_dir=/mysql_binlog/
# 该脚本暂时先注释
#master_ip_failover_script=/usr/local/bin/master_ip_failover
user=mha
password=linux3306
ping_interval=2
repl_user=repl
repl_password=linux3306
ssh_user=root
[server1]
hostname=10.0.0.51
port=3306
[server2]
hostname=10.0.0.52
port=3306
[server3]
hostname=10.0.0.53
port=3306
EOF
7.状态检查db-53
检测如下MHA运行条件
# mha提供了很方便的脚本,检测你的mha环境搭建情况
SSH免密登录
MySQL主从复制
[root@db-53 ~]#masterha_check_ssh --conf=/etc/mha/app1.cnf
Tue Aug 2 00:36:08 2022 - [info] All SSH connection tests passed successfully.
# 主从检测脚本,会用到mha账号,在三个机器上进行检测登录
[root@db-53 /opt]$masterha_check_repl --conf=/etc/mha/app1.cnf
Fri Aug 12 20:12:09 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Aug 12 20:12:09 2022 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Fri Aug 12 20:12:09 2022 - [info] Reading server configuration from /etc/mha/app1.cnf..
Fri Aug 12 20:12:09 2022 - [info] MHA::MasterMonitor version 0.58.
Creating directory /var/log/mha/app1.log.. done.
Fri Aug 12 20:12:10 2022 - [info] GTID failover mode = 1
Fri Aug 12 20:12:10 2022 - [info] Dead Servers:
Fri Aug 12 20:12:10 2022 - [info] Alive Servers:
Fri Aug 12 20:12:10 2022 - [info] 10.0.0.51(10.0.0.51:3306)
Fri Aug 12 20:12:10 2022 - [info] 10.0.0.52(10.0.0.52:3306)
Fri Aug 12 20:12:10 2022 - [info] 10.0.0.53(10.0.0.53:3306)
Fri Aug 12 20:12:10 2022 - [info] Alive Slaves:
Fri Aug 12 20:12:10 2022 - [info] 10.0.0.52(10.0.0.52:3306) Version=5.7.28 (oldest major version between slaves) log-bin:disabled
Fri Aug 12 20:12:10 2022 - [info] GTID ON
Fri Aug 12 20:12:10 2022 - [info] Replicating from 10.0.0.51(10.0.0.51:3306)
Fri Aug 12 20:12:10 2022 - [info] 10.0.0.53(10.0.0.53:3306) Version=5.7.28 (oldest major version between slaves) log-bin:disabled
Fri Aug 12 20:12:10 2022 - [info] GTID ON
Fri Aug 12 20:12:10 2022 - [info] Replicating from 10.0.0.51(10.0.0.51:3306)
Fri Aug 12 20:12:10 2022 - [info] Current Alive Master: 10.0.0.51(10.0.0.51:3306)
Fri Aug 12 20:12:10 2022 - [info] Checking slave configurations..
Fri Aug 12 20:12:10 2022 - [info] read_only=1 is not set on slave 10.0.0.52(10.0.0.52:3306).
Fri Aug 12 20:12:10 2022 - [warning] log-bin is not set on slave 10.0.0.52(10.0.0.52:3306). This host cannot be a master.
Fri Aug 12 20:12:10 2022 - [info] read_only=1 is not set on slave 10.0.0.53(10.0.0.53:3306).
Fri Aug 12 20:12:10 2022 - [warning] log-bin is not set on slave 10.0.0.53(10.0.0.53:3306). This host cannot be a master.
Fri Aug 12 20:12:10 2022 - [info] Checking replication filtering settings..
Fri Aug 12 20:12:10 2022 - [info] binlog_do_db= , binlog_ignore_db=
Fri Aug 12 20:12:10 2022 - [info] Replication filtering check ok.
Fri Aug 12 20:12:10 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln364] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf
Fri Aug 12 20:12:10 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations. at /usr/bin/masterha_check_repl line 48.
Fri Aug 12 20:12:10 2022 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Aug 12 20:12:10 2022 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
标签:12,Aug,可用,MHA,masterha,集群,master,root 来源: https://www.cnblogs.com/huquchangzhen/p/16581252.html