amoeba实现mysql读写分离_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2224 | 回复: 0   主题: amoeba实现mysql读写分离        下一篇 
landy
注册用户
等级:新兵
经验:61
发帖:72
精华:0
注册:2011-12-31
状态:离线
发送短消息息给landy 加好友    发送短消息息给landy 发消息
发表于: IP:您无权察看 2014-11-26 9:35:15 | [全部帖] [楼主帖] 楼主

要实现mysql的主从读写分离,目前主要有以下几种方案:

1.通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

2.通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

3.自己开发接口实现,这种方案门槛高,开发成本高,不是一般的小公司能承担得起。

4.利用阿里巴巴的开源项目Amoeba来实现,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单,但是目前还不支持事务。

本文主要讲如何通过amoeba实现mysql读写分离。

1.java环境的安装

Amoeba框架是基于Java SE1.5开发的,建议使用Java SE 1.5版本。目前Amoeba经验证在JavaTM SE 1.5和Java SE 1.6能正常运行

可以到http://www.oracle.com/technetwor ... ml#jdk-6u41-oth-JPR免费注册,下载

我这里下载jdk-6u41-linux-x64-rpm.bin,下载完成后执行sh jdk-6u41-linux-x64-rpm.bin开始安装,将会安装到/usr/java/jdk1.6.0_41目录。

2.amoeba编译安装

# cd /usr/local/src/tmp# mkdir /usr/local/amoeba# wget http://sourceforge.net/projects/ ... 2.0.tar.gz/download# tar xzf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba


3.配置java的用户环境变量

# vi ~/.bash_profile 修改为以下内容:PATH=$PATH:$HOME/bin:/usr/local/amoeba/binJAVA_HOME=/usr/java/jdk1.6.0_41 export JAVA_HOMEexport PATH# source ~/.bash_profile //立即生效

4.1 /usr/local/amoeba/conf/dbServers.xml配置,此文件定义由Amoeba代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。

Amoeba for mysql读写分离主要涉及两个文件:/usr/local/amoeba/conf/dbServers.xml和/usr/local/amoeba/conf/amoeba.xml

abstractServer配置

<dbServer name="abstractServer" abstractive="true"> <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">dbname</property> <!-- mysql user --> <property name="user">root</property> <!-- mysql password --> <property name="password">root</property> </factoryConfig> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <property name="maxActive">500</property> <property name="maxIdle">500</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>


此部分定义真实mysql服务器的端口,数据库名称,mysql用户及密码。

主从数据库定义:

<dbServer name="Master" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.0.1</property> </factoryConfig> </dbServer><dbServer name="Slave1" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.0.2</property> </factoryConfig> </dbServer><dbServer name="Slave2" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.0.3</property> </factoryConfig> </dbServer> <dbServer name="virtualSlave" 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">Slave1,Slave2</property> </poolConfig> </dbServer>


此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码就是上面的abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限。

4.2 /usr/local/amoeba/conf/amoeba.xml配置,此文件定义了amoeba代理的相关配置

amoeba连接验证配置:

<property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">root</property> <property name="password">root</property> <property name="filter"> <bean class="com.meidusa.amoeba.server.IPAccessController"> <property name="ipFile">${amoeba.home}/conf/access_list.conf</property> </bean> </property> </bean> </property>


这里定义连接amoeba时用来验证的用户及密码。

读写分离配置:

<property name="defaultPool">Master</property> <property name="writePool">Master</property> <property name="readPool">virtualSlave</property>


defaultPool:配置了默认的数据库节点,一些除了SELECTUPDATEINSERTDELETE的语句都会在defaultPool执行。

writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。

readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的virtualSlave数据库池。

5.amoeba启动

# amoeba start //此命令以前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行:# amoeba start & //后台运行


6.测试

在amoeba上登8066端口跟amoeba远程登陆主mysql服务器效果一样。

# /usr/local/mysql/bin/mysql -uroot -p123456 -h127.0.0.1 -P8066# /usr/local/mysql/bin/mysql -uroot -p123456 -h192.168.45.7 -P3306


1.启动amoeba时出现The stack size specified is too small, Specify at least 160k

#vim /usr/loca/amoeba/bin/amoeba文件,修改 DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k”

    为 DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”

保存,再次启动即可

2.amoeba查询数据库时出现:java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed

> select * from user;ERROR 2013 (HY000): Lost connection to MySQL server during querymysql>


java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191) at com.meidusa.amoeba.net.poolable.GenericObjectPool.borrowObject(GenericObjectPool.java:381) at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.startSession(CommandMessageHandler.java:633) at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:123) at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2.run(MysqlClientConnection.java:291) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:662)仔细检查dbServers.xml配置后发现factoryConfig中 password默认是被注释掉的,取消注释后正常。# vim /usr/local/amoeba/conf/dbServers.xml,删除<!-- mysql password和后面的--><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</property> <!-- mysql user --> <property name="user">root</property> <!-- mysql password <property name="password">password</property> --></factoryConfig> 

该贴被hui.chen编辑于2014-11-26 11:06:32



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论