mysql的MHA高可用集群

前言

mysql可以通过主从复制,多主复制,半同步复制等方法解决单点故障问题和io瓶颈。但是复制集群的一个问题就是每次master宕机都需要手动去提升从节点,那么有没有比较好的方法来解决此问题呢?MHA就是这样的解决方案。
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA由两部分组成,MHA Manageer和MHA Node。MHA manager主要是监控mysql集群的状态,当master发生故障之后其可以自动提升数据相对更接近于master的slave为主节点,然后将其他slave指向新的master。

注意:
mysql的slave总是会复制master的二进制日志到自己的中继日志进行数据同步,但是这存在一定的问题。比如master刚把数据写入二进制日志,而从节点还没有同步,因为它们之间默认是通过异步方式进行同步的,此时就会发生数据不一致。所以此问题可以通过mysql的半同步复制解决,选择一台slave采用同步方式和master同步数据,当集群发生故障,则MHA自动提升半同步slave节点为master。

实验环境

采用四台服务器来进行此配置:

  • MHA manager:192.168.11.197
  • master节点:192.168.11.194
  • slave节点-1:192.158.11.195
  • slave节点-2:192.168.11.196
    MHA要求各节点能够通过ssh密钥无障碍通信,因为各个节点需要同步日志。所以需要设置ssh密钥通信。

实验步骤

  1. 各节点之间配置ssh,因为是4台服务器,为了避免每个服务器都生成ssh密钥,此处在一台服务器生成ssh密钥,然后4台服务器共用此密钥
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.11.194
scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.195:/root/.ssh/
scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.196:/root/.ssh/
scp -p .ssh/authorized_keys .ssh/id_rsa{,.pub} root@192.168.11.197:/root/.ssh/
  1. 下载MHA安装包进行安装,安装包有如下两个包,node包和manager包:
  2. MHA master需要安装master包和node包,其他节点只需要安装node包即可
  3. 数据库服务器master节点配置mysql配置文件如下:
[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON

server_id=13       #配置服务器id
relay_log=relay-log    #开启中继日志,因为master可能会变成slave
log_bin=master-log    #开启二进制日志
  1. slave节点配置文件如下:
[mysqld]
skip_name_resolve=ON
innodb_file_per_table=ON

server_id=11
relay_log=relay-log
log-bin=master-log
relay_log_purge=0    #关闭中继日志裁剪,因为其他slave可能会从此服务器同步relay日志
read_only=1        #开启只读功能,当其提升为master之后该功能会自动关闭
  1. 配置好mysql主从复制,所有数据库节点安装MHA node安装包。MHA需要mysql提前配置好主从复制,配置文档见此博客:http://www.cnblogs.com/stacks/p/7171648.html
  2. manager创建/etc/masterha/app1.cnf,文件名随便起,添加如下内容:
[server default]
user=mhaadmin    #MHA连接mysql的管理用户
password=1234567a    #MHA连接mysql的管理用户密码
manager_workdir=/data/masterha/app1    #MHA工作目录
manager_log=/data/masterha/app1/manager.log    #MHA日志存储路径
remote_workdir=/data/masterha/app1    #其他节点MHA工作路径
ssh_user=root    #ssh用户
repl_user=repluser    #mysql复制用户
repl_password=1234567a    #mysql复制用户密码
ping_interval=1    #每个多久检测一下master是否在线

[server1]
hostname=192.168.11.194
candidate_master=1	#是否允许成为master#

[server2]
hostname=192.168.11.195
candidate_master=1

[server3]
hostname=192.168.11.196
candidate_master=1
  1. 进行ssh检测
masterha_check_ssh --conf=/etc/masterha/app1.cnf
  1. 进行复制功能检测
masterha_check_repl --conf=/etc/masterha/app1.cnf
  1. 启动mha服务
nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /data/masterha/app1/manager.log &

注意:
当master发生变更之后此脚本会自动退出,当修复完故障服务器之后此脚本需要重新启动

  1. 发生master变更,修复前master服务器
    1. 发生master变更,修复前master服务器
    2. 恢复数据库
    3. mysql配置文件添加read_only=1和relay_log_purge=0
    4. 通过change master to成为主节点的从节点并开启slave功能
  2. 修复完成开启mha服务

总结

MHA虽然可以检测master并自动切换,但是其却不能够切换master对外提供服务的ip,此功能需要手动写脚本来实现,MHA支持导入此类脚本进行ip地址变更。

原文地址:https://www.cnblogs.com/stacks/p/7197325.html