Amoeba 简介
Amoeba for mysql可作为mysql的分布式数据库前端代理层,它主要在应用层访问mysql的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、query filter、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。
Amoeba for mysql不足:
- 目前还不支持事务
- 暂时不支持存储过程
- 不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
- 暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致
安装Amoeba
shell> tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /db/tool/amoeba
shell> vi /etc/profile
=========================================================
export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk #使用系统自带JDK
export AMOEBA_HOME=/db/tool/amoeba
PATH=$AMOEBA_HOME/bin:$JAVA_HOME/bin:$PATH
=========================================================
shell> source /etc/profile
shell> java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.4) (rhel-1.41.1.10.4.el6-i386)
OpenJDK Server VM (build 20.0-b11, mixed mode)
安装完成后,你可以通过命令确定Amoeba是否成功安装。
shell> amoeba
amoeba start|stop
配置Amoeba for mysql
$AMOEBA_HOME/conf/dbServers.xml:存储代理的数据库连接方式,如:主机IP、端口、Amoeba使用的用户名和密码等
$AMOEBA_HOME/conf/amoeba.xml:定义了Amoeba代理的相关配置
$AMOEBA_HOME/conf/functionMap.xml:数据库函数名和函数解析处理的关系,如:UNIX_TIMESTAMP()、SYSDATE()等等
$AMOEBA_HOME/conf/rule.xml:数据切分规则配置
$AMOEBA_HOME/conf/ruleFunctionMap.xml:rule.xml中自定义的函数
$AMOEBA_HOME/conf/access_list.conf:制定可访问以及拒绝访问的主机IP地址
$AMOEBA_HOME/conf/log4j.xml:Amoeba允许用户配置输出日志级别以及方式,配置方法使用log4j的文件格式
shell> vi /db/tool/amoeba/conf/dbServers.xml
========================================================================================
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
<dbServer name="abstractServer" abstractive="true">
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
<dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property>
<!-- property name="port">3306</property -->
<property name="schema">db_test</property>
<property name="user">root</property>
<property name="password">password</property>
</factoryConfig>
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">127.0.0.1</property>
<property name="port">3307</property>
</factoryConfig>
</dbServer>
<dbServer name="slave" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">127.0.0.1</property>
<property name="port">3308</property>
</factoryConfig>
</dbServer>
<dbServer name="virtualdb" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<property name="poolNames">slave,master,slave</property>
</poolConfig>
</dbServer>
</amoeba:dbServers>
========================================================================================
shell> vi /db/tool/amoeba/conf/amoeba.xml
========================================================================================
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<proxy>
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">
<property name="port">8066</property>
<property name="ipAddress">192.168.90.128</property>
<property name="manager">${clientConnectioneManager}</property>
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property>
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">root</property>
<property name="password">password</property>
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
</service>
<service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">
<property name="port">9066</property>
<property name="ipAddress">127.0.0.1</property>
<property name="daemon">true</property>
<property name="manager">${clientConnectioneManager}</property>
<property name="connectionFactory">
<bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>
</property>
</service>
<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
<property name="readThreadPoolSize">20</property>
<property name="clientSideThreadPoolSize">30</property>
<property name="serverSideThreadPoolSize">30</property>
<property name="statementCacheSize">500</property>
<property name="queryTimeout">600</property>
</runtime>
</proxy>
<connectionManagerList>
<connectionManager name="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>
<property name="processors">5</property>
</connectionManager>
<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
<property name="processors">5</property>
</connectionManager>
</connectionManagerList>
<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
</dbServerLoader>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">virtualdb</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
========================================================================================
验证Amoeba
shell> amoeba start
log4j:WARN log4j config load completed from file:/db/tool/amoeba/conf/log4j.xml
2015-01-15 01:28:21,450 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN ip access config load completed from file:/db/tool/amoeba/conf/access_list.conf
2015-01-15 01:28:21,831 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on /192.168.90.128:8066.
2015-01-15 01:28:21,838 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:9066.
shell> mysql -h 127.0.0.1 -u root -P 8066 -p
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 11 |
+-------------+
1 row in set (0.03 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 12 |
+-------------+
1 row in set (0.02 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 12 |
+-------------+
1 row in set (0.01 sec)
mysql> create table db_test.t (id int);
Query OK, 0 rows affected (0.09 sec)
mysql> insert into t values (1),(2),(3),(4);
Query OK, 4 rows affected (0.05 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from db_test.t;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.04 sec)
【slave】
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)
【ameoba代理端】
mysql> insert into t values(5);
Query OK, 1 row affected (0.05 sec)
mysql> select * from db_test.t;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.01 sec)
mysql> select * from db_test.t;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.01 sec)
mysql> select * from db_test.t;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+------+
5 rows in set (0.01 sec)