免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 飞鸿无痕

【原创】Amoeba搞定mysql主从读写分离 [复制链接]

论坛徽章:
0
发表于 2010-10-28 11:07 |显示全部楼层
<!-- 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.18.118</property>
                                <property name="schema">amoeba</property>
                               
                                <!-- 用于登陆mysql的用户名 -->
                                <property name="user">hanzeyong</property>
                               
                                <!-- 用于登陆mysql的密码 -->
                               
                                <property name="password">justdoit</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>

我的配置。。。
已经没有注销掉了

论坛徽章:
0
发表于 2010-10-28 11:27 |显示全部楼层
回复 31# sjehzy

你读那里只写了server2.所以你读取的数据都是从server2过来的,感觉不到server1的存在,其实写的操作都在server1上进行了!在slave那里加上server1吧

论坛徽章:
0
发表于 2010-10-28 14:25 |显示全部楼层
我的配置:
[root@localhost conf]# more 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.18.119</property>
  <!-- proxy server net IO Read thread size -->
  <property name="readThreadPoolSize">100</property>
  
  <!-- 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">hanyong</property>
  
  <!-- 对外验证的密码 -->
  <property name="password">justdoit</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.MultiConnectionManagerWrappe
r">
   <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</p
roperty>
   
   <!--
     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.18.117</property>
    <property name="schema">amoeba</property>
   
    <!-- 用于登陆mysql的用户名 -->
    <property name="user">hanyong</property>
   
    <!-- 用于登陆mysql的密码 -->
   
    <property name="password">justdoit</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.18.118</property>
    <property name="schema">amoeba</property>
   
    <!-- 用于登陆mysql的用户名 -->
    <property name="user">hanyong</property>
   
    <!-- 用于登陆mysql的密码 -->
   
    <property name="password">justdoit</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>
  

如设置成<property name="poolNames">server1,server2</
property>无法实现读写分离。。。。当我的master服务器mysql关闭服务无法时程序连接数据库出错,读取时无法读取我的slave服务器,
或者我的master服务器mysql服务正常时读取数据也无法读到我的slave 服务器上。。。
十分胸闷

论坛徽章:
0
发表于 2010-10-28 14:53 |显示全部楼层
回复 32# 飞鸿无痕


    从配置上没看出问题。请从其他方面查找,
1、改amoeba主机是否对两个数据库服务器有访问权限(分别在amoeba主机上用命令行登录,看是否OK)
2、防火墙问题

还解决不料能否远程协助,这个配置很简单!

论坛徽章:
0
发表于 2010-10-29 10:34 |显示全部楼层
我的系统问题,因为我的这个系统之前是做测试的,安装的乱七八糟的。。。
我重装以后正常了。。。
谢谢{:3_189:}

论坛徽章:
0
发表于 2010-10-30 07:37 |显示全部楼层
回复 1# 飞鸿无痕


兄弟,请教个问题    我有两台mysql服务器,主从模式,Amoeba虽然能实现读写分离,它能实现故障切换吗?   比如主服务器挂掉后从服务器会自动接管

论坛徽章:
0
发表于 2010-10-30 08:28 |显示全部楼层
回复 36# luwenju


    目前测试的切换有问题,正在和开发者沟通中,希望能通过amoeba来实现,另外还别的方案,可以做两个主库,然后两个主库之间用lvs可以实现自动接管!

论坛徽章:
0
发表于 2010-10-30 09:11 |显示全部楼层
回复 37# 飞鸿无痕

嗯,那在容俺多问几个问题,嘿嘿  
1、两个主库是不是指master-master模式,也就是两个库上都可以进行写、读   ?
2、用LVS的话,所有的数据都是这两台处理,当挂掉一个后剩下的一个处理,对吧?
3、当挂掉的服务器弄好之后在和目前剩下的那个互为master-master    对吧?

哥,别嫌俺啰嗦   

论坛徽章:
0
发表于 2010-10-30 09:15 |显示全部楼层
回复 37# 飞鸿无痕


哥,您老人家看看下面这样搭建后是不是就互为主主复制了,也就是master-master



一、安装配置mysql主从服务器(主:192.168.1.201   从:192.168.1.202)
1、设置主服务器serverID=1,从服务器severID=2;binlog均为log-bin=mysql-bin,然后重启主从两台服务器
2、主服务器(192.168.1.201)新建授权用户
>grant replication slave on *.* to 'replication'@'%' identified by 'replication';
>show master status;
mysql-bin.000004    106
3、从服务器(192.168.1.202)配置
> change master to master_host='192.168.1.201',master_user='replication', master_password='replication',master_log_file='mysql-bin.000004',master_log_pos=106;
>start slave;
>show slave status \G
Master_Host: 192.168.1.201
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

4、从服务器配置192.168.1.02
>grant replication slave on *.* to 'replication'@'%' identified by 'replication';
>show master status;
mysql-bin.000005     244
5、主服务器配置192.168.1.201
>change master to master_host='192.168.1.202',master_user='replication', master_password='replication',master_log_file='mysql-bin.000005',master_log_pos=244;
>start slave;
>show slave status \G
Master_Host: 192.168.1.202
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

论坛徽章:
0
发表于 2010-10-30 09:30 |显示全部楼层
回复 38# luwenju


    就是两个主库多个从库的架构了,两个主库互为主备,当一个主库有问题的时候另一个接管,这样写操作依然正常!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP