前言
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密钥通信。
实验步骤
- 各节点之间配置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/
- 下载MHA安装包进行安装,安装包有如下两个包,node包和manager包:
- MHA master需要安装master包和node包,其他节点只需要安装node包即可
- 数据库服务器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 #开启二进制日志
- 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之后该功能会自动关闭
- 配置好mysql主从复制,所有数据库节点安装MHA node安装包。MHA需要mysql提前配置好主从复制,配置文档见此博客:http://www.cnblogs.com/stacks/p/7171648.html
- 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
- 进行ssh检测
masterha_check_ssh --conf=/etc/masterha/app1.cnf
- 进行复制功能检测
masterha_check_repl --conf=/etc/masterha/app1.cnf
- 启动mha服务
nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /data/masterha/app1/manager.log &
注意:
当master发生变更之后此脚本会自动退出,当修复完故障服务器之后此脚本需要重新启动
- 发生master变更,修复前master服务器
- 发生master变更,修复前master服务器
- 恢复数据库
- mysql配置文件添加read_only=1和relay_log_purge=0
- 通过change master to成为主节点的从节点并开启slave功能
- 修复完成开启mha服务
总结
MHA虽然可以检测master并自动切换,但是其却不能够切换master对外提供服务的ip,此功能需要手动写脚本来实现,MHA支持导入此类脚本进行ip地址变更。