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特点
从宕机崩溃的master保存二进制日志事件(binlog events);
识别含有最新更新的slave;
应用差异的中继日志(relay log)到其他slave;
应用从master保存的二进制日志事件(binlog events);
提升一个slave为新master;
使用其他的slave连接新的master进行复制。
验证复制设置以及确认当前master状态
监控master
检测master是否失败
再次验证slave的配置
关掉失败的master的服务器(可选)
恢复一台新master
连接配置文件中列出的所有hosts,MHA自动来确认当前master是哪个,配置文件中无需指定哪个是master。执行 flush tables 命令在master上(可选). 这样可以缩短FLUSH TABLES WITH READ LOCK的时间。
既不监控master,也不会failover。
检查下面的条件是否满足。
I
并行执行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线程);
这里建议实验主机用 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
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