一.简介
Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。位于与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
主要解决:
*降低数据切片带来的复杂多数据库结构
*提供切分规则并降低数据切分规则给应用带来的影响
*降低db与客户端的连接数
*读写分离,负载均衡
二.amoeba读写分离原理图
三.安装amoeba
先决条件:
1.Java SE 1.5或以上
2.支持mysql4.1以后的版本
3.网络环境至少运行了一个mysql4.1以上的服务
1.安装java运行环境
Amoeba框架是基于Java SE1.5开发的,因此需要安装jdk,可以到oracle官网访问下载http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. rpm -ivh jdk-7u80-linux-x64.rpm
ln -s /usr/java/jdk1.7.0_80/ /usr/java/jdk1.7 #为了方便,创建软连接
3.配置java环境变量
export JAVA_HOME=/usr/java/jdk1.7
PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/bin:$PATH:/usr/local/httpd/bin
PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/bin:$PATH:/usr/local/httpd/bin
source /etc/profile
4.安装amoeba
到此地址下载合适版本:https://sourceforge.net/projects/amoeba/files/
tar zxf /root/amoeba-mysql-1.2.1-GA.tar.gz -C /usr/local/
chmod +x /usr/local/amoeba/bin/amoeba
四.配置MySQL+Amoeba实现读写分离
1.配置mysql主从复制
关于mysql主从复制实现内容,请参考一下网址,这里不做过多赘述
http://blog.csdn.net/qq_30256711/article/details/78796311
2.配置amoeba
vim /usr/local/amoeba/conf/amoeba.xml
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
<server>
<!-- proxy server绑定的端口 -->
<property name="port">3306</property> #此处为代理服务器对外访问的端口
<!-- proxy server绑定的IP -->
<property name="ipAddress">192.168.200.128</property> #此处为代理服务器对外访问的IP地址
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">100</property> #此参数是读客户端,databaseserver段网络数据包的线程数
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">80</property> #此参数是读操作客户端的线程数
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">100</property> #此参数为处理返回数据包的服务端的线程数
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property> # 数据缓冲池大小
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property> #此处是验证客户端的用户名
<!-- 对外验证的密码 -->
<property name="password">oldboy</property># 此处是验证客户端的密码
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">30</property>
</server>
<!--
每个ConnectionManager都将作为一个线程启动。
manager负责Connection IO读写/死亡检测
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
<!--
default value is avaliable Processors
<property name="processors">5</property>
-->
</connectionManager>
</connectionManagerList>
<dbServerList>
<!--
一台mysqlServer 需要配置一个pool,
如果多台 平等的mysql需要进行loadBalance,
平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
或者自己写一个ObjectPool。
-->
<dbServer name="server1">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3308</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.200.131</property>
<property name="schema">test1</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">gg123</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property> #最大的活动连接数,如果超过此连接,则会等待
<property name="maxIdle">200</property> #最大的空闲连接数,如果超过次值,则会关闭多余空闲连接
<property name="minIdle">10</property> #最小的空闲连接数,连接池将保持最小空闲连接,即使这些连接长久不用
<property name="minEvictableIdleTimeMillis">600000</property> #连接空闲多少时间将被关闭
<property name="timeBetweenEvictionRunsMillis">600000</property> #用于驱逐空闲连接没间隔多少时间检查一次空闲连接
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
<dbServer name="server2">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> #连接工厂实现类
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3307</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.200.131</property>
<property name="schema">test1</property> #连接初始化的schema
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">gg123</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="master" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
<dbServer name="slave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server2</property>
</poolConfig>
</dbServer>
<!-- proxy server绑定的端口 -->
<property name="port">3306</property> #此处为代理服务器对外访问的端口
<!-- proxy server绑定的IP -->
<property name="ipAddress">192.168.200.128</property> #此处为代理服务器对外访问的IP地址
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">100</property> #此参数是读客户端,databaseserver段网络数据包的线程数
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">80</property> #此参数是读操作客户端的线程数
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">100</property> #此参数为处理返回数据包的服务端的线程数
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property> # 数据缓冲池大小
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property> #此处是验证客户端的用户名
<!-- 对外验证的密码 -->
<property name="password">oldboy</property># 此处是验证客户端的密码
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">30</property>
</server>
<!--
每个ConnectionManager都将作为一个线程启动。
manager负责Connection IO读写/死亡检测
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
<!--
default value is avaliable Processors
<property name="processors">5</property>
-->
</connectionManager>
</connectionManagerList>
<dbServerList>
<!--
一台mysqlServer 需要配置一个pool,
如果多台 平等的mysql需要进行loadBalance,
平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
或者自己写一个ObjectPool。
-->
<dbServer name="server1">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3308</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.200.131</property>
<property name="schema">test1</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">gg123</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property> #最大的活动连接数,如果超过此连接,则会等待
<property name="maxIdle">200</property> #最大的空闲连接数,如果超过次值,则会关闭多余空闲连接
<property name="minIdle">10</property> #最小的空闲连接数,连接池将保持最小空闲连接,即使这些连接长久不用
<property name="minEvictableIdleTimeMillis">600000</property> #连接空闲多少时间将被关闭
<property name="timeBetweenEvictionRunsMillis">600000</property> #用于驱逐空闲连接没间隔多少时间检查一次空闲连接
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="multiPool" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
<dbServer name="server2">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> #连接工厂实现类
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3307</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.200.131</property>
<property name="schema">test1</property> #连接初始化的schema
<!-- 用于登陆mysql的用户名 -->
<property name="user">amoeba</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">gg123</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
<dbServer name="master" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
<dbServer name="slave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server2</property>
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property> #
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slave</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
3.配置玩amoeba.xml后就可以使用
chmod +x /usr/local/amoeba/bin/amoeba
/usr/local/amoeba/bin/amoeba 命令启动了