一, Amoeba簡述 ??? Amoeba for MySQL致力于MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當query 路由功能,專注 分布式數據庫 proxy 開發。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、Query過濾、讀寫分離、可路由相關的query到目標數據庫、可并發請求多臺數據庫合并結果。 在Amoeba上面你能夠完成多數據源的高可用、負載均衡、數據切片的功能。目前在很多企業的生產線上面使用。
二, Amoeba使用指南
說明文檔見: http://docs.hexnova.com/amoeba/
三, 安裝小結 :
(1)目前可以有三種解決方式實現mysql讀寫分離
1 程序修改mysql操作類
優點:直接和數據庫通信,簡單快捷的讀寫分離和隨機的方式實現的負載均衡,權限獨立分配 缺點:自己維護更新,增減服務器在代碼處理
2 amoeba
參考官網: http://amoeba.meidusa.com/
優點:直接實現讀寫分離和負載均衡,不用修改代碼,有很靈活的數據解決方案 缺點:自己分配賬戶,和后端數據庫權限管理獨立,權限處理不夠靈活
3 mysql-proxy
參考 mysql-proxy。
優點:直接實現讀寫分離和負載均衡,不用修改代碼,master和slave用一樣的帳號 缺點:字符集問題,lua語言編程,還只是alpha版本,時間消耗有點高
如果你不能安裝軟件來解決讀寫分離,那可以嘗試阿權的項目解決思路。
如果你可以安裝軟件,那amoeba是不錯的,mysql-proxy不太建議,目前只有alpha版本,效率還不太理想,amoeba目前在阿里巴巴是內部項目,正在生產環境使用的。
?
(2)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 version49.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。
4 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來設置負載均衡。
5. vi dbServers.xml 增加SEVER2模塊,里面的連接用戶名密碼及地址都表示兩臺MYSQL的物理機器,192.168.1.11和192.168.1.13 另SERVER1是寫,SERVER是讀
<?xml version="1.0" encoding="gb2312"?>
<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 &
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
