Amoeba实现Mysql主从复制读写分离

时间:2021-09-08 06:53:40
一.简介
    Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。位于与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
主要解决:
    *降低数据切片带来的复杂多数据库结构
    *提供切分规则并降低数据切分规则给应用带来的影响
    *降低db与客户端的连接数
    *读写分离,负载均衡

二.amoeba读写分离原理图
Amoeba实现Mysql主从复制读写分离

三.安装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

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/">
 <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>
  
  
 </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 命令启动了