Amoeba for MySQL 非常好用的mysql集群软件

(转)Amoeba for MySQL 非常好用的mysql集群软件

http://yanwt.iteye.com/blog/1460780

Amoeba for MySQL 


Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。 




Amoeba使用指南 

说明文档见:http://docs.hexnova.com/amoeba/ 




安装小结: 




目前可以有三种解决方式实现mysql读写分离 

1 程序修改mysql操作类 

优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配 

缺点:自己维护更新,增减服务器在代码处理 




2 amoeba 

参考官网:http://amoeba.meidusa.com/ 

优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案 

缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活 




3 mysql-proxy 

参考 mysql-proxy。 

优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号 

缺点:字符集问题,lua语言编程,还只是alpha版本,时间消耗有点高 




如果你不能安装软件来解决读写分离,那可以尝试阿权的项目解决思路。 

如果你可以安装软件,那amoeba是不错的,mysql-proxy不太建议,目前只有alpha版本,效率还不太理想,amoeba目前在阿里巴巴是内部项目,正在生产环境使用的。 




amoeba的安装使用 

1 安装java环境,需要Java SE 1.5 或以上 

2 配置xml文件 

下载地址: http://www.sf.net/projects/amoeba 

解压就可以使用的,顺便说一下,打包的习惯似乎不是太好,最好解压后是自己的文件夹,如用tar -zxpf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba-mysql 




运行很简单 bin/amoeba 即可,后台运行 bin/amoeba & 

如果没有配置JAVA_HOME,则会有如下提示: 

[root@aslibra amoeba-mysql]# bin/amoeba 

Error: JAVA_HOME environment variable is not set. 

如果你是比1.5低,比如1.4的,运行会有错误提示: 




[root@aslibra amoeba-mysql]# bin/amoeba 

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/meidusa/amoeba/mysql/server/MysqlProxyServer (Unsupported major.minor version 49.0) 

        at java.lang.ClassLoader.defineClass0(Native Method) 

        at java.lang.ClassLoader.defineClass(ClassLoader.java:539) 

        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 

..... 




下载jdk1.5以上的版本,压缩版解压后设置好环境变量即可 




可以编辑 /etc/profile以便启动时变量生效,末尾加上 




##############  java  ########### 




JAVA_HOME=/usr/java/jdk 

PATH=$PATH:JAVA_HOME/bin 

export JAVA_HOME PATH 




用bin/amoeba start即可启动amoeba 

如bin/amoeba start > /dev/null & 




配置amoeba: 




conf/amoeba.xml 配置mysql数据库,简单说明一下: 




1 server节点定义amoeba为接受client访问的数据库,可以当作是mysql看待的,用户名和密码是访问时使用的,这个似乎不能定义多个用户名密码,也就是只有一个权限控制,这个对于多应用似乎不大方便。 

2 dbServerList里面可以定义很多实际的mysql数据库,增加dbServer节点即可,这里的用户名密码是作为amoeba操作数据库使用的,要有足够权限。dbServer可以是虚拟的,比如要做负载均衡时可用定义多个数据库归属到此虚拟数据库。2.1RC版的dbServer已移到dbServers.xml文件中配置。 

3 queryRouter节点定义读写的分配情况,也就是读写该发往那个dbServer。 




vi amoeba.xml 修改主配置文件 

4.1)把默认端口8066改成3306 

<property name="port">3066</property> 

4.2)把默认连接用户名和密码改成自己的 

<property name="user">sky</property> 

<property name="password">123456</property> 

4.3)把默认的客户端线程数,请求数及服务端回应数改成200,300,300 

<property name="readThreadPoolSize">200</property> 




                       <!-- proxy server client process thread size --> 

                       <property name="clientSideThreadPoolSize">300</property> 

                       <!-- mysql server data packet process thread size --> 

                       <property name="serverSideThreadPoolSize">300</property 

4.4)把默认注释掉的读写分离选项,把注释去掉并readpool修改成server2 

<!--  --> 

                       <property name="writePool">server1</property> 

                       <property name="readPool">server2</property> 

提示:readPool或writePool可以是dbServers中的multiPool名称,用multiPool来设置负载均衡。 




(本文出自php_sir的新浪博客,用户名php_sir,首页链接:http://blog.sina.com.cn/phpsir,未经本人(php_sir)同意禁止转载) 




5. vi dbServers.xml 增加SEVER2模块,里面的连接用户名密码及地址都表示两台MYSQL的物理机器,192.168.1.11和192.168.1.13 另SERVER1是写,SERVER是读 




<?xml version="1.0" encoding="gbk"?> 

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd"> 




<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/"> 

    <!--    




      Each dbServer needs to be configured into a Pool, 




      If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration: 




        add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig 




        such as 'multiPool' dbServer        




    --> 

  <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">test</property> 




      <!-- mysql user --> 




      <property name="user">root</property> 




      <!--    mysql password --> 




      <property name="password">123456</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> 




  <dbServer name="server1"    parent="abstractServer"> 




    <factoryConfig> 




      <!-- mysql ip --> 




      <property name="ipAddress">192.168.2.11</property> 




    </factoryConfig> 




  </dbServer> 

  <dbServer name="server2"    parent="abstractServer"> 




    <factoryConfig> 




      <!-- mysql ip --> 




      <property name="ipAddress">192.168.2.13</property> 




    </factoryConfig> 




  </dbServer> 




<dbServer name="multiPool" 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">server1</property> 




    </poolConfig> 




  </dbServer> 




</amoeba:dbServers> 




6:修改log4j.xml 取消日志文件生成,如做pdf时(太大了,磁盘很容易满) 

<param name="file" value="${amoeba.home}/logs/project.log"/> 

改成 

<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/> 

注意:我在2.1-rc5版本下第6条的设置JAVA运行时报警,无法通过。 





7:性能优化,打开bin/amoeba 




DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" 

改成 

DEFAULT_OPTS="-server -Xms2048m -Xmx2048m -Xmn1000m -Xss2048k" 




8:启动amoeba 

nohup /usr/local/amoeba/bin/amoeba start 2>&1 >/dev/null &

你可能感兴趣的:(mysql)