Amoeba+mysql实现读写分离

 

安装mysql的过程和配置主从备份的过程在这里都不详细说了

说明:master主机:192.168.0.136 slave主机:192.168.0.135  amoeba主机和master在同一台主机上面

1,  首先要安装jdk环境,                      在0.136上安装

下载jdk1.5或者更新版本,地址 http://java.sun.com/javase/downloads/index.jsp

我用的是:jdk-6u20-linux-i586-rpm.bin

在Amoeba server上执行

chmod +x jdk-6u20-linux-i586-rpm.bin

./ jdk-6u20-linux-i586-rpm.bin

然后按n次空格键,然后输入yes就可以了!^_ ^

ln -s /usr/java/jdk1.6.0_20/ /usr/java/jdk1.6

vi /etc/profile

#添加如下两行内容

export JAVA_HOME=/usr/java/jdk1.6

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

#执行下面的命令使更改的内容生效

source /etc/profile

 

2,安装amoeba-mysql

安装amoeba-mysql

下载amoeba-mysql,目前最新版本为amoeba-mysql-1.3.1-BETA.zip

Mkdir /usr/local/amoeba               amoeb的安装目录

下载地址:http://blogimg.chinaunix.net/blog/upfile2/101027160252.zip

unzip 101027160252.zip

配置文件位于conf目录下,执行文件位于bin目录下,解压后发现bin目录下的启动文件没有可执行权限,

请执行:chmod -R +x /usr/local/amoeba/bin/

Amoeba For MySQL  的使用非常简单,所有的配置文件都是标准的XML文件,总共有四个配置文件。分别为:

◆amoeba.xml:主配置文件,配置所有数据源以及Amoeba 自身的参数设置;实现主从的话配置这个文件就可以了;

◆rule.xml:配置所有Query路由规则的信息;

◆functionMap.xml:配置用于解析Query中的函数所对应的Java实现类;

◆rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;

下面我们就来通过更改amoeba.xml配置文件实现mysql主从读写分离,我的配置如下:

<?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">8066</property>
                                       
      <!-- proxy server绑定的IP  对外的IP地址-->
      <property name="ipAddress">192.168.0.136</property>

说明:这个ip地址是amoeba安装的ip地址
      <!-- proxy server net IO Read thread size -->
      <property name="readThreadPoolSize">20</property>
                                                  
      <!-- proxy server client process thread size -->
      <property name="clientSideThreadPoolSize">30</property>
                                             
      <!-- mysql server data packet process thread size -->
      <property name="serverSideThreadPoolSize">30</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">password</property>
                                                 
      <!-- query timeout( default: 60 second , TimeUnit:second) -->
      <property name="queryTimeout">60</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">3306</property>
                                                      
         <!-- 真实mysql数据库IP -->
          <property name="ipAddress">192.168.0.136</property>
          <property name="schema">brook</property>
   说明:test为读写分离即是主从备份的数据库名称   (其实这里面只是一个测试数据库,在登录用户名下的所有数据库amoeba都可以访问)                                                
           <!-- 用于登陆mysql的用户名 -->
          <property name="user">root</property>
                                                          
           <!-- 用于登陆mysql的密码 -->
                                                        
           <property name="password">password</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="server2">
 
        <!-- PoolableObjectFactory实现类 -->
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
         <property name="manager">defaultManager</property>
                                                       
         <!-- 真实mysql数据库端口 -->
         <property name="port">3306</property>
                                                               
         <!-- 真实mysql数据库IP -->
         <property name="ipAddress">192.168.0.135</property>
         <property name="schema">brook</property>
  说明:读写分离的数据库                                                               
         <!-- 用于登陆mysql的用户名 -->
         <property name="user">root</property>
                                                                 
         <!-- 用于登陆mysql的密码 -->
                                                                 
           <property name="password">password</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">server1,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>

 

启动amoeba

/usr/local/amoeba/bin/amoeba &

检验启动是否成功(使用的是默认的8066端口):

执行ps aux | grep amoeba

root     24580  0.2 19.2 408912 49264 pts/1    Sl   12:52   0:11 /usr/java/jdk1.6/bin/java -server -Xms256m -Xmx256m -Xss128k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launche

 

netstat -lnp | grep java

tcp        0      0 ::ffff:192.168.1.159:8066   :::*                        LISTEN     24580/java

 

试之前先要保证amoeba-server有访问两个主从服务器test库的权限,在主从mysql上都执行:

grant all on brook.* to root@'192.168.0.%' identified by 'password';

#用户名密码要和前面配置的意志

flush privileges;

测试的时候和我们平时使用一样,amoeba-mysql对我们应用透明,就是个mysql的代理了!

登录mysql使用如下命令(用户名密码和上面配置的要一致):

mysql -uroot -ppassword -h192.168.0.136 -P8066

登录上去后,为了测试读和写必须,先把mysql的主从复制停掉,才能更清楚地看出读写的服务器是哪台,在从上使用stop slave;登录到amoeba-mysql上,使用命令mysql -uroot -ppassword -h192.168.0.136 -P8066,然后执行写和读操作,查看写的是哪台服务器,读的是哪台服务器,实验结果显示:写只在主上进行,读在主和从都进行,比率是1:1

 

# mysql -uroot -ppassword -h192.168.0.136 -P8066

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 14556042

Server version: 5.1.45-mysql-amoeba-proxy-1.3.1-BETA Source distribution

说明:这个说明用代理登陆mysql

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

现在使用amoeba+mysql实现读写分离配置完成,可以写测试用例完成测试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值