`
yanwt
  • 浏览: 99669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)mysql-mmm+amoeba+keepalived实现mysql高可用和读写分离

 
阅读更多

 

本帖最后由 飞鸿无痕 于 2010-11-11 23:04 编辑

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

  12. <host db1>
  13. ip 192.168.1.161 #db1的ip
  14. mode master
  15. peer db2
  16. </host>

  17. <host db2>
  18. ip 192.168.1.162 #db2的ip
  19. mode master
  20. peer db1
  21. </host>

  22. <host db3>
  23. ip 192.168.1.164 #从db3的ip
  24. mode slave
  25. </host>

  26. <host db4>
  27. ip 192.168.1.165 #从db4的ip
  28. mode slave
  29. </host>


  30. <role writer>
  31. hosts db1, db2
  32. ips 192.168.1.113 #设置写如的虚拟IP
  33. mode exclusive
  34. </role>

  35. <role reader>
  36. hosts db1, db2, db3, db4
  37. ips 192.168.1.111, 192.168.1.112, 192.168.1.114, 192.168.1.115 #设置读取的虚拟IP
  38. mode balanced
  39. </role>
复制代码


数据库主机上我们需要编辑/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. <monitor>
  3. ip 127.0.0.1
  4. pid_path /var/run/mysql-mmm/mmm_mond.pid
  5. bin_path /usr/libexec/mysql-mmm
  6. status_path /var/lib/mysql-mmm/mmm_mond.status
  7. ping_ips 192.168.1.161,192.168.1.162, 192.168.1.164,192.168.1.165 #监控服务器ip
  8. auto_set_online 60

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

  16. <host default>
  17. monitor_user mmm_monitor #mmm_monitor用户名
  18. monitor_password monitor_password #mmm_monitor密码
  19. </host>

  20. 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 [<host>|all [<check>|all]] - show checks status
  10. #显示检查状态,包括(ping、mysql、rep_threads、rep_backlog)
  11. set_online <host> - set host <host> online
  12. #设置某host为online状态
  13. set_offline <host> - set host <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] <role> <host> - move exclusive role <role> to host <host>
  25. #更改host的模式,比如更改处于slave的mysql数据库角色为write
  26. (Only use --force if you know what you are doing!)
  27. set_ip <ip> <host> - set role with ip <ip> to host <host>
  28. #为host设置ip,只有passive模式的时候才允许更改!

 


 

三、 利用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. <?xml version="1.0" encoding="gbk"?>

  2. <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
  3. <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

  4. <server>
  5. <!-- proxy server绑定的端口 -->
  6. <property name="port">3306</property>

  7. <!-- proxy server绑定的IP要设置成0.0.0.0,因为后面还要监听VIP -->
  8. <property name="ipAddress">0.0.0.0</property>
  9. <!-- proxy server net IO Read thread size -->
  10. <property name="readThreadPoolSize">20</property>

  11. <!-- proxy server client process thread size -->
  12. <property name="clientSideThreadPoolSize">30</property>

  13. <!-- mysql server data packet process thread size -->
  14. <property name="serverSideThreadPoolSize">30</property>

  15. <!-- socket Send and receive BufferSize(unit:K) -->
  16. <property name="netBufferSize">128</property>

  17. <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
  18. <property name="tcpNoDelay">true</property>

  19. <property name="user">root</property>
  20. <property name="password">password</property>

  21. <!-- query timeout( default: 60 second , TimeUnit:second) -->
  22. <property name="queryTimeout">60</property>
  23. </server>

  24. <!--
  25. 每个ConnectionManager都将作为一个线程启动。
  26. manager负责Connection IO读写/死亡检测
  27. -->
  28. <connectionManagerList>
  29. <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
  30. <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>

  31. <!--
  32. default value is avaliable Processors
  33. <property name="processors">5</property>
  34. -->
  35. </connectionManager>
  36. </connectionManagerList>

  37. <dbServerList>
  38. <!--
  39. 一台mysqlServer 需要配置一个pool,
  40. 如果多台 平等的mysql需要进行loadBalance,
  41. 平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
  42. 简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
  43. 或者自己写一个ObjectPool。
  44. -->
  45. <dbServer name="server1">

  46. <!-- PoolableObjectFactory实现类 -->
  47. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  48. <property name="manager">defaultManager</property>

  49. <!-- 真实mysql数据库端口 -->
  50. <property name="port">3306</property>

  51. <!-- 真实mysql数据库IP -->
  52. <property name="ipAddress">192.168.1.113</property>
  53. <property name="schema">test</property>

  54. <!-- 用于登陆mysql的用户名 -->
  55. <property name="user">zhang</property>

  56. <!-- 用于登陆mysql的密码 -->
  57. <property name="password">zhang123</property>

  58. </factoryConfig>

  59. <!-- ObjectPool实现类 -->
  60. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  61. <property name="maxActive">200</property>
  62. <property name="maxIdle">200</property>
  63. <property name="minIdle">10</property>
  64. <property name="minEvictableIdleTimeMillis">600000</property>
  65. <property name="timeBetweenEvictionRunsMillis">600000</property>
  66. <property name="testOnBorrow">true</property>
  67. <property name="testWhileIdle">true</property>
  68. </poolConfig>
  69. </dbServer>


  70. <dbServer name="server2">

  71. <!-- PoolableObjectFactory实现类 -->
  72. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  73. <property name="manager">defaultManager</property>

  74. <!-- 真实mysql数据库端口 -->
  75. <property name="port">3306</property>

  76. <!-- 真实mysql数据库IP -->
  77. <property name="ipAddress">192.168.1.111</property>
  78. <property name="schema">test</property>

  79. <!-- 用于登陆mysql的用户名 -->
  80. <property name="user">zhang</property>

  81. <!-- 用于登陆mysql的密码 -->
  82. <property name="password">zhang123</property>

  83. </factoryConfig>

  84. <!-- ObjectPool实现类 -->
  85. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  86. <property name="maxActive">200</property>
  87. <property name="maxIdle">200</property>
  88. <property name="minIdle">10</property>
  89. <property name="minEvictableIdleTimeMillis">600000</property>
  90. <property name="timeBetweenEvictionRunsMillis">600000</property>
  91. <property name="testOnBorrow">true</property>
  92. <property name="testWhileIdle">true</property>
  93. </poolConfig>
  94. </dbServer>


  95. <dbServer name="server3">

  96. <!-- PoolableObjectFactory实现类 -->
  97. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  98. <property name="manager">defaultManager</property>

  99. <!-- 真实mysql数据库端口 -->
  100. <property name="port">3306</property>

  101. <!-- 真实mysql数据库IP -->
  102. <property name="ipAddress">192.168.1.112</property>
  103. <property name="schema">test</property>

  104. <!-- 用于登陆mysql的用户名 -->
  105. <property name="user">zhang</property>

  106. <!-- 用于登陆mysql的密码 -->
  107. <property name="password">zhang123</property>

  108. </factoryConfig>

  109. <!-- ObjectPool实现类 -->
  110. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  111. <property name="maxActive">200</property>
  112. <property name="maxIdle">200</property>
  113. <property name="minIdle">10</property>
  114. <property name="minEvictableIdleTimeMillis">600000</property>
  115. <property name="timeBetweenEvictionRunsMillis">600000</property>
  116. <property name="testOnBorrow">true</property>
  117. <property name="testWhileIdle">true</property>
  118. </poolConfig>
  119. </dbServer>


  120. <dbServer name="server4">

  121. <!-- PoolableObjectFactory实现类 -->
  122. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  123. <property name="manager">defaultManager</property>

  124. <!-- 真实mysql数据库端口 -->
  125. <property name="port">3306</property>

  126. <!-- 真实mysql数据库IP -->
  127. <property name="ipAddress">192.168.1.114</property>
  128. <property name="schema">test</property>

  129. <!-- 用于登陆mysql的用户名 -->
  130. <property name="user">zhang</property>

  131. <!-- 用于登陆mysql的密码 -->
  132. <property name="password">zhang123</property>

  133. </factoryConfig>

  134. <!-- ObjectPool实现类 -->
  135. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  136. <property name="maxActive">200</property>
  137. <property name="maxIdle">200</property>
  138. <property name="minIdle">10</property>
  139. <property name="minEvictableIdleTimeMillis">600000</property>
  140. <property name="timeBetweenEvictionRunsMillis">600000</property>
  141. <property name="testOnBorrow">true</property>
  142. <property name="testWhileIdle">true</property>
  143. </poolConfig>
  144. </dbServer>


  145. <dbServer name="server5">

  146. <!-- PoolableObjectFactory实现类 -->
  147. <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
  148. <property name="manager">defaultManager</property>

  149. <!-- 真实mysql数据库端口 -->
  150. <property name="port">3306</property>

  151. <!-- 真实mysql数据库IP -->
  152. <property name="ipAddress">192.168.1.115</property>
  153. <property name="schema">test</property>

  154. <!-- 用于登陆mysql的用户名 -->
  155. <property name="user">zhang</property>

  156. <!-- 用于登陆mysql的密码 -->
  157. <property name="password">zhang123</property>

  158. </factoryConfig>

  159. <!-- ObjectPool实现类 -->
  160. <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
  161. <property name="maxActive">200</property>
  162. <property name="maxIdle">200</property>
  163. <property name="minIdle">10</property>
  164. <property name="minEvictableIdleTimeMillis">600000</property>
  165. <property name="timeBetweenEvictionRunsMillis">600000</property>
  166. <property name="testOnBorrow">true</property>
  167. <property name="testWhileIdle">true</property>
  168. </poolConfig>
  169. </dbServer>




  170. <dbServer name="master" virtual="true">
  171. <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
  172. <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
  173. <property name="loadbalance">1</property>

  174. <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
  175. <property name="poolNames">server1</property>
  176. </poolConfig>
  177. </dbServer>

  178. <dbServer name="slave" virtual="true">
  179. <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
  180. <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
  181. <property name="loadbalance">1</property>

  182. <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
  183. <property name="poolNames">server2,server3,server4,server5</property>
  184. </poolConfig>
  185. </dbServer>

  186. </dbServerList>

  187. <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
  188. <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
  189. <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
  190. <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
  191. <property name="LRUMapSize">1500</property>
  192. <property name="defaultPool">master</property>
  193. <property name="writePool">master</property>
  194. <property name="readPool">slave</property>
  195. <property name="needParse">true</property>
  196. </queryRouter>
  197. </amoeba:configuration>
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]jimo291@gmail.com[/email]
  4. }
  5. notification_email_from [email]jimo291@gmail.com[/email]
  6. smtp_server 127.0.0.1
  7. smtp_connect_timeout 30
  8. router_id test1
  9. }


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

  21. virtual_ipaddress {
  22. 192.168.1.170
  23. }
  24. }
配置server6的keepalived配置文件/etc/keepalived/keepalived.conf,内容如下:

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

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

 

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文件中去,实现开机启动!
分享到:
评论

相关推荐

    Amoeba+mysql 读写分离 Keepalived+mysql

    在构建高可用和高性能的数据库系统中,读写分离和负载均衡是常用的技术手段。这里我们主要探讨的是如何使用Amoeba与MySQL实现读写分离,以及如何利用Keepalived来构建MySQL的高可用集群。这两部分内容对于保障数据库...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    第十一部 MySQL读写分离开发实现及软件实现-物理备份-高可用(已经包含有5节视频+文档资料) 01-amoeba读写分离实现技术分享.avi 02-mysql-proxy读写分离实现技术分享.avi 03-PHP程序实现读写分离技术分享.avi 04-...

    基于Django花卉商城系统的设计与实现-2885fb37-.zip

    基于Django花卉商城系统的设计与实现_2885fb37--.zip

    102页-智慧农业解决方案.pdf

    智慧农业,作为现代农业的新篇章,正引领着农业生产的革命性变革。本解决方案以物联网、云计算、大数据等先进技术为核心,为农业生产打造了一套全面、智能的管理系统。 想象一下,从温室大棚到广袤田野,智能传感器遍布每个角落,它们能实时感知空气温湿度、土壤水分、光照强度等环境参数,仿佛为农作物装上了“眼睛”和“耳朵”。这些数据通过物联网技术传输到云端,经过大数据分析,为农民提供精准的种植建议,如何时灌溉、施肥、防虫,让农业生产变得更加科学、高效。 更有趣的是,通过智慧农业平台,农民可以远程监控作物生长情况,甚至用手机就能控制温室大棚的遮阳板、通风设备等,实现“指尖上的农业”。此外,方案还包含了农产品可追溯系统,从田间到餐桌,每一步都可追溯,让消费者吃得放心。而智慧农业电商平台,则让农产品销售更加便捷,农民直接对接市场,收益倍增。 总之,这套智慧农业解决方案不仅让农业生产变得更加智能、高效,还提升了农产品的质量和安全,为农民带来了实实在在的收益,开启了农业现代化的新篇章。 对于想要投身智慧农业领域的你来说,这不仅仅是一套解决方案,更是一把开启现代农业大门的钥匙,引领你走向更加辉煌的未来。

    【人工智能模型部署】DeepSeek本地部署与WebUI可视化:环境搭建、模型启动及界面开发指南文档的主要内容

    内容概要:本文档详细介绍了DeepSeek本地部署与WebUI可视化的一般步骤。本地部署方面,涵盖了环境准备(硬件要求如多核CPU、8GB以上内存或带适当显存的NVIDIA GPU,软件环境涵盖操作系统如Ubuntu 20.04及以上版本、Python环境及依赖库如PyTorch或TensorFlow)、获取DeepSeek模型代码和权重(通过官方仓库克隆代码,从指定渠道下载权重)、模型配置与启动(配置模型参数,运行启动脚本以初始化模型和服务)。WebUI可视化部分则推荐了Streamlit和Gradio两种框架,介绍了它们的安装、使用方法(通过编写脚本调用DeepSeek API构建交互界面),以及集成与部署(确保WebUI与模型服务之间的数据正确传递,在本地运行后可通过浏览器访问)。 适合人群:对深度学习模型部署有一定了解的技术人员,尤其是那些希望将DeepSeek模型应用于本地环境并提供用户友好界面的研发人员。 使用场景及目标:①为希望在本地环境中运行DeepSeek模型的研究者或开发者提供详细的部署指南;②帮助用户快速搭建一个带有图形化操作界面的DeepSeek应用,降低使用门槛,提高用户体验。 阅读建议:在阅读时,应根据自己的操作系统环境和硬件条件调整相应的配置要求,同时注意按照官方文档的具体指引操作,确保各组件版本兼容,以便顺利完成部署和可视化工作。

    MISRA C 2014和MISRA CPP 2008版本

    MISRA C 2014和MISRA CPP 2008版本

    Revit2024二次开发之安装Addin

    Revit2024二次开发之安装Addin

    ai应用文生视频大模型及AI人应用方案设计.docx### 文生视频大模型及AI人应用方案总结

    内容概要:本文详细介绍了文生视频大模型及AI人应用方案的设计与实现。文章首先阐述了文生视频大模型的技术基础,包括深度生成模型、自然语言处理(NLP)和计算机视觉(CV)的深度融合,以及相关技术的发展趋势。接着,文章深入分析了需求,包括用户需求、市场现状和技术需求,明确了高效性、个性化和成本控制等关键点。系统架构设计部分涵盖了数据层、模型层、服务层和应用层的分层架构,确保系统的可扩展性和高效性。在关键技术实现方面,文章详细描述了文本解析与理解、视频生成技术、AI人交互技术和实时处理与反馈机制。此外,还探讨了数据管理与安全、系统测试与验证、部署与维护等重要环节。最后,文章展示了文生视频大模型在教育、娱乐和商业领域的应用场景,并对其未来的技术改进方向和市场前景进行了展望。 适用人群:具备一定技术背景的研发人员、产品经理、数据科学家以及对AI视频生成技术感兴趣的从业者。 使用场景及目标:①帮助研发人员理解文生视频大模型的技术实现和应用场景;②指导产品经理在实际项目中应用文生视频大模型;③为数据科学家提供技术优化和模型改进的思路;④让从业者了解AI视频生成技术的市场潜力和发展趋势。 阅读建议:本文内容详尽,涉及多个技术细节和应用场景,建议读者结合自身的专业背景和技术需求,重点阅读与自己工作相关的章节,并结合实际项目进行实践和验证。

    黑板风格毕业答辩模板25个

    黑板风格毕业答辩模板是一系列富有创意和趣味性的答辩文档模板,专为追求独特表达的大学生设计。这25个模板模拟了传统黑板的效果,结合了手绘风格与现代设计理念,使得内容呈现既生动又具学术感。每个模板都强调清晰的结构和易于理解的布局,适用于各类学科和研究领域,帮助学生有效地展示研究成果和核心观点。 黑板风格不仅带来亲切感,还能唤起人们对课堂学习的回忆,为答辩增添了轻松而专业的氛围。这些模板配备了丰富的图标、示意图和配色,既美观又实用,能够帮助学生在答辩中更好地吸引评审的注意力,增强信息的传达效果。无论是科技、艺术还是人文社科,黑板风格毕业答辩模板都能够为你的演示增添一份独特的魅力,提升你的表现,助力你在毕业答辩中取得成功。

    delphi-ACCESS宠物医院

    delphi_ACCESS宠物医院

    社会心理学:MATLAB复杂系统仿真在群体行为预测中的跨学科研究.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    DDS Accepted Assessment Instruments DDS 认可的评估工具.doc

    DDS Accepted Assessment Instruments DDS 认可的评估工具.doc

    Windows下MySQL安装与配置教程.markdown

    mysql安装配置教程 本教程将指导您在Windows操作系统上安装和配置MySQL数据库,适用于MySQL 8.0及以上版本。本教程以清晰的步骤说明,确保初学者也能顺利完成安装和基本配置。

    体育科学突破:MATLAB生物力学仿真优化短跑运动员起跑姿态.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    ### 智慧教育应用发展研究报告(2025年)总结

    内容概要:《智慧教育应用发展研究报告(2025年)》由中国信息通信研究院发布,全面梳理了全球及我国智慧教育的发展现状和趋势。报告指出,智慧教育通过多种数字技术促进教育模式、管理模式和资源生成等方面的变革。国外经济体如欧盟、美国、韩国和日本纷纷通过顶层设计推动智慧教育发展,而我国则通过政策支持、基础设施建设、技术融合等多方面努力,推动智慧教育进入“快车道”。智慧教育应用场景分为智慧校园和校外教育两类,涵盖教学、考试、评价、管理和服务等多个方面。报告还详细分析了支撑智慧教育发展的技术、产业、基础设施和安全能力的发展趋势,并指出了当前面临的挑战及建议。 适用人群:教育领域的政策制定者、教育管理者、教育技术从业者、研究人员和关心教育发展的社会各界人士。 使用场景及目标:①了解全球及我国智慧教育的最新进展和趋势;②为政策制定者提供决策参考;③为教育管理者和技术从业者提供实施智慧教育的具体指导;④促进教育技术的研发和应用。 其他说明:报告强调了智慧教育在促进教育公平、提升教育质量、推动教育模式创新等方面的重要性,并呼吁加强跨领域协同攻关、缩小教育数字化差距、强化网络信息安全和提升教师数字素养,以应对当前面临的挑战。

    AC6003V200R008C10SPC300.cc华为AC6003-8固件系统下载

    华为AC6003-8固件系统 网上确实 不好找啊

    教育领域基于Word模板的实习证明文档设计:学生实习信息规范化记录与管理

    内容概要:这是一份实习证明模板,用于证明学生在指定单位完成实习经历。主要内容包括学生的学校、年级、专业以及姓名,明确标注了实习开始日期、实习单位名称、具体岗位、薪资待遇、单位地址及联系方式等信息,还列出了实习期间的指导教师及其联系方式。文件最后设有单位公章、单位负责人签字及联系电话的位置,并标明开具证明的日期。; 适合人群:即将或正在实习的大学生、大专生以及其他需要开具实习证明的学生群体。; 使用场景及目标:①为学生提供规范的实习证明文件,方便学校、企业或其他相关机构核实实习情况;②作为实习经历的正式书面记录,可用于求职、升学等场合。; 其他说明:此模板可根据不同学校和单位的具体要求进行适当调整,确保信息完整性和准确性。在填写时应注意核实各项信息的真实性,确保与实际情况相符。

    IMG_20250416_154832.jpg

    IMG_20250416_154832.jpg

    红色警戒95版(RA95)

    游戏亲测无毒可用,可在Win10、Win11等系统直接运行(执行ra95.exe,无需虚拟机) #初代经典红警,#红警95,#RTS,#电脑游戏,#怀旧游戏

    【路径规划】基于matlab改进的RRT算法移动机器人路径规划【含Matlab源码 13175期】.zip

    Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

Global site tag (gtag.js) - Google Analytics