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