mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案。

一,什么是mha,有什么特性

1. 主服务器的自动监控和故障转移

MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。MHA通常在几秒内完成故障转移,9-12秒可以检测出主服务器故障,7-10秒内关闭故障的主服务器以避免脑裂,几秒中内应用差异的relay log到新的主服务器上,整个过程可以在10-30s内完成。还可以设置优先级指定其中的一台slave作为master的候选人。由于MHA在slaves之间修复一致性,因此可以将任何slave变成新的master,而不会发生一致性的问题,从而导致复制失败。

2. 交互式主服务器故障转移

可以只使用MHA的故障转移,而不用于监控主服务器,当主服务器故障时,人工调用MHA来进行故障故障。

3. 非交互式的主故障转移

不监控主服务器,但自动实现故障转移。这种特征适用于已经使用其他软件来监控主服务器状态,比如heartbeat来检测主服务器故障和虚拟IP地址接管,可以使用MHA来实现故障转移和slave服务器晋级为master服务器。

4. 在线切换主从服务器

在许多情况下,需要将现有的主服务器迁移到另外一台服务器上。比如主服务器硬件故障,RAID控制卡需要重建,将主服务器移到性能更好的服务器上等等。维护主服务器引起性能下降,导致停机时间至少无法写入数据。另外,阻塞或杀掉当前运行的会话会导致主主之间数据不一致的问题发生。MHA提供快速切换和优雅的阻塞写入,这个切换过程只需要0.5-2s的时间,这段时间内数据是无法写入的。在很多情况下,0.5-2s的阻塞写入是可以接受的。因此切换主服务器不需要计划分配维护时间窗口(呵呵,不需要你在夜黑风高时通宵达旦完成切换主服务器的任务)。

5.MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)

要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,管理节点可以和master在一台机器上。所以如果你只有二台机器的话,heartbeat,keepalive等都是不错的选择了。

6.MHA比较灵活,可以写脚本,来进行故障转移,或者主从切换等。

7.mha出现故障后,配置文件会被修改掉,这一点,让我觉得很搞笑,如果故障转移需要重新修改配置文件,重新启动masterha_manager服务.

二,服务器说明

  1. 192.168.10.103 masters   //主
  2. 192.168.10.209 slave1    //从
  3. 192.168.10.219 slave2    //从(主备)
  4. 192.168.10.220 manage    //管理节点

一主二从,一个管理节点,将上面的内容写入到每台/etc/hosts当中

三,服务器间,无密码ssh登录

  1. # ssh-keygen -t rsa
  2. # ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.103
  3. # ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.209
  4. # ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.219
  5. # ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.220

上面有5个命令,如果在103机器上,103本身不需要执行ssh-copy-id。copy完了以后,ssh测试一下,机器间切换是不是需要密码了。

四,安装mha

1,下载mha

https://code.google.com/p/mysql-master-ha/downloads/list

2,所有节点都要安装

  1. # yum install -y perl-DBD-MySQL
  2. # rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm

3,管理节点

  1. # yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
  2. # rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm

注意:manager和node节点的版本可以不一样

五,配置mysql replication

请参考:mysql replication 主从(master-slave)同步

要符合mha的配置,根这篇文章有点不同。

1,主从的配置都要有

  1. binlog-do-db=test
  2. replicate-do-db=test

一般情况下,主服务器需要包含binlog-do-db=test,从服务器需要包含replicate-do-db=test,这样主从就可以同步了。但是只是这样配置的话,会报以下错误

All log-bin enabled servers must have same binlog filtering rules (same binlog-do-db and binlog-ignore-db). Check SHOW MASTER STATUS output and set my.cnf correctly.

在摸索这一块配置的时候,浪费很多时间,我一直以为,上面英文的意思是说,主从同步的数据库要一样,其实不是,而是配置文件中,配置数据库这一块要一样。

2,从服务器,要加上relay_log_purge=0,不加的话,会报出warning,relay_log_purge=0 is not set on slave

六,corosync pacemaker mysql replication配置

请参考:corosync pacemaker mysql replication 实现高可用

配置corosync pacemaker的目的,其实就是为得到一个虚拟IP,连主和主备中的一个,我可以通过虚拟IP连接,这样做的好处就是,如果主down机了,我通过虚拟IP可以连接主备,如果主修改好了,那么虚拟IP可以连接到主,而不需要去修改代码。

七,配置mha manage

1,添加管理账号,每台机器都执行以下操作

  1. grant all privileges on *.* TO mha@'192.168.%' IDENTIFIED BY 'test';
  2. flush privileges;

2,配置/etc/mha/app1.cnf,只在管理端做,manage这台机器

  1. # mkdir /etc/mha
  2. # mkdir -p /var/log/mha/app1
  3. [root@manage mysql]# cat /etc/mha/app1.cnf
  4. [server default]
  5. manager_log=/var/log/mha/app1/manager.log
  6. manager_workdir=/var/log/mha/app1.log
  7. master_binlog_dir=/var/lib/mysql
  8. user=mha
  9. password=test
  10. ping_interval=2
  11. repl_password=test
  12. repl_user=test
  13. ssh_user=root
  14. [server1]
  15. hostname=192.168.10.103
  16. port=3306
  17. [server2]
  18. candidate_master=1
  19. check_repl_delay=0
  20. hostname=192.168.10.219
  21. port=3306
  22. [server3]
  23. hostname=192.168.10.209
  24. port=3306

在server default中的配置,是三台机器共同的配置,也可以放到具体的server中进行定制

八,检查mha manage是不是配置成功

1,检查ssh登录

  1. # masterha_check_ssh --conf=/etc/mha/app1.cnf

如果看到,All SSH connection tests passed successfully,就说明ssh配置成功了

2,检查mysql replication是否配置成功

  1. # masterha_check_repl --conf=/etc/mha/app1.cnf

如果,出现以下内容,说明配置成功了。

mha 检验 mysql replication

3,管理端常用命令

  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信息

九,在管理端,启动监控

  1. [root@manage mha]#  nohup masterha_manager --conf=/etc/mha/app1.cnf > /tmp/mha_manager.log  2>&1 &    //开启MHA
  2. [root@manage mha]# masterha_check_status --conf=/etc/mha/app1.cnf  //查看状态   app1 (pid:13675) is running(0:PING_OK), master:192.168.10.103   //说明已经启用
  3. [root@manage mha]# masterha_stop --conf=/etc/mha/app1.cnf  //关闭监控

到这儿,mha我们就配置好了。

十,说一下,我的测试过程

1,mysql -u test -p -h 192.168.10.130,通过虚拟IP登录

2,插入数据,查看一下主103有没有该数据,以及二个从服务器,是不是同步了数据。

3,在主103上,执行crm node standby,会带来几种结果。

在220机器上,/etc/mha/app1.cnf

[server1]
hostname=192.168.10.103
port=3306

这段配置消失了。

在219机器上,show master status;是有数据的,变成主机了

在209机器上,show slave status\G;中 Master_Host: 192.168.10.219,变成219了。

4,在103上面,执行# crm node online,这个时候,103既不是主,也不是从,standby后mysqld进程被关闭,所以在这儿要启动mysqld,然后在将103加入到219中。

  1. mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.219',
  2. MASTER_USER='test', MASTER_PASSWORD='test',
  3. MASTER_LOG_FILE='mysql-bin.000048',
  4. MASTER_LOG_POS=107;

5,在线切换主从

  1. [root@manage mysql]# masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=192.168.10.103 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
  2. Wed Apr 29 04:14:55 2015 - [info] MHA::MasterRotate version 0.55.
  3. Wed Apr 29 04:14:55 2015 - [info] Starting online master switch..
  4. Wed Apr 29 04:14:55 2015 - [info]
  5. Wed Apr 29 04:14:55 2015 - [info] * Phase 1: Configuration Check Phase..
  6. Wed Apr 29 04:14:55 2015 - [info]
  7. Wed Apr 29 04:14:55 2015 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
  8. Wed Apr 29 04:14:55 2015 - [info] Reading application default configurations from /etc/mha/app1.cnf..
  9. Wed Apr 29 04:14:55 2015 - [info] Reading server configurations from /etc/mha/app1.cnf..
  10. Wed Apr 29 04:14:55 2015 - [info] Current Alive Master: 192.168.10.219(192.168.10.219:3306)
  11. Wed Apr 29 04:14:55 2015 - [info] Alive Slaves:
  12. Wed Apr 29 04:14:55 2015 - [info] 192.168.10.209(192.168.10.209:3306) Version=5.1.73-log (oldest major version between slaves) log-bin:enabled
  13. Wed Apr 29 04:14:55 2015 - [info] Replicating from 192.168.10.219(192.168.10.219:3306)
  14. It is better to execute FLUSH NO_WRITE_TO_BINLOG TABLES on the master before switching. Is it ok to execute on 192.168.10.219(192.168.10.219:3306)? (YES/no): yes
  15. Wed Apr 29 04:15:10 2015 - [info] Executing FLUSH NO_WRITE_TO_BINLOG TABLES. This may take long time..
  16. Wed Apr 29 04:15:10 2015 - [info] ok.
  17. Wed Apr 29 04:15:10 2015 - [info] Checking MHA is not monitoring or doing failover
  18. 。。。。。。。。。。。。。省略了。。。。。。。。。。。。。。。

这样就切换到最原始的状态了。

mysql mha 主从自动切换 高可用的更多相关文章

  1. Redis主从配置及通过Keepalived实现Redis自动切换高可用

    Redis主从配置及通过Keepalived实现Redis自动切换高可用 [日期:2014-07-23] 来源:Linux社区  作者:fuquanjun [字体:大 中 小]   一:环境介绍: M ...

  2. Keepalived与MySQL互为主从自动切换配置

    为解决Mysql数据库单点问题,实现两台MySQL数据库互为主备,双向replication.当一Master出现问题,则将Slave切换为Master继续工作. 环境说明 系统版本:CentOS L ...

  3. CYQ.Data 支持分布式数据库(主从备)高可用及负载调试

    前言: 继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试 本篇介绍 CYQ.Data 在对数据库层面 ...

  4. Dledger的是如何实现主从自动切换的

    前言 hello小伙伴们,今天王子又来继续和大家聊RocketMQ了,之前的文章我们一直说Broker的主从切换是可以基于Dledger实现自动切换的,那么小伙伴们是不是很好奇它究竟是如何实现的呢?今 ...

  5. 使用keepalived实现mysql主从复制的自动切换

    最近测试了一下mysql+keepalived实现主从自动切换,主从都需要安装keepalived,使用vip漂移实现主从自动切换,这里主要记录的是keepalived的文件配置. 这里mysql搭建 ...

  6. [转帖]【MySQL+keepalived】用keepalived实现MySQL主主模式的高可用

    [MySQL+keepalived]用keepalived实现MySQL主主模式的高可用 https://www.jianshu.com/p/8694d07595bc 一.实验说明 MySQL主主模式 ...

  7. Mysql双主双从高可用集群的搭建且与MyCat进行整合

    1.概述 老话说的好:瞻前顾后.患得患失只会让我们失败,下定决心,干就完了. 言归正传,之前我们聊了Mysql的一主一从读写分离集群的搭建,虽然一主一从或一主多从集群解决了并发读的问题,但由于主节点只 ...

  8. java使用Redis7--分布式存储并实现sentinel主从自动切换

    前面实现了分布式存储,也实现了sentinel单点故障时主从自动切换,现在还需要一种机制,实现分布式存储下,单点故障时的主从自动切换. Server配置 # cd /usr/redis/src/tes ...

  9. 利用keepalive+mysql replication 实现数据库的高可用

    利用keepalive+mysql replication 实现数据库的高可用 http://www.xuchanggang.cn/archives/866.html

随机推荐

  1. Flex数据交互之WebService

    In this article you will learn how to call webservices hosted on asp.net applications from flex. Fir ...

  2. Jmeter组件5. 逻辑控制

    逻辑控制组件也有不少,但是用到的情况也不多,只打算举个While controller结合Regular Expression Extractor的例子 Condition,跳出循环的条件 如果放空, ...

  3. .net实现调用本地exe等应用程序的办法总结

    根据客户需求用户要实现在一个BS系统上打开本地的一应用程序,在网上查了好多资料再加上自己的各种测试,到最后功能是实现了,只不过还存在一些问题,接下来会先把各种方法一一列举出来 1.先写最终测试通过的这 ...

  4. Excel的文件打开特别慢,xls文件特别大解决一例

    Excel的文件打开特别慢,xls文件特别大解决一例 打开Excel的xls文件打开特别慢,而且操作也非常慢,动辄需要10几20分钟,很不正常.一个简单的Excel的xls文件有10几兆,甚至几百兆的 ...

  5. awk用法

    目前虽然有很多工具可以代替awk,但是呢我还是认为awk还是非常重要,比如有时候load数据到hive,mysql发现数据有点问题,这样可以先对比文件和库中数据是否一致,这样awk就发挥用处了,还有从 ...

  6. gcc相关

    linux操作系统上面开发程序, 光有了gcc 是不行的 它还需要一个   build-essential软件包作用是提供编译程序必须软件包的列表信息 也就是说 编译程序有了这个软件包它才知道 头文件 ...

  7. Ajax readystate 5种状态

    Status 说明 0(Uninitialized) XMLHttpRequest 对象已经创建,但没调用 open 方法. 1(Loading) 调用 open 方法,但没调用 send 方法.(尚 ...

  8. C basics

    C 日记目录 C basics ................ writing Numeration storage   , structor space assigning pointer,  a ...

  9. java与微信企业号交互

    微信企业号接收消息(使用SpringMVC): http://blog.csdn.net/omsvip/article/details/39480577 微信企业号api: http://qydev. ...

  10. (转载)IOS中UIScrollView的属性和委托方法

    http://www.jizhishusheng.com/?p=453   ---- 以下内容来自 UIScrollView 类负责所有基于 UIKit 的滚动操作一.创建 1. CGRect bou ...