MySQL Amoeba读写分离

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)

详细文档参见:

整理自网络

Svoid
2015-01-14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值