mysql Amoeba 读写分离

Posted on Posted in mysql
Tips: 本文创建于2016年3月29日,已超过 2 年,内容或图片可能已经失效!

基于 [MMM][1] 配置

[amoeba 官网][2]

下载amoeba-mysql-3.0.5-RC-distribution.zip,解压直接用

> amoeba 目录结构

  1. ├── benchmark  
  2. │   ├── context.xml  
  3. │   ├── objectMap.dtd  
  4. │   └── query.xml  
  5. ├── bin  
  6. │   ├── benchmark  
  7. │   ├── benchmark.bat  
  8. │   ├── benchmark.classpath  
  9. │   ├── launcher  
  10. │   ├── launcher.bat  
  11. │   ├── launcher.classpath  
  12. │   ├── mkdirhier  
  13. │   └── shutdown  
  14. ├── conf  
  15. │   ├── access_list.conf  #配置 IP 访问控制  
  16. │   ├── amoeba.dtd  
  17. │   ├── amoeba.xml      #读写分离功能,两个文件相关  
  18. │   ├── dbServers.xml   #读写分离功能  
  19. │   ├── dbserver.dtd  
  20. │   ├── function.dtd  
  21. │   ├── functionMap.xml  
  22. │   ├── log4j.dtd  
  23. │   ├── log4j.xml  
  24. │   ├── rule.dtd  
  25. │   ├── rule.xml  
  26. │   └── ruleFunctionMap.xml  
  27. ├── jvm.properties  
  28. └── lib  
  29.     ├── amoeba-core-3.0.5-RC.jar  
  30.     ├── amoeba-mysql-3.0.5-RC.jar  
  31.     ├── aopalliance-1.0.jar  
  32.     ├── commons-beanutils-1.8.0.jar  
  33.     ├── commons-cli-1.2.jar  
  34.     ├── commons-collections-3.2.1.jar  
  35.     ├── commons-digester-1.8.jar  
  36.     ├── commons-lang-2.4.jar  
  37.     ├── commons-logging-1.1.1.jar  
  38.     ├── commons-pool-1.6.jar  
  39.     ├── dom4j-1.6.1.jar  
  40.     ├── javassist-3.11.0.GA.jar  
  41.     ├── log4j-1.2.12.jar  
  42.     ├── ognl-3.0.1.jar  
  43.     ├── oro-2.0.8.jar  
  44.     ├── plexus-classworlds-2.4.2-HEXNOVA.jar  
  45.     ├── slf4j-api-1.6.1.jar  
  46.     ├── slf4j-log4j12-1.6.2.jar  
  47.     ├── spring-aop-3.0.6.RELEASE.jar  
  48.     ├── spring-asm-3.0.6.RELEASE.jar  
  49.     ├── spring-beans-3.0.6.RELEASE.jar  
  50.     ├── spring-context-3.0.6.RELEASE.jar  
  51.     ├── spring-core-3.0.6.RELEASE.jar  
  52.     ├── spring-expression-3.0.6.RELEASE.jar  
  53.     ├── toolkit-common-bean-1.3.0.jar  
  54.     ├── toolkit-common-pool-1.2.0.jar  
  55.     ├── toolkit-common-runtime-1.3.0.jar  
  56.     ├── toolkit-common-util-1.2.0.jar  
  57.     ├── toolkit-net-benchmark-1.2.0.jar  
  58.     ├── toolkit-net-io-2.2.0.jar  
  59.     └── xml-apis-1.0.b2.jar  

> vim dbServers.xml

  1. <?xml version="1.0" encoding="gbk"?>  
  2.   
  3. <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">  
  4. <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">  
  5.   
  6.         <!--  
  7.             Each dbServer needs to be configured into a Pool,  
  8.             If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:  
  9.              add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig  
  10.              such as 'multiPool' dbServer  
  11.         -->  
  12.   
  13.     <dbServer name="abstractServer" abstractive="true">  
  14.         <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">  
  15.             <property name="connectionManager">${defaultManager}</property>  
  16.             <property name="sendBufferSize">64</property>  
  17.             <property name="receiveBufferSize">128</property>  
  18.       #下面这个配置是设置 Amoeba 要连接的 mysql 数据库的端口,默认是3306  
  19.             <!-- mysql port -->  
  20.             <property name="port">3306</property>  
  21.       #下面这个配置是设置 Amoebe 默认连接的数据库名,当连接业务系统连接 amoeba 时,操作表必须显示指定数据库名,即采用 dbname.tablename 的方式,不支持"use dbname"指定默认库  
  22.             <!-- mysql schema -->  
  23.             <property name="schema">test</property>  
  24.             #下面这两个配置 Amoeba 连接后端数据库服务器的账号和密码,因此需要在所有后端数据库器上创建该用户,并授权 Amoeba 服务器可连接  
  25.             <!-- mysql user -->  
  26.             <property name="user">test111</property>  
  27.   
  28.             <property name="password">111111</property>  
  29.         </factoryConfig>  
  30.   
  31.         <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">  
  32.             <property name="maxActive">500</property>   #配置最大连接数,默认是500  
  33.             <property name="maxIdle">500</property>     #配置最大空闲连接数  
  34.             <property name="minIdle">1</property>       #配置最小空闲连接数  
  35.             <property name="minEvictableIdleTimeMillis">600000</property>  
  36.             <property name="timeBetweenEvictionRunsMillis">600000</property>  
  37.             <property name="testOnBorrow">true</property>  
  38.             <property name="testOnReturn">true</property>  
  39.             <property name="testWhileIdle">true</property>  
  40.         </poolConfig>  
  41.     </dbServer>  
  42.   
  43.     #下面这个配置用来设置一个后端可写 dbServer,这里定影为 writedb,这个名字可以任意命名,后面还会用到  
  44.   
  45.     <dbServer name="writedb"  parent="abstractServer">  
  46.         <factoryConfig>  
  47.             <!-- mysql ip -->  
  48.             #下面这个配置是指定可写数据库的 IP 地址,也就是 MMM 集群提供对外访问的可写 VIP 地址  
  49.             <property name="ipAddress">192.168.88.30</property>  
  50.         </factoryConfig>  
  51.     </dbServer>  
  52.   
  53.     #下面这段配置用来设置一个后端可读 dbServer,这里定义了4台可读 dbServer,分别是 slave1/slave2/slave3/slave4,这个名字也可以任意命名,每个 dbServer 对应的 IP 地址就是 MMM 集群提供对外访问的可读 VIP 地址  
  54.   
  55.     <dbServer name="slave1"  parent="abstractServer">  
  56.         <factoryConfig>  
  57.             <!-- mysql ip -->  
  58.             <property name="ipAddress">192.168.88.31</property>  
  59.         </factoryConfig>  
  60.     </dbServer>  
  61.     <dbServer name="slave2"  parent="abstractServer">  
  62.         <factoryConfig>  
  63.             <!-- mysql ip -->  
  64.             <property name="ipAddress">192.168.88.32</property>  
  65.         </factoryConfig>  
  66.     </dbServer>  
  67.     <dbServer name="slave3"  parent="abstractServer">  
  68.         <factoryConfig>  
  69.             <!-- mysql ip -->  
  70.             <property name="ipAddress">192.168.88.33</property>  
  71.         </factoryConfig>  
  72.     </dbServer>  
  73.     <dbServer name="slave4"  parent="abstractServer">  
  74.         <factoryConfig>  
  75.             <!-- mysql ip -->  
  76.             <property name="ipAddress">192.168.88.34</property>  
  77.         </factoryConfig>  
  78.     </dbServer>  
  79.   
  80.     #下面的配置是定义一个虚拟的 dbServer,实际上相当于一个 dbServer 组,这里将可读的数据库 IP 统一放到一个组里,将这个组的名字命名为 myslaves  
  81.   
  82.     <dbServer name="myslaves" virtual="true">  
  83.         <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">  
  84.             <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->  
  85.             #下面的配置是选择调度算法 1 表示复制均衡,2 表示权重,3 表示 HA,这里选择1,实现读操作的负载均衡  
  86.             <property name="loadbalance">1</property>  
  87.             #下面的配置是设置 dbServer 组中的成员,这里将所有可读的 dbServer 全部加进来  
  88.             <!-- Separated by commas,such as: server1,server2,server1 -->  
  89.             <property name="poolNames">server1,server2,server3,server4</property>  
  90.         </poolConfig>  
  91.     </dbServer>  
  92.   
  93. </amoeba:dbServers>  

> vim amoeba.xml

  1. <?xml version="1.0" encoding="gbk"?>  
  2.   
  3. <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">  
  4. <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">  
  5.   
  6.     <proxy>  
  7.       
  8.         <!-- service class must implements com.meidusa.amoeba.service.Service -->  
  9.         <service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">  
  10.             <!-- port -->  
  11.             #下面的配置是设置 Amoeba 监听的端口,默认是8066,可根据情况进行修改  
  12.             <property name="port">8066</property>  
  13.               
  14.             <!-- bind ipAddress -->  
  15.             #下面的配置是设置监听的接口,如果不设置,默认监听所有的 IP  
  16.             <!--   
  17.             <property name="ipAddress">127.0.0.1</property>  
  18.              -->  
  19.               
  20.             <property name="connectionFactory">  
  21.                 <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">  
  22.                     <property name="sendBufferSize">128</property>  
  23.                     <property name="receiveBufferSize">64</property>  
  24.                 </bean>  
  25.             </property>  
  26.               
  27.             <property name="authenticateProvider">  
  28.                 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">  
  29.                 #下面这两个配置主要是设置客户端连接 Amoeba 时需要使用的账号和密码,需要说明的是,如果部署了 Amoeba,那么业务系统中程序连接数据库的地址就是 #Amoeba 服务器的地址,连接用户名和密码就是这里设置的账户和密码  
  30.                     <property name="user">root</property>  
  31.                       
  32.                     <property name="password">xxxxxxxxxxx</property>  
  33.                       
  34.                     <property name="filter">  
  35.                         <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">  
  36.                             <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>  
  37.                         </bean>  
  38.                     </property>  
  39.                 </bean>  
  40.             </property>  
  41.               
  42.         </service>  
  43. &n
    bsp;         
  44.         <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">  
  45.               
  46.             <!-- proxy server client process thread size -->  
  47.             <property name="executeThreadSize">128</property>  
  48.               
  49.             <!-- per connection cache prepared statement size  -->  
  50.             <property name="statementCacheSize">500</property>  
  51.               
  52.             <!-- default charset -->  
  53.             <property name="serverCharset">utf8</property>  
  54.               
  55.             <!-- query timeout( default: 60 second , TimeUnit:second) -->  
  56.             <property name="queryTimeout">60</property>  
  57.         </runtime>  
  58.           
  59.     </proxy>  
  60.       
  61.     <!--   
  62.         Each ConnectionManager will start as thread  
  63.         manager responsible for the Connection IO read , Death Detection  
  64.     -->  
  65.     <connectionManagerList>  
  66.         <connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">  
  67.             <property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>  
  68.         </connectionManager>  
  69.     </connectionManagerList>  
  70.       
  71.         <!-- default using file loader -->  
  72.     <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">  
  73.         <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>  
  74.     </dbServerLoader>  
  75.       
  76.     <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">  
  77.         <property name="ruleLoader">  
  78.             <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">  
  79.                 <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>  
  80.                 <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>  
  81.             </bean>  
  82.         </property>  
  83.         <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>  
  84.         <property name="LRUMapSize">1500</property>  
  85.         #下面这个选项设置 Amoeba 默认的池,这里设置为 writedb  
  86.         <property name="defaultPool">writedb</property>  
  87.           
  88.         #下面这两个选项默认是注释掉的,需要取消注释,这里用来指定前面定义好的两个读写池,分别是可写池 writedb 和可读池 slaves  
  89.         <property name="writePool">writedb</property>  
  90.         <property name="readPool">myslaves</property>  
  91.       &
    nbsp;   
  92.         <property name="needParse">true</property>  
  93.     </queryRouter>  
  94. </amoeba:configuration>  

> 设置 Amoeba 登录数据库权限,这里假设192.168.88.35
> 在 MMM 集群的所有 MYSQL 节点上执行如下操作

  1. grant all on repldb.* to 'ixdba'@'192.168.88.35' identified by 'xxxxxxxxxx';  
  2. flush privileges;  

> 启动 Amoeba

  1. /usr/local/amoeba/bin/launcher  
  2. netstat -tulnp | grep java  #查看端口,8066  

> 测试 amoeba 实现读写分离和负载均衡

在所有的 mysql 节点开启 mysql 查询日志

  1. log = /var/log/mysql_query_log  #此文件要事先存在,并且对 mysql 用户可写  

对数据库操作,查看 log

[1]: https://liuhonghe.me/mysql-mmm.html
[2]: http://sourceforge.net/projects/amoeba/

» 转载请注明来源:呢喃 » mysql Amoeba 读写分离