mysql-mmm+amoeba+keepalived架构简介:利用mysql-mmm来实现mysql的高可用,利用amoeba来实现读写分离,利用keepalived来实现amoeba程序的高可用。从而从整体上实现mysql的高可用行。

一、        MMM简介:
MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。
MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,更牛的是如果当前的主服务器挂掉后,会将你后端的从自动转向新的主服务器进行同步复制,不用手工更改同步资料。
MMM项目来自 Google:http://code.google.com/p/mysql-master-master
官方网站为:http://mysql-mmm.org

Mmm主要功能由下面三个脚本提供
        mmm_mond  负责所有的监控工作的监控守护进程,决定节点的移除等等
        mmm_agentd  运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点
        mmm_control  通过命令行管理mmm_mond进程

二、        mysql-mmm架构的搭建
1、        先来看下本文的架构图:



当master1出现故障的时候,架构图会自动屏蔽master1,并自动将slave1和slave2更改成从master2更新,架构图变成如下:



2、        先介绍下本文的环境:
系统环境:CentOS release 5.4(32bit)
function          ip                              hostname         server id
Monitor         192.168.1.163               Server3              -
master 1         192.168.1.161              Server1              1
master 2         192.168.1.162              Server2              2
slave 1            192.168.1.164              Server4              5
slave 2            192.168.1.165              Server5              6
Amoeba1       192.168.1.167               Server6              -
Amoeba2       192.168.1.168               Server7              -

我用了以下的虚拟IP,他们将会在被mmm分配,这些IP都是浮动的,当出现故障的时候会自动的转移到其他的可用服务器上。
ip                            role                     description
192.168.1.113         writer                   你的应用程序应该连接到这个ip进行写操作
192.168.1.111         reader                  你的应用程序应该链接到这些ip中的一个进行读操作
192.168.1.112         reader        
192.168.1.114         reader        
192.168.1.115         reader        
192.168.1.170        Amoeba_vip           程序连接的Ip,实现mysql读写分离

mysql-mmm架构配置简介:
        在server1、server2上安装mysql,并配置为master-master架构(就是互为主从)----------配置很简单,就不对着部分进行详细解释,有问题的话请查看:http://blog.chinaunix.net/u3/93755/showart.php?id=2213538
        配置server4,server5从server1获取更新   ------这一步很简单,自行设置,有一点需要注意,就是设置同步不能设置浮动IP,要使用真实的IP。
        在server1、server2、server3、server4、server5上安装mmm,并配置:mmm_common.conf、mmm_agent.conf以及mmm_mon.conf文件

3、        Mysql-mmm实战
前提:server1和server2上已经配置好mysql主主同步,server4、server5设置好了利用server1为主服务器的主从同步
        安装mysql-mmm(在server1,server2,server3,server4,server5上都要安装)
CentOS软件仓库默认是不含这些软件的,必须要有epel这个包的支持。故我们必须先安装epel:
 

  1. wget  http://download.fedora.redhat.co ... ease-5-4.noarch.rpm
     
  2. rpm -Uvh epel-release-5-4.noarch.rpm
     
  3. yum -y install mysql-mmm*
复制代码



        配置mmm代理和监控账号的权限
在server1,server2,server4,server5上分别执行:
 

  1. GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'monitor_password';
     
  2. GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%'   IDENTIFIED BY 'agent_password';
     
  3. flush privileges;
复制代码



        配置mysql-mmm
所有的配置选项都集合在了一个叫/etc/mysql-mmm/mmm_common.conf的单独文件中,系统中所有主机的该文件内容都是一样的, 配置完后不要忘记了拷贝这个文件到所有的主机(包括监控主机)!,内容如下:
 

  1. active_master_role      writer
     

  2.  

  3.  
  4.     cluster_interface       eth0
     
  5.     pid_path                /var/run/mysql-mmm/mmm_agentd.pid
     
  6. bin_path                /usr/libexec/mysql-mmm/
     
  7. #同步的帐号(这些要和前面设置的保持一致!)
     
  8.     replication_user        replication   
     
  9.     replication_password    123456        #同步的密码
     
  10.     agent_user              mmm_agent        #mmm-agent用户
     
  11.     agent_password          agent_password        #mmm-agent用户密码
     

  12.  

  13.  

  14.  
  15.     ip      192.168.1.161        #db1的ip
     
  16.     mode    master
     
  17.     peer    db2
     

  18.  

  19.  

  20.  
  21.     ip      192.168.1.162        #db2的ip
     
  22.     mode    master
     
  23.     peer    db1
     

  24.  

  25.  

  26.  
  27.     ip      192.168.1.164   #从db3的ip
     
  28.     mode    slave
     

  29.  

  30.  

  31.  
  32.     ip      192.168.1.165   #从db4的ip
     
  33.     mode    slave
     

  34.  

  35.  

  36.  

  37.  
  38.     hosts   db1, db2
     
  39.     ips     192.168.1.113        #设置写如的虚拟IP
     
  40.     mode    exclusive
     

  41.  

  42.  

  43.  
  44.     hosts   db1, db2, db3, db4
     
  45.     ips     192.168.1.111, 192.168.1.112, 192.168.1.114, 192.168.1.115        #设置读取的虚拟IP
     
  46.     mode    balanced
     
复制代码



数据库主机上我们需要编辑/etc/mysql-mmm/mmm_agent.conf文件,根据其他主机的不同更改db1的值(db2就将db1更改成db2…….):
 

  1. include mmm_common.conf
     
  2. this db1
复制代码



在监控主机上我们需要编辑/etc/mysql-mmm/mmm_mon.conf文件:
 

  1. include mmm_common.conf
     

  2.  

  3.  
  4.     ip                  127.0.0.1
     
  5.     pid_path            /var/run/mysql-mmm/mmm_mond.pid
     
  6.     bin_path            /usr/libexec/mysql-mmm
     
  7.     status_path         /var/lib/mysql-mmm/mmm_mond.status
     
  8.     ping_ips            192.168.1.161,192.168.1.162, 192.168.1.164,192.168.1.165  #监控服务器ip
     
  9.     auto_set_online     60
     

  10.  
  11.     # The kill_host_bin does not exist by default, though the monitor will
     
  12.     # throw a warning about it missing.  See the section 5.10 "Kill Host
     
  13.     # Functionality" in the PDF documentation.
     
  14.     #
     
  15.     # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
     
  16.     #
     

  17.  

  18.  

  19.  
  20.     monitor_user        mmm_monitor        #mmm_monitor用户名
     
  21.     monitor_password    monitor_password #mmm_monitor密码
     

  22.  

  23.  
  24. debug 0
复制代码




       启动MMM
启动代理:
(在数据库服务器上server1、2)编辑/etc/default/mysql-mmm-agent来开启:
 

  1. ENABLED=1
复制代码


然后启动它:
 

  1. /etc/init.d/mysql-mmm-agent start
复制代码


启动监控(在监控机上):
 

  1. /etc/init.d/mysql-mmm-monitor start
复制代码



        利用mmm_control监控mysql服务器状态:
 

  1. [root@server3 ~]#  mmm_control show
     
  2.   db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.111), writer(192.168.1.113)
     
  3.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.114)
     
  4.   db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
     
  5.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.112)
复制代码



        测试看两个mysql服务器能否实现故障自动切换
停掉作为写的db1上的mysql,查看写的服务器会不会自动转移到db2上去
停掉几秒钟后用mmm_control show查看:
 

  1. [root@server3 ~]#  mmm_control show
     
  2.   db1(192.168.1.161) master/HARD_OFFLINE. Roles:
     
  3.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
     
  4.   db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)
     
  5.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
复制代码


我们可以看到已经把db2当作主写服务器,另外server4、server5原来是从server1更新的现在已经被mmm自动更改到从新的主服务器server2上更新了,很神奇!可以登录到server4、server5上用show slave status\G;命令查看!

再来看看db1恢复后会是什么情况:
 

  1. [root@server3 ~]#  mmm_control show
     
  2.   db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114)
     
  3.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
     
  4.   db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
     
  5.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
复制代码


我们可以看到当db1恢复后就充当slave的角色了!只有当db2挂了以后db1又会担当起主服务器的写入功能
发现个bug,不知道有没有人遇到过:有的时候会出现服务器恢复后,服务器的状态被设置为:AWAITING_RECOVERY,必须要手工执行mmm_control set_online host才能恢复正常,比如:有的时候我恢复db1后,出现如下:
 

  1. [root@server3 ~]#  mmm_control show
     
  2.   db1(192.168.1.161) master/AWAITING_RECOVERY. Roles:
     
  3.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
     
  4.   db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)
     
  5.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
复制代码


解决办法为利用set_online手工更改为在线状态:
 

  1. [root@server3 ~]#  mmm_control set_online db1
     
  2. OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
     
  3. [root@server3 ~]#  mmm_control show
     
  4.   db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114)
     
  5.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
     
  6.   db3(192.168.1.164) slave/ONLINE. Roles: reader(192.168.1.115)
     
  7.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
复制代码


解决这个问题CU网友提供了一个办法就是将auto_set_online设置小点,默认是60s,设置成10看下会不会有改善?我测试的是改小后没出现,回头多测试几次看看。

        mmm_control命令简介
 

  1. [root@server3 mysql-mmm]# mmm_control help
     
  2. Valid commands are:
     
  3.     help                              - show this message
     
  4.    #查看帮助信息
     
  5. ping                              - ping monitor
     
  6. #ping监控
     
  7. show                              - show status
     
  8. #查看状态信息
     
  9. checks [|all [|all]] - show checks status
     
  10. #显示检查状态,包括(ping、mysql、rep_threads、rep_backlog)
     
  11. set_online                  - set host online
     
  12. #设置某host为online状态
     
  13. set_offline                 - set host offline
     
  14. #设置某host为offline状态
     
  15. mode                              - print current mode.
     
  16. #打印当前的模式,是ACTIVE、MANUAL、PASSIVE?
     
  17. #默认ACTIVE模式
     
  18. set_active                        - switch into active mode.
     
  19. #更改为active模式
     
  20. set_manual                        - switch into manual mode.
     
  21. #更改为manual模式
     
  22. set_passive                       - switch into passive mode.
     
  23. #更改为passive模式
     
  24. move_role [--force] - move exclusive role to host
     
  25. #更改host的模式,比如更改处于slave的mysql数据库角色为write   
     
  26. (Only use --force if you know what you are doing!)
     
  27. set_ip                 - set role with ip to host
     
  28. #为host设置ip,只有passive模式的时候才允许更改!
复制代码
本帖最后由 飞鸿无痕 于 2010-11-11 23:10 编辑

三、        利用amoeba实现高可用下的读写分离
1、        关于amoeba的介绍和安装我这里不做介绍了,请查看:http://blog.chinaunix.net/u3/93755/showart.php?id=2363202,有什么问题我们再一起讨论。
2、        Amoeba在mysql-mmm架构下的配置
配置的除了amoeba的监听IP外其他的均采用上面mmm分配的浮动IP,因为当出现故障后,浮动IP会自动分配到正常的server上。amoeba.xml的配置如下:

  1.  

  2.  

  3.  

  4.  

  5.  
  6.         
     
  7.                
     
  8.                 3306
     
  9.                
     
  10.                
     
  11.                 0.0.0.0
     
  12.                
     
  13.                 20
     
  14.                
     
  15.                
     
  16.                 30
     
  17.                
     
  18.                
     
  19.                 30
     
  20.                
     
  21.                
     
  22.                 128
     
  23.                
     
  24.                
     
  25.                 true
     
  26.                
     
  27.                 root
     
  28.                 password
     
  29.                
     
  30.                
     
  31.                 60
     
  32.         
     
  33.         
     
  34.         
     
  35.         
     
  36.                
     
  37.                         com.meidusa.amoeba.net.AuthingableConnectionManager
     
  38.                         
     
  39.                         
     
  40.                
     
  41.         
     
  42.         
     
  43.         
     
  44.                
     
  45.                
     
  46.                         
     
  47.                         
     
  48.                         
     
  49.                                 defaultManager
     
  50.                                 
     
  51.                                 
     
  52.                                 3306
     
  53.                                 
     
  54.                                 
     
  55.                                 192.168.1.113
     
  56.                                 test
     
  57.                                 
     
  58.                                 
     
  59.                                 zhang
     
  60.                                 
     
  61.                                 
     
  62.                                 zhang123
     
  63.                                 
     
  64.                         
     
  65.                         
     
  66.                         
     
  67.                         
     
  68.                                 200
     
  69.                                 200
     
  70.                                 10
     
  71.                                 600000
     
  72.                                 600000
     
  73.                                 true
     
  74.                                 true
     
  75.                         
     
  76.                
     
  77.                
     

  78.  
  79.                
     
  80.                         
     
  81.                         
     
  82.                         
     
  83.                                 defaultManager
     
  84.                                 
     
  85.                                 
     
  86.                                 3306
     
  87.                                 
     
  88.                                 
     
  89.                                 192.168.1.111
     
  90.                                 test
     
  91.                                 
     
  92.                                 
     
  93.                                 zhang
     
  94.                                 
     
  95.                                 
     
  96.                                 zhang123
     
  97.                                 
     
  98.                         
     
  99.                         
     
  100.                         
     
  101.                         
     
  102.                                 200
     
  103.                                 200
     
  104.                                 10
     
  105.                                 600000
     
  106.                                 600000
     
  107.                                 true
     
  108.                                 true
     
  109.                         
     
  110.                
     

  111.  

  112.  
  113.                
     
  114.                         
     
  115.                         
     
  116.                         
     
  117.                                 defaultManager
     
  118.                                 
     
  119.                                 
     
  120.                                 3306
     
  121.                                 
     
  122.                                 
     
  123.                                 192.168.1.112
     
  124.                                 test
     
  125.                                 
     
  126.                                 
     
  127.                                 zhang
     
  128.                                 
     
  129.                                 
     
  130.                                 zhang123
     
  131.                                 
     
  132.                         
     
  133.                         
     
  134.                         
     
  135.                         
     
  136.                                 200
     
  137.                                 200
     
  138.                                 10
     
  139.                                 600000
     
  140.                                 600000
     
  141.                                 true
     
  142.                                 true
     
  143.                         
     
  144.                
     

  145.  

  146.  
  147.                
     
  148.                         
     
  149.                         
     
  150.                         
     
  151.                                 defaultManager
     
  152.                                 
     
  153.                                 
     
  154.                                 3306
     
  155.                                 
     
  156.                                 
     
  157.                                 192.168.1.114
     
  158.                                 test
     
  159.                                 
     
  160.                                 
     
  161.                                 zhang
     
  162.                                 
     
  163.                                 
     
  164.                                 zhang123
     
  165.                                 
     
  166.                         
     
  167.                         
     
  168.                         
     
  169.                         
     
  170.                                 200
     
  171.                                 200
     
  172.                                 10
     
  173.                                 600000
     
  174.                                 600000
     
  175.                                 true
     
  176.                                 true
     
  177.                         
     
  178.                
     

  179.  

  180.  
  181.                
     
  182.                         
     
  183.                         
     
  184.                         
     
  185.                                 defaultManager
     
  186.                                 
     
  187.                                 
     
  188.                                 3306
     
  189.                                 
     
  190.                                 
     
  191.                                 192.168.1.115
     
  192.                                 test
     
  193.                                 
     
  194.                                 
     
  195.                                 zhang
     
  196.                                 
     
  197.                                 
     
  198.                                 zhang123
     
  199.                                 
     
  200.                         
     
  201.                         
     
  202.                         
     
  203.                         
     
  204.                                 200
     
  205.                                 200
     
  206.                                 10
     
  207.                                 600000
     
  208.                                 600000
     
  209.                                 true
     
  210.                                 true
     
  211.                         
     
  212.                
     

  213.  

  214.  

  215.  
  216.                
     
  217.                
     
  218.                         
     
  219.                                 
     
  220.                                 1
     
  221.                                 
     
  222.                                 
     
  223.                                 server1
     
  224.                         
     
  225.                
     

  226.  
  227.                
     
  228.                         
     
  229.                                 
     
  230.                                 1
     
  231.                                 
     
  232.                                 
     
  233.                                 server2,server3,server4,server5
     
  234.                         
     
  235.                
     
  236.                
     
  237.         
     
  238.         
     
  239.         
     
  240.                 ${amoeba.home}/conf/rule.xml
     
  241.                 ${amoeba.home}/conf/functionMap.xml
     
  242.                 ${amoeba.home}/conf/ruleFunctionMap.xml
     
  243.                 1500
     
  244.                 master
     
  245.                 master
     
  246.                 slave
     
  247.                 true
     
  248.         
     
复制代码


3、        启动amoeba
  1. /usr/local/amoeba/bin/amoeba &   
复制代码

检验启动是否成功(使用的是默认的8066端口):
  1. [root@server3 ~]# ps aux | grep amoeba
     
  2. root     15390  0.2 21.7 411800 55684 pts/0    Sl   Nov09   0:13 /usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m -Xss128k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher
复制代码


4、        测试
为了有权限,请在所有mysql-server上添加上面配置的用户名和密码,比如:
  1. grant all on test.* to zhang@'192.168.1.%' identified by 'zhang123';
     
  2. flush privileges;
复制代码

测试的时候比较麻烦,因为如果把主从停掉来看效果的话,mmm会将该同步状态有问题的服务器设置成REPLICATION_FAIL并将该主机上的浮动IP移动到正常服务器,比如:我将server4停掉后,就出出现如下现象:
  1. [root@server3 ~]#  mmm_control show
     
  2.   db1(192.168.1.161) master/ONLINE. Roles: reader(192.168.1.114), reader(192.168.1.115)
     
  3.   db2(192.168.1.162) master/ONLINE. Roles: reader(192.168.1.112), writer(192.168.1.113)
     
  4.   db3(192.168.1.164) slave/REPLICATION_FAIL. Roles:
     
  5.   db4(192.168.1.165) slave/ONLINE. Roles: reader(192.168.1.111)
复制代码

暂时没想到很好的测试办法。读写分离测试没有问题。
最近手头没有空闲的机器来做压力测试。等有了机器了再对这个架构做下压力测试!


四、        利用keepalived实现amoeba高可用
Keepalived简介:Keepalived是Linux下面实现VRRP 备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。从而提高系统的可用性

1、        keepalived的安装(server6、server7上都要安装):
  1. wget [url]http://www.keepalived.org/software/keepalived-1.1.19.tar.gz[/url]
     
  2. tar zxvf keepalived-1.1.19.tar.gz
     
  3. cd keepalived-1.1.19
     
  4. ./configure --prefix=/usr/local/keepalived
     
  5. make
     
  6. make install
     
  7. cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
     
  8. cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
     
  9. cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
     
  10. mkdir /etc/keepalived
     
  11. cd /etc/keepalived/
复制代码


2、        keepalived的配置
配置server6的keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:
  1. bal_defs {
     
  2.         notification_email {
     
  3.                [email][email protected][/email]
     
  4.         }
     
  5.         notification_email_from [email][email protected][/email]
     
  6.         smtp_server 127.0.0.1
     
  7.         smtp_connect_timeout 30
     
  8.         router_id test1
     
  9. }
     

  10.  

  11.  
  12. vrrp_instance VI_1 {
     
  13.         state MASTER
     
  14.         interface eth0
     
  15.         virtual_router_id 51
     
  16.         priority 100
     
  17.         advert_int 1
     
  18.         smtp_alert
     
  19.         authentication {
     
  20.                 auth_type PASS
     
  21.                 auth_pass 123
     
  22.         }
     

  23.  
  24.         virtual_ipaddress {
     
  25.                 192.168.1.170
     
  26.         }
     
  27. }
复制代码


配置server6的keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:

  1. bal_defs {
     
  2.         notification_email {
     
  3.                 [email][email protected][/email]
     
  4.         }
     
  5.         notification_email_from [email][email protected][/email]
     
  6.         smtp_server 127.0.0.1
     
  7.         smtp_connect_timeout 30
     
  8.         router_id test2
     
  9. }
     

  10.  
  11. vrrp_instance VI_1 {
     
  12.         state BACKUP
     
  13.         interface eth0
     
  14.         virtual_router_id 51
     
  15.         priority 80
     
  16.         advert_int 1
     
  17.         smtp_alert
     
  18.         authentication {
     
  19.                 auth_type PASS
     
  20.                 auth_pass 123
     
  21.         }
     
  22.         virtual_ipaddress {
     
  23.                 192.168.1.170
     
  24.         }
     
  25. }
复制代码


3、        keepalived的启动:
在server6、server7上执行如下命令启动:
  1. /etc/rc.d/init.d/keepalived start
复制代码

看看server6上是否绑定了虚拟IP192.168.1.170
  1. [root@server6 ~]# ip add | grep 192.168.1.170
     
  2. inet 192.168.1.170/32 scope global eth0
复制代码

可以看到已经成功绑定了192.168.1.170。
4、        测试
停掉server6,看看虚拟IP192.168.1.170会不会自动切换到server7上。以及测试mysql -uroot -ppassword -h192.168.1.170登录,看看能否实现读写操作是否正常等等!

备注:最后记得将所有的启动命令都写到/etc/rc.local文件中去,实现开机启动!