MySQL5.7.29 MHA 底层集群搭建,并进行简单测试

5.7.29 MHA 集群搭建

1.故障转移
2.尽可能保证数据一致性

该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tijYhwsN-1594970570162)(C:\Users\86156\Pictures\mha'\192216579327066[1].png)]

选举原理

1.当主数据库宕机时,会尝试获取主库宕机时的二进制文件,对从库进行最后一次同步。
2.找到已经同步到最新数据的从库,将该从库中的中继日志传给其他从库,同步数据
3.保证从库间的数据一致性,再从从库中找出一台作为新的主库,并同步其文件
4.其余的从库从新的主库同步数据,保证主从集群的正常运作

MHA 高可用架构工作原理

1.监控节点(通过配置文件所有节点信息)

系统、网络、SSH连接性、主从状态、重点是主库的监控。


2、如果主机宕机

position:段偏移量
GTID:全局事务ID

①、选主

  • 判断从库(position或者GTID),如果数据有差异,选择最接近于 master 的 slave 成为备选主。
  • 判断从库(position或者GTID),如果数据一致,按照配置文件顺序选主。
  • 如果设定有权重(candidate_master=1),强制让某一个从库选为主库。
    • check_repl_delay=0 设置此项后MHA会忽略复制延迟,即使落后很多日志,也会强制选为备选主。一般配合 candidate_master=1 使用。


3、主库宕机后,数据补偿

①、当 SSH 能连接,从库对比主库的 GTID 或者 position 号,自动触发 node工具 (save_binary_logs 脚本) 将二进制保存至各个节点 。

masterha_master_switch工具:Failover 补偿之后进行切换。将备选主身份进行切换,并对外提供服务。其余从库和新主库确认新的主从关系。

②、当 SSH 不能连接,对比从库之间 relaylog 的差异,position(段偏移量)进行对比,谁的大谁就是主。

只能尽可能 保存 数据,不能做到 完全同步。(apply_diff_relay_logs)


4、应用透明(VIP功能)

MHA 自带应用透明。主库一旦切换,原主库VIP 切换到新主上。


5、故障切换告警(send_report)
6、二次数据补偿(binlog_server)


Manager 工具 /usr/bin/masterha_
  • masterha_check_ssh 检查 MHA 得 SSH 配置状况
  • masterha_check_repl 检查 MYSQL 复制状况
  • masterha_manager 启动 MHA(阻塞日志启动)
    • masterha_stop 关闭 MHA
  • masterha_check_status 检查当前 MHA 运行状态
  • masterha_master_monitor 检测 master节点是否宕机
  • masterha_master_switch 控制故障转移,(自动或者手动)
  • masterha_conf_host 添加或者删除配置得 server 信息
Node 工具,发生故障时自动执行
  • save_binary_logs SSH能连接,保存和复制master的二进制日志
  • apply_diff_relay_logs SSH不能连接,识别差异的中继日志事件并将其差异的事件应用于其他的slave
  • purge_relay_logs 主从复制,自动清除中继日志(不会阻塞SQL线程)

mha 官网https://code.google.com/archive/p

github下载地址http://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads


一、环境基础

配置好 一主双从 的Mysql架构。再添加一个 manager节点

主机IP节点、主机名
192.168.168.4manager管理节点
192.168.168.5master主库
192.168.168.6node1从库
192.168.168.7node2从库
关闭防火墙,或者放行 3306端口号


1、Mysql 主从配置文件 /etc/my.cnf

Master - /etc/my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
server-id = 1				//ID号必须唯一
port = 3306				//端口号
socket = /usr/local/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log_error = /var/log/mysqld.log				
log-bin = /usr/local/mysql/data/master-bin	//开启 binlog 二进制日志
log-slave-updates = true			//允许从服务器进行更新
relay-log=relay-log-bin				//开启 中继日志
relay-log-index=slave-relay-bin.index	
pid-file = /usr/local/mysql/data/localhost.localdomain.pid
    
gtid-mode = ON				//开启GTID
enforce-gtid-consistency = ON		

node1 - /etc/my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
server-id = 2
port = 3306
socket = /usr/local/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log_error = /var/log/mysqld.log		
pid-file = /usr/local/mysql/data/node1.pid
relay-log=relay-log-bin					//开启 中继日志
relay-log-index=slave-relay-bin.index			//中继日志索引文件
log-bin = /usr/local/mysql/data/master-bin		//开启 二进制日志
gtid-mode = ON						//开启GTID
enforce-gtid-consistency = ON		

node2 - /etc/my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
server-id = 3
port = 3306
socket = /usr/local/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log_error = /var/log/mysqld.log
pid-file = /usr/local/mysql/data/localhost.localdomain.pid
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.indexc
read_only = 1					//如果从库不设置为 备用主库,可以设置成只读
log-bin = /usr/local/mysql/data/master-bin
gtid-mode = ON					//开启GTID
enforce-gtid-consistency = ON		


二、MHA部署步骤

1、所有节点 修改主机名,相互做免密登录
ssh-keygen
ssh-copy-id -i  /root/.ssh/id_rsa.pub   root@192.168.168.4
ssh-copy-id -i  /root/.ssh/id_rsa.pub   root@192.168.168.5
ssh-copy-id -i  /root/.ssh/id_rsa.pub   root@192.168.168.6
ssh-copy-id -i  /root/.ssh/id_rsa.pub   root@192.168.168.7
2、 数据库节点 优化路径,MHA必须做优化路径
[root@localhost ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@localhost ~]# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
3、所有节点 解决依赖关系
yum -y install epel-release-7-12.noarch
yum -y install perl-DBD-MySQL perl-DBI perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManage	perl-Time-HiRes
4、所有节点 安装 mha4mysql-node 软件包

接着上传事先下载好的mha4mysql-node的rpm包,使用rpm安装

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:mha4mysql-node-0.58-0.el7        ################################# [100%]
5、在 manager 节点 安装 mha4mysql-manager
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:mha4mysql-manager-0.58-0.el7        ################################# [100%]
6、数据库节点 创建用户
mysql> grant all privileges on *.* to 'mha'@'%' identified by '123.com';	#监控用户
mysql> GRANT REPLICATION ON *.* TO 'mha'@'%' IDENTIFIED BY '123.com';	#复制用的用户
查看验证:select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mha           | %         |
| slave         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
7、备用 主库 表设置

192.168.168.6 node1:

mysql> set global read_only=1;  

mysql> set global relay_log_purge=off; 

// set global read_only=1; 从表设置为只读,备用master的只读不能写入配置文件,因为有可能会为master

// set global relay_log_purge=off; 从表关闭 中转日志自动清理,因为MHA从库恢复过程依赖中转日志相关信息


三、Manager 节点配置

1、创建工作目录

mkdir /etc/masterha 主配置文件目录

mkdir -p /var/log/masterha/ 工作目录

2、在/etc/masterha下创建配置文件

[server default]
#manager 工作目录
manager_workdir=/var/log/masterha

#manager 工作时的日志文件
manager_log=/var/log/masterha/manager.log

#指定 master(192.168.168.5) 主机的 binlog二进制日志的文件位置,
master_binlog_dir=/usr/local/mysql/data/

#自动故障切换时master服务器IP地址切换脚本,如果没有则不写此项
#master_ip_failover_script=/usr/local/bin/master_ip_failover
#手动切换时master服务器IP地址切换脚本,如果没有则不写此项(一般安装MHA时自带)
#master_ip_online_change_script=/usr/local/bin/master_ip_online_change

#监控用户
user=mha
#监控用户密码
password=123.com
#监控主库发送 ping 包的时间间隔,默认3秒,如果3秒内没有回应将自动进行故障切换
ping_interval=1
#Mysql 在发生切换时,二进制日志文件的保存位置
remote_workdir=/var/log/masterha/logbin

#复制用户
repl_user=slave
#复制用户的密码
repl_password=123.com
#发生切换后发送的报警脚本
#report_script=/usr/local/bin/send_report
#故障发生后关闭故障主机的脚本,主要作用是关闭主机防止发生脑裂
#shutdown_script="/usr/local/bin/master_stop"


#ssh 登录用户
ssh_user=root


[server1]
hostname=192.168.168.5
port=3306
ssh_port=22

[server2]
hostname=192.168.168.6
port=3306
ssh_port=22
#候选 master主机,即使这个主库不是集群中事件最新的,当主宕机之后 仍会优先选择此主机作为主Mysql。
#应用场景:keepelived+MHA
candidate_master=1
#默认情况下,如果一个slave的中转日志落后master二进制日志100M,那么MHA就不会选择该slave作为新的master。
#但设置此项后MHA会忽略复制延迟,对候选master非常有用。
check_repl_delay=0

[server3]
hostname=192.168.168.7
port=3306
ssh_port=22


3、manager 工具测试

①、检查管理节点到所有Node节点的ssh连接状态

[root@localhost bin]# masterha_check_ssh --conf=/etc/masterha/node.cnf

Thu Jul 16 17:33:51 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jul 16 17:33:51 2020 - [info] Reading application default configuration from /etc/masterha/node.cnf..
Thu Jul 16 17:33:51 2020 - [info] Reading server configuration from /etc/masterha/node.cnf..
Thu Jul 16 17:33:51 2020 - [info] Starting SSH connection tests..
Thu Jul 16 17:33:52 2020 - [debug] 
Thu Jul 16 17:33:51 2020 - [debug]  Connecting via SSH from root@192.168.168.5(192.168.168.5:22) to root@192.168.168.6(192.168.168.6:22)..
Thu Jul 16 17:33:51 2020 - [debug]   ok.
Thu Jul 16 17:33:51 2020 - [debug]  Connecting via SSH from root@192.168.168.5(192.168.168.5:22) to root@192.168.168.7(192.168.168.7:22)..
Thu Jul 16 17:33:52 2020 - [debug]   ok.
Thu Jul 16 17:33:53 2020 - [debug] 
Thu Jul 16 17:33:52 2020 - [debug]  Connecting via SSH from root@192.168.168.7(192.168.168.7:22) to root@192.168.168.5(192.168.168.5:22)..
Thu Jul 16 17:33:52 2020 - [debug]   ok.
Thu Jul 16 17:33:52 2020 - [debug]  Connecting via SSH from root@192.168.168.7(192.168.168.7:22) to root@192.168.168.6(192.168.168.6:22)..
Thu Jul 16 17:33:53 2020 - [debug]   ok.
Thu Jul 16 17:33:53 2020 - [debug] 
Thu Jul 16 17:33:51 2020 - [debug]  Connecting via SSH from root@192.168.168.6(192.168.168.6:22) to root@192.168.168.5(192.168.168.5:22)..
Thu Jul 16 17:33:52 2020 - [debug]   ok.
Thu Jul 16 17:33:52 2020 - [debug]  Connecting via SSH from root@192.168.168.6(192.168.168.6:22) to root@192.168.168.7(192.168.168.7:22)..
Thu Jul 16 17:33:52 2020 - [debug]   ok.
Thu Jul 16 17:33:53 2020 - [info] All SSH connection tests passed successfully.

注意:如果报Binlog setting check failed!错误,那么有可能是master服务器保存二进制日志文件地址错误

②、检查 manager 与数据库节点间的主从复制是否正常

[root@localhost ~]# masterha_check_repl --conf=/etc/masterha/node.cnf

Thu Jul 16 17:35:37 2020 - [info] Checking replication health on 192.168.168.6..
Thu Jul 16 17:35:37 2020 - [info]  ok.
Thu Jul 16 17:35:37 2020 - [info] Checking replication health on 192.168.168.7..
Thu Jul 16 17:35:37 2020 - [info]  ok.
Thu Jul 16 17:35:37 2020 - [warning] master_ip_failover_script is not defined.
										#未定义主故障转移脚本,不影响
Thu Jul 16 17:35:37 2020 - [warning] shutdown_script is not defined.
Thu Jul 16 17:35:37 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.	  		#代表成功
③、运行、关闭 MHA 集群

[root@localhost ~]# masterha_manager --conf=/etc/masterha/node.cnf --remove_dead_master_conf
Thu Jul 16 16:58:39 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Jul 16 16:58:39 2020 - [info] Reading application default configuration from /etc/masterha/node.cnf…
Thu Jul 16 16:58:39 2020 - [info] Reading server configuration from /etc/masterha/node.cnf…

–remove_dead_master_conf表示发生主从切换后,老的master服务器配置检查配置文件中删除

关闭:masterha_stop --conf=/etc/masterha/node.cnf

④、查看 MHA 集群状态

[root@localhost ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

node (pid:22548) is running(0:PING_OK), master:192.168.168.5


测试

到目前为止,生产环境上的MHA底层结构已经搭好了。但是现在的 MHA 并不具备自动修复的能力。
现在 MHA 架构还属于一次性的效果,
当出现主库宕机会自动将备用主库升级为主库。其他未损坏从库将从新的主库中同步数据。
宕机的服务器将自动被集群踢出。

模拟测试:将主库systemctl stop mysqld

修复

手动修复

1、启动数据库,将主库启动 systmctl start mysqld
2、将启动好的数据库通过 change master to 连接到 现在 MHA集群的主库上

mysql> change master to master_auto_position=0;
mysql> change master to 
    -> master_user='slave',
    -> master_host='192.168.168.6',
    -> master_password='123.com',
    -> master_log_file='master-bin.000001',
    -> master_log_pos=1292;

mysql> start slave;

3、因为上一个主库宕机,manager会自动将配置文件中上一个主库的server参数清空,需要重填写
4、重新启动 Manager 查看效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值