目录
一、MHA的概述
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司的youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA的组成
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
MHA特点
- 自动故障切换过程中,MHA试图从宕机的主服务器.上保存二进制日志,最大程度的保证数据的不丢失
- 使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险
1.1MHA工作原理总结为以下几条:
从宕机崩溃的master保存二进制日志事件(binlog events);
识别含有最新更新的slave;
应用差异的中继日志(relay log)到其他slave;
应用从master保存的二进制日志事件(binlog events);
提升一个slave为新master;
使用其他的slave连接新的master进行复制。
验证复制设置以及确认当前master状态
- 连接所有hosts,MHA自动来确认当前master是哪个,配置文件中无需指定哪个是master。如果其中有任何一个slave挂了,脚本立即退出,停止监控。如果有一些必要的脚本没有在MHA
Node节点安装,那么MHA在这个阶段终止,且停止监控。
监控master
- 监控master,直到master挂了。这个阶段,MHA不会监控slave,Stopping/Restarting/Adding/Removing操作在slave上,不会影响当前的MHA监控进程。当你添加或者删除slave的时候,请更新好配置文件,最好重启MHA。
检测master是否失败
- 如果MHA Manger三次间隔时间都没办法连接master
server,就会进入这个阶段。如果你设置了secondary_check_script
,那么MHA会调用脚本做二次检测来判断master是否是真的挂了。接下来的步骤,就是masterha_master_switch的工作流程了
再次验证slave的配置
- 如果发现任何不合法的复制配置(有些slave的master不是同一个),那么MHA会停止监控,且报错。可以设置ignore_fail忽略。这一步是处于安全考虑,很有可能,复制的配置文件已经被改掉了,所以double
check是比较推荐的做法。检查最后一次failover(故障转移)的状态
如果上一次的failover报错,或者上一次的failover结束的太近(默认3天),MHA停止监控,停止failover,那么在masterha_manager命令中设置ignore_last_failover,wait_on_failover_error来改变这一检测。这么做,也是出于安全考虑。频繁的failover,检查下是否网络出问题,或者其他错误呢?
关掉失败的master的服务器(可选)
- 如果在配置文件中定义了master_ip_failover_script and/or shutdown_script
,MHA会调用这些的脚本。关闭dead master,避免脑裂(值得商榷)。
恢复一台新master
- 从crashed master服务器上保存binlog到Manager(如果可以的话如果dead
master可以SSH的话,拷贝binary
logs从最新的slave上的end_log_pos(Read_Master_Log_Pos)位置开始拷贝。选举新master
一般根据配置文件的设置来决定选举谁,如果想设置一些候选master,设置candidate_master=1;如果想设置一些host,永远都不会选举,设置no_master=1;确认最新的slave
(这台slave拥有最新的relay-log)。恢复和提升新master根据老master binlog生成差异日志,应用日志到new
master,如果这一步发生错误(如:duplicate key error),MHA停止恢复,并且其余的slave也停止恢复。
二:MHA切换
2.1 验证复制设置以及确认当前master状态
连接配置文件中列出的所有hosts,MHA自动来确认当前master是哪个,配置文件中无需指定哪个是master。执行 flush tables 命令在master上(可选). 这样可以缩短FLUSH TABLES WITH READ LOCK的时间。
既不监控master,也不会failover。
检查下面的条件是否满足。
I
- O线程是否在所有slave上都是running
- SQL线程是否在所有slave上都是running
- Seconds_Behind_Master 是否低于2秒(—running_updates_limit=N)
- master上是否没有长的更新语句大于2秒
2.2 确认新master
- 新master需要设置:
–new_master_host参数。原来的master和新的master必须要有同样的复制过滤条件(binlog-do-db and
binlog-ignore-db)。
2.3 当前master停写
- 如果你在配置中定义了master_ip_online_change_script,MHA会调用它。可以通过设置SET GLOBAL
read_only=1来完美的阻止写入。在老master上执行FLUSH TABLES WITH READ
LOCK来阻止所有的写(–skip_lock_all_tables可以忽略这一步)。
2.4 等待其他slave追上当前master,同步无延迟
- 调用这个函数MASTER_LOG_POS()。
2.5 确保新master可写
- 执行SHOW MASTER STATUS来确定新master的binary
log文件名和position。如果设置了master_ip_online_change_script,会调用它。可以创建写权限的用户,SET
GLOBAL read_only=0。
2.6 让其他slave指向新master
-
并行执行CHANGE MASTER, START SLAVE。
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数据库在故障时进行自动切换,不影响业务。
案例实现思路
1、 安装MySQL数据库
2、 配置MySQl一主两从
3、 安装MHA软件
4、 配置无密码认证
5、 配置MySQL MHA 高可用
6、 模拟 master 故障切换
3.2具体搭建过程
这里建议实验主机用 hostnamectl 命令修改,方便实验。
#将manager服务器的主机名改为manager
hostnamectl set-hostname manager
su
#修改服务器名称,将manster服务器的主机名改为manster
hostnamectl set-hostname manster
su
#修改服务器名称,将slave1服务器的主机名改为slaveq
hostnamectl set-hostname slave1
su
#修改服务器名称,将slave2服务器的主机名改为slave2
hostnamectl set-hostname slave2
su
实现MySQL的一主两从
一、MYSQL数据库已经安装完成,接下来是 Mysql 的一主两从部署。
主服务器 master:
vim /etc/my.cnf
server-id = 1 //指定id号,服务器的唯一标识,不能相同
log-bin=master-bin //主服务器日志文件
log-slave-updates=true //从服务器更新二进制日志
重启服务
systemctl restart mysqld
- 从服务器slave1:
1、修改配置文件
vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
注意:如果你的 mysql 手工编译安装的是 5.7 版本,从服务器一定要在client段把 utf-8 这行注释掉,否则在最后检查MHA健康状况时报错。
[client]
#default-character-set=utf8 //注释掉此行代码
2、重启服务
systemctl restart mysqld
同样从服务器 slave2 修改id和日志,重启服务。
vim /etc/my.cnf
server-id = 3
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称
#重启服务
systemctl restart mysqld
3、给master、slave1、slave2 分别建立软链接
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
4、数据库的授权。在所有的数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用监控,即在master、slave1、slave2 上搭建。
mysql -u root -pabc123
grant replication slave on *.* to 'myslave'