首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别:

 

在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件, lua脚本就是它的全部,当然lua是相当方便的。那么同样这种东西需要编写大量的脚本才能完成一 个复杂的配置。而Amoeba只需要进行相关的配置就可以满足需求。



 

假设有这样的使用场景,有三个数据库节点分别命名为Master、Slave1、Slave2如下:

 

Amoeba: Amoeba <192.168.14.129>

Master: Master <192.168.14.131> (可读写)

Slaves:Slave1 <192.168.14.132>、Slave2<192.168.14.133> (2个平等的数据库。只读/负载均衡)

 

在 主从数据库 的复制的部分, 任然需要使用数据库自己的复制机制。 Amoeba 不提供复制功能。

 

1. 起动数据库的主从复制功能。

 

a. 修改配置文件

 

master.cnf

Cnf代码  

  1. server-id = 1 #主数据库标志  

  2.   

  3. # 增加 日志文件, 用于验证读写分离  

  4. log = /home/mysql/mysql/log/mysql.log  

 

slave1.cnf

Cnf代码  

  1. server-id = 2  

  2.   

  3. # 增加 日志文件, 用于验证读写分离  

  4. log = /home/mysql/mysql/log/mysql.log  

 

slave2.cnf

Cnf代码  

  1. server-id = 3  

  2.   

  3. # 增加 日志文件, 用于验证读写分离  

  4. log = /home/mysql/mysql/log/mysql.log  

 

b. Master 中 创建两个 只读权限 的用户。 用户名均为:repl_user   密码均为:copy  分别开放给 slave1, slave2

 

Sql代码  

  1. mysql> grant replication slave on *.* to [email protected] identified by 'copy';  

  2.   

  3. mysql> grant replication slave on *.* to [email protected] identified by 'copy';  

 

c. 查看 Master 信息

Sql代码  

  1. mysql> show master status;  

  2. +------------------+----------+--------------+------------------+  

  3. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  

  4. +------------------+----------+--------------+------------------+  

  5. | mysql-bin.000017 |     2009 |              |                  |  

  6. +------------------+----------+--------------+------------------+  

  7. 1 row in set (0.00 sec)  

 

 

d. Slave1 ,Slave2 中 启动 Master - Slave 复制功能。

 

分别执行以下命令

 

Sql代码  

  1. mysql> slave stop;  

  2. Query OK, 0 rows affected (0.02 sec)  

  3.   

  4. mysql> change master to  

  5.     -> master_host='192.168.14.131',  

  6.     -> master_user='repl_user',  

  7.     -> master_password='copy',  

  8.     -> master_log_file='mysql-bin.000017',  

  9.     -> master_log_pos=2009;  

  10. Query OK, 0 rows affected (0.03 sec)  

  11.   

  12. mysql> start slave;  

  13. Query OK, 0 rows affected (0.00 sec)  

 

2. Amoeba 读写分离的配置

 

a. Master , Slave1 ,Slave2 中开放权限给 Amoeba 访问。

 

在 Master , Slave1 , Slave2 中分别执行

 

Sql代码  

  1. mysql> grant all on test.* to [email protected] indentified by '1234';  

Amoeba 访问三个数据库的账号密码相同。

 

b. 修改 Amoeba 的配置文件

 

配置文件详细说明请查看 官方文档:http://docs.hexnova.com/amoeba/rw-splitting.html

 

dbServer.xml

Xml代码  

  1. xml version="1.0" encoding="gbk"?>  

  2.   

  3. >  

  4. <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">  

  5.   

  6.            

  7.     <dbServer name="abstractServer" abstractive="true">  

  8.         <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">  

  9.             <property name="manager">${defaultManager}property>  

  10.             <property name="sendBufferSize">64property>  

  11.             <property name="receiveBufferSize">128property>  

  12.                   

  13.               

  14.             <property name="port">3306property>  

  15.               

  16.               

  17.             <property name="schema">testproperty>  

  18.               

  19.               

  20.             <property name="user">test_userproperty>  

  21.               

  22.               

  23.             <property name="password">1234property>  

  24.               

  25.         factoryConfig>  

  26.   

  27.         <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">  

  28.             <property name="maxActive">500property>  

  29.             <property name="maxIdle">500property>  

  30.             <property name="minIdle">10property>  

  31.             <property name="minEvictableIdleTimeMillis">600000property>  

  32.             <property name="timeBetweenEvictionRunsMillis">600000property>  

  33.             <property name="testOnBorrow">trueproperty>  

  34.             <property name="testWhileIdle">trueproperty>  

  35.         poolConfig>  

  36.     dbServer>  

  37.   

  38.       

  39.     <dbServer name="master"  parent="abstractServer">  

  40.         <factoryConfig>  

  41.               

  42.             <property name="ipAddress">192.168.14.131property>  

  43.         factoryConfig>  

  44.     dbServer>  

  45.   

  46.     <dbServer name="slave1"  parent="abstractServer">  

  47.         <factoryConfig>  

  48.               

  49.             <property name="ipAddress">192.168.14.132property>  

  50.         factoryConfig>  

  51.     dbServer>  

  52.   

  53.     <dbServer name="slave2"  parent="abstractServer">  

  54.         <factoryConfig>  

  55.               

  56.             <property name="ipAddress">192.168.14.133property>  

  57.         factoryConfig>  

  58.     dbServer>     

  59.       

  60.       

  61.     <dbServer name="slaves" virtual="true">  

  62.         <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">  

  63.               

  64.             <property name="loadbalance">1property>  

  65.               

  66.               

  67.             <property name="poolNames">slave1,slave2property>  

  68.         poolConfig>  

  69.     dbServer>  

  70.           

  71. amoeba:dbServers>  

 

amoeba.xml

Xml代码  

  1. xml version="1.0" encoding="gbk"?>  

  2.   

  3. >  

  4. <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">  

  5.   

  6.     <proxy>  

  7.       

  8.           

  9.         <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">  

  10.               

  11.             <property name="port">8066property>  

  12.               

  13.               

  14.               

  15.               

  16.             <property name="manager">${clientConnectioneManager}property>  

  17.               

  18.             <property name="connectionFactory">  

  19.                 <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">  

  20.                     <property name="sendBufferSize">128property>  

  21.                     <property name="receiveBufferSize">64property>  

  22.                 bean>  

  23.             property>  

  24.               

  25.             <property name="authenticator">  

  26.                 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">  

  27.                       

  28.                     <property name="user">rootproperty>  

  29.                       

  30.                     <property name="password">rootproperty>  

  31.                       

  32.                     <property name="filter">  

  33.                         <bean class="com.meidusa.amoeba.server.IPAccessController">  

  34.                             <property name="ipFile">${amoeba.home}/conf/access_list.confproperty>  

  35.                         bean>  

  36.                     property>  

  37.                 bean>  

  38.             property>  

  39.               

  40.         service>  

  41.           

  42.           

  43.         <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">  

  44.               

  45.               

  46.             <property name="ipAddress">127.0.0.1property>  

  47.             <property name="daemon">trueproperty>  

  48.             <property name="manager">${clientConnectioneManager}property>  

  49.             <property name="connectionFactory">  

  50.                 <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory">bean>  

  51.             property>  

  52.               

  53.         service>  

  54.           

  55.         <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">  

  56.               

  57.             <property name="readThreadPoolSize">20property>  

  58.               

  59.               

  60.             <property name="clientSideThreadPoolSize">30property>  

  61.               

  62.               

  63.             <property name="serverSideThreadPoolSize">30property>  

  64.               

  65.               

  66.             <property name="statementCacheSize">500property>  

  67.               

  68.               

  69.             <property name="queryTimeout">60property>  

  70.         runtime>  

  71.           

  72.     proxy>  

  73.       

  74.       

  75.     <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">  

  76.         <property name="configFile">${amoeba.home}/conf/dbServers.xmlproperty>  

  77.     dbServerLoader>  

  78.       

  79.     <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">  

  80.           

  81.         <property name="ruleLoader">  

  82.             <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">  

  83.                 <property name="ruleFile">${amoeba.home}/conf/rule.xmlproperty>  

  84.                 <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xmlproperty>  

  85.             bean>  

  86.         property>  

  87.         <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xmlproperty>  

  88.           

  89.         <property name="LRUMapSize">1500property>  

  90.           

  91.         <property name="defaultPool">masterproperty>  

  92.           

  93.           

  94.         <property name="writePool">masterproperty>  

  95.           

  96.         <property name="readPool">slavesproperty>  

  97.           

  98.         <property name="needParse">trueproperty>  

  99.     queryRouter>  

  100. amoeba:configuration>  

 

rule.xml

Java代码  

  1. "1.0" encoding="gbk"?>  

  2. "rule.dtd">  

  3.   

  4. "http://amoeba.meidusa.com/">  

  5.     "message" schema="test" defaultPools="server1">  

  6.       

  7.   

 

不需要 数据库分片时,不用配置。 但是不能没有 tableRule 元素, 否则报错。 随便写个空规则就行了。

 

3. 测试读写分离

 

a. 在 Master , Slave1 , Slave2  中分别查看 日志文件: mysql.log

Shell代码  

  1. tail -f ./log/mysql.log  

 

 

b. 启动 Amoeba, 使用 Mysql GUI Tools 连接 Amoeba

 


执行以上几个命令。 查看日志内容。

 

Master  mysql.log

Shell代码  

  1. [mysql@prx1 mysql]$ tail -f log/mysql.log  

  2.                   370 Query     SET SESSION sql_mode=''  

  3.                   370 Query     SET NAMES utf8  

  4.                   370 Query     SHOW FULL TABLES  

  5.                   370 Query     SHOW COLUMNS FROM `t_message`  

  6.                   370 Query     SHOW COLUMNS FROM `t_user`  

  7.                   370 Query     SHOW PROCEDURE STATUS  

  8.                   370 Query     SHOW FUNCTION STATUS  

  9. 110813 15:21:11   370 Query     SHOW VARIABLES LIKE 'character_set_server'  

  10.                   370 Query     SHOW FULL COLUMNS FROM `test`.`t_message`  

  11. 110813 15:21:12   370 Query     SHOW CREATE TABLE `test`.`t_message`  

  12. 110813 15:22:40   374 Connect   test_user@192.168.14.129 on test  

  13.                   375 Connect   test_user@192.168.14.129 on test  

  14.                   376 Connect   test_user@192.168.14.129 on test  

  15. 110813 15:23:40   370 Query     insert into t_message values(1'c1')  

  16. 110813 15:24:07   377 Connect   test_user@192.168.14.129 on test  

  17.                   378 Connect   test_user@192.168.14.129 on test  

  18.                   379 Connect   test_user@192.168.14.129 on test  

  19. 110813 15:24:15   370 Query     insert into t_user values(8'n8''p8')  

  20. 110813 15:24:24   370 Query     SHOW FULL COLUMNS FROM `test`.`t_user`  

  21.                   370 Query     SHOW CREATE TABLE `test`.`t_user`  

  22. 110813 15:24:35   370 Query     SHOW FULL COLUMNS FROM `test`.`t_message`  

  23.                   370 Query     SHOW CREATE TABLE `test`.`t_message`  

 Slave1  mysql.log

Shell代码  

  1. [mysql@prx2 mysql]$ tail -f log/mysql.log  

  2.                   317 Connect   test_user@192.168.14.129 on test  

  3.                   318 Connect   test_user@192.168.14.129 on test  

  4. 110813 15:35:30   315 Query     SELECT @@sql_mode  

  5. 110813 15:35:32   315 Query     SELECT @@sql_mode  

  6. 110813 15:35:44   315 Query     SELECT @@SQL_MODE  

  7. 110813 15:35:46   315 Query     SELECT @@SQL_MODE  

  8. 110813 15:37:18   319 Connect   test_user@192.168.14.129 on test  

  9.                   320 Connect   test_user@192.168.14.129 on test  

  10. 110813 15:37:19   321 Connect   test_user@192.168.14.129 on test  

  11. 110813 15:37:26   246 Quit  

  12. 110813 15:38:21   315 Query     SELECT @@SQL_MODE  

  13. 110813 15:38:22    42 Query     BEGIN  

  14.                    42 Query     insert into t_message values(1'c1')  

  15.                    42 Query     COMMIT /* implicit, from Xid_log_event */  

  16. 110813 15:38:50   322 Connect   test_user@192.168.14.129 on test  

  17.                   323 Connect   test_user@192.168.14.129 on test  

  18.                   324 Connect   test_user@192.168.14.129 on test  

  19. 110813 15:38:58    42 Query     BEGIN  

  20.                    42 Query     insert into t_user values(8'n8''p8')  

  21.                    42 Query     COMMIT /* implicit, from Xid_log_event */  

  22. 110813 15:39:08   315 Query     SELECT @@SQL_MODE  

  23. 110813 15:39:19   315 Query     SELECT @@SQL_MODE  

  24. 110813 15:44:08   325 Connect   test_user@192.168.14.129 on test  

  25.                   326 Connect   test_user@192.168.14.129 on test  

  26.                   327 Connect   test_user@192.168.14.129 on test  

 Slave2  mysql.log

Shell代码  

  1. [mysql@prx3 mysql]$ tail -f log/mysql.log  

  2. 110813 15:35:08   305 Connect   test_user@192.168.14.129 on test  

  3.                   306 Connect   test_user@192.168.14.129 on test  

  4.                   307 Connect   test_user@192.168.14.129 on test  

  5. 110813 15:35:31   304 Query     SELECT @@sql_mode  

  6.                   304 Query     SELECT @@sql_mode  

  7. 110813 15:35:44   304 Query     SELECT @@SQL_MODE  

  8. 110813 15:35:46   304 Query     SELECT * FROM t_message t  

  9. 110813 15:37:18   308 Connect   test_user@192.168.14.129 on test  

  10.                   309 Connect   test_user@192.168.14.129 on test  

  11.                   310 Connect   test_user@192.168.14.129 on test  

  12. 110813 15:38:21     8 Query     BEGIN  

  13.                     8 Query     insert into t_message values(1'c1')  

  14.                     8 Query     COMMIT /* implicit, from Xid_log_event */  

  15. 110813 15:38:50   311 Connect   test_user@192.168.14.129 on test  

  16.                   312 Connect   test_user@192.168.14.129 on test  

  17.                   313 Connect   test_user@192.168.14.129 on test  

  18. 110813 15:38:58   304 Query     SELECT @@SQL_MODE  

  19.                     8 Query     BEGIN  

  20.                     8 Query     insert into t_user values(8'n8''p8')  

  21.                     8 Query     COMMIT /* implicit, from Xid_log_event */  

  22. 110813 15:39:08   304 Query     select * from t_user  

  23. 110813 15:39:19   304 Query     select * from t_message  

  24. 110813 15:44:08   314 Connect   test_user@192.168.14.129 on test  

  25.                   315 Connect   test_user@192.168.14.129 on test  

  26.                   316 Connect   test_user@192.168.14.129 on test  

 

从日志中可以看出。

在 Master  mysql.log 中,只执行了 insert into 命令。

在 Slave1 中,只是复制了 insert into 命令, 是主从复制的结果

在 Slave2 中, 复制了 insert into 命令,同时还执行了 select 命令。

 

说明,主从分离已经成功。

转自:http://www.iteye.com/topic/1113437