mysql实现读写分离中间件Amoeba

时间:2022-03-20 04:02:46

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。

mysql实现读写分离中间件Amoeba

amoeba主要解决以下问题:

a). 降低数据切分带来的复杂多数据库结构

b). 提供数据切分规则并降低数据切分规则给数据库带来的影响
c). 降低数据库与客户端连接
d). 读写分离路由

e).制定一种规则可支持DB线性扩容

暂不支持:

目前还不支持事务
暂时不支持存储过程(近期会支持)
不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致

官方地址:http://wiki.hexnova.com/display/amoeba/Home

使用指南:http://docs.hexnova.com/amoeba/

下载地址:https://sourceforge.net/projects/amoeba/files/

一、环境

master 192.168.0.109

slave 192.168.0.110

slave 192.168.0.112

已经配置好主从复制,基于gtid 事务的复制。mysql版本5.7.12

数据库统一访问用户:root  密码:abc123 并授权其他机器访问

grant all privileges on test_db.* to 'root'@'%' identified by 'abc123';
flush privileges;
创建了数据库 test_db,和表temp。

二、amoeba安装

由于amoeba需要java环境,安装前提配置好java环境

下载amoeba-mysql-binary-2.2.0.tar.gz,并解压

tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C amoeba

由于我安装的是jdk1.7,启动报如下错误:

The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
JDK7启动对xss参数有最小值要求,必须大于228才能启动JVM。需要将-Xss调整为 256k,

三、修改amoeba配置

配置文件在conf下:

access_list.conf   访问机器列表设置
amoeba.xml   主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了
dbServers.xml  mysql主从实例配置
log4j.xml  日志配置
functionMap.xml   配置用于解析Query 中的函数所对应的Java 实现类;
rullFunctionMap.xml  配置路由规则中需要使用到的特定函数的实现类;
rule.xml  配置所有Query 路由规则的信息

1.修改amoeba.xml,设置登陆amoeba的帐号密码

<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
    <property name="user">root</property>
    <property name="password">123456</property>
    <property name="filter">
            <bean class="com.meidusa.amoeba.server.IPAccessController">
                    <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
            </bean>
    </property>
</bean>
2. 修改dbServers.xml,设置主从数据库、访问的用户和密码 、端口
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
    <property name="manager">${defaultManager}</property>
    <property name="sendBufferSize">64</property>
    <property name="receiveBufferSize">128</property>
    <!-- mysql port -->
    <property name="port">3306</property>
    <!-- mysql schema -->
    <property name="schema">test_db</property>
    <!-- mysql user -->
    <property name="user">root</property>
    <!--  mysql password -->
    <property name="password">abc123</property>
</factoryConAfig>
3. 修改dbServers.xml,设置数据库服务器的IP地址和服务器别名。
<dbServer name="Master"  parent="abstractServer">
   <factoryConfig>
       <property name="ipAddress">192.168.0.109</property>
   </factoryConfig>
</dbServer>
<dbServer name="Slave1"  parent="abstractServer">
    <factoryConfig>
        <property name="ipAddress">192.168.0.110</property>
    </factoryConfig>
</dbServer>
<dbServer name="Slave2"  parent="abstractServer">
     <factoryConfig>
          <property name="ipAddress">192.168.0.112</property>
     </factoryConfig>
</dbServer>
4. 修改dbServers.xml,设置ROUNDROBIN(轮询策略)
<dbServer name="multiPool" virtual="true">
    <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
            <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
            <property name="loadbalance">1</property>
            <!-- Separated by commas,such as: server1,server2,server1 -->
              <property name="poolNames">Master,Slave1,Slave2</property>
    </poolConfig>
</dbServer>
5. 修改amoeba.xml,设置读写分离
<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">multiPool</property>
    <property name="needParse">true</property>
</queryRouter>
四、启动测试
1. 启动amoeba
nohup bin/amoeba start|stop  &
2.测试
使用mysql客户端连接amoeba
mysql -u root -p123456 -h 192.168.0.112 -P 8066
更改数据主从可以正常同步。
手动将2个从数据库删除一条不同的数据,验证读的轮询策略
五、表分片配置说明
修改rule.xml,设置分片规则,设置需要分片的表、数据库名、分片的服务器、分片规则:对ID mod 2,分别分片到master1、master2。
<tableRule name="store" schema="test_db" defaultPools="master1,master2">
<rule name="rule1" ruleResult="POOLNAME">
<parameters>ID</parameters>
<expression><![CDATA[
      var division = ID%2;
      case division when 0 then 'master1';
                      when 1 then 'master2';
      end case;
      ]]></expression>
</rule>
六,注意事项
1. 修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满), <param name="file" value="${amoeba.home}/logs/project.log"/> 改成:<paramname="file"value="<![CDATA[{amoeba.home}/logs/project.log>/dev/null]]>"/>
2. 性能优化,打开bin/amoeba,DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"改成:DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"
3. loadbalance元素设置了loadbalance策略的选项,这里选择第一个“ROUNDROBIN”轮询策略,该配置提供负载均衡、failOver、故障恢复功能。poolNames定义了其中的数据库节点配置(当然也可以是虚拟的节点)。此外对于轮询策略,poolNames还定义了其轮询规则,比如设置成“Slave1,Slave1,Slave2”那么Amoeba将会以两次Slave1,一次Slave2的顺序循环对这些数据库节点转发请求。

七、参考文献

在Master/Slave结构下的读写分离

Amoeba使用指南

Amoeba新版本MYSQL读写分离配置log4j.xml设置

Amoeba for mysql读写分离比较多的测试

MYSQL之--amoeba 实现读写分离,负载均衡

Mysql 基于 Amoeba  读写分离

Amoeba搞定mysql主从读写分离

Amoeba for Mysql 试用小结