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 &