更多博文請關註:沒有傘的孩子必須努力奔跑 (www.xuchanggang.cn)
一、Amoeba的簡述:[來自百度百科]
Amoeba是一個以MySQL為底層資料存放區,並對應用提供MySQL協議介面的proxy。它集中地響應應用的請求,依據使用者事先設定的規則,將SQL請求發送到特定的資料庫上執行。基於此可以實現負載平衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便基於XML的設定檔,用SQLJEP文法書寫規則,比基於lua指令碼的MySQL Proxy簡單)。 Amoeba相當於一個SQL請求的路由器,目的是為負載平衡、讀寫分離、高可用性提供機制,而不是完全實現它們。使用者需要結合使用MySQL的 Replication等機制來實現副本同步等功能。amoeba對底層資料庫連接管理和路由實現也採用了可插撥的機制,第三方可以開發更進階的策略類來替代作者的實現。這個程式總體上比較符合KISS原則的思想。目前 Amoeba 已在很多 企業的生產線上面使用。二、Amoeba解決的問題及目前存在的劣勢:1.主要解決的問題: (1). 資料切分後複雜資料來源整合 (2). 提供資料切分規則並降低資料切分規則給資料庫帶來的影響 (3). 降低資料庫與用戶端串連 (4). 讀寫分離路由2.劣勢: (1).目前還不支援事務 (2).暫時不支援預存程序近期會支援) (3).不適合從amoeba導資料的情境或者對大資料量查詢的query並不合適比如一次請求返回10w以上甚至更多資料的場合) (4).暫時不支援分庫分表,amoeba目前只做到分資料庫執行個體,每個被切分的節點需要保持庫表結構一致三、基於 Amoeba 實現mysql資料庫讀寫分離的配置1.測試環境,amoeba的要求,軟體提供,簡要原理圖: (1).測試環境: 紅帽6.3系統 amoeba伺服器位址:192.168.1.104 mysql資料庫:192.168.1.102:3306(master -- rw)/192.168.1.100:3306(slave -- r) 註:為了方便測試讀寫分離,我這裡是不配置主從。 (2).amoeba的要求: Amoeba 是基於 java 開發,所以如果要運行 Amoeba,必須先安裝 jdk 以便可以運行 (3).軟體下載:[大家可以到http://www.oschina.net/p/amoeba (開源中國)下載] 當前測試環境使用的amoeba軟體:http://www.kuaipan.cn/file/id_119710994921422890.htm amoeba參考手冊:http://docs.hexnova.com/amoeba/ amoeba項目代碼:http://sourceforge.net/projects/amoeba/files/ (4).簡要原理圖:650) this.width=650;" src="/e/u/themes/default/images/spacer.gif" style="background:url("/e/u/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/2222302R9-0.jpg" title="amoeba.jpg" alt="222358593.jpg" />2.我們這裡將amoeba相關軟體放在/tmp目錄下,這裡我們先配置JDK
# 解壓JDK軟體到/usr/local目錄下[root@centos tmp]# tar -xf jdk-7u15-linux-x64.tar.gz -C /usr/local/# 進入相應目錄,並建立java目錄[root@centos tmp]# cd /usr/local/[root@centos local]# mkdir java# 將解壓出來的內容移到java目錄[root@centos local]# mv jdk1.7.0_15/* java# 設定java環境變數[root@centos local]# echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc[root@centos local]# . ~/.bashrc# 測試jdk是否正確安裝[root@centos local]# java -version# *******************************# 以下這個方法設定JDK[在下面設定amoeba時,會覆蓋,所以這裡的設定檔,以最下面amoeba的配置為準][root@centos java]# echo $JAVA_HOME[root@centos java]# vim /etc/profile# 在末尾添加export JAVA_HOME=/usr/locla/javaexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH[root@centos java]# source /etc/profile# *******************************
3.配置amoeba中的dbServer.xml(後端mysql 伺服器串連配置)
[root@centos java]# cd /tmp/# 建立相應amoeba目錄[root@centos tmp]# mkdir /usr/local/amoeba# 將壓縮包解壓到指定目錄[root@centos tmp]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba[root@centos tmp]# cd /usr/local/amoeba/[root@centos amoeba]# cd conf/# 準備修改設定檔#/* 以下部分為註解#/* Amoeba總共有7個設定檔,分別如下:#/* Amoeba主設定檔($AMOEBA_HOME/conf/amoeba.xml),用來配置Amoeba服務的基本參數,如Amoeba主機地址、連接埠、認證方式、用於串連的使用者名稱、密碼、線程數、逾時時間、其他設定檔的位置等。#/* 資料庫伺服器設定檔($AMOEBA_HOME/conf/dbServers.xml),用來儲存和配置Amoeba所代理的資料庫伺服器的資訊,如:主機IP、連接埠、使用者名稱、密碼等。#/* 切分規則設定檔($AMOEBA_HOME/conf/rule.xml),用來配置切分規則。#/* 資料庫函數設定檔($AMOEBA_HOME/conf/functionMap.xml),用來設定資料庫函數的處理方法,Amoeba將使用該設定檔中的方法解析資料庫函數。#/* 切分規則函數設定檔($AMOEBA_HOME/conf/ruleFunctionMap.xml),用來配置切分規則中使用的使用者自訂函數的處理方法。#/* 訪問規則設定檔($AMOEBA_HOME/conf/access_list.conf),用來授權或禁止某些伺服器IP訪問Amoeba。#/* 日誌規格設定檔($AMOEBA_HOME/conf/log4j.xml),用來配置Amoeba輸出日誌的層級和方式。# 配置後端mysql 伺服器串連[dbServer.xml][root@centos conf]# vim dbServers.xml.........................(省略) <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 資料庫的連接埠 <!-- mysql port --> <property name="port">3306</property># 設定預設的資料庫,當串連amoeba時,動作表必須顯式的指定資料庫名,即採用dbname.tablename的方式,# 不支援 use dbname指定預設庫,因為操作會調度到各個後端dbserver <!-- mysql schema --> <property name="schema">kongzhong</property> # 設定amoeba串連後端資料庫伺服器的帳號和密碼,需在後端資料庫器上建立該使用者,並授權amoeba串連 <!-- mysql user --> <property name="user">kongzhong123</property> <!-- mysql password --> <property name="password">kongzhong123</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="testOnReturn">true</property> <property name="testWhileIdle">true</property> </poolConfig> </dbServer> # 設定一個後端的dbServer,名為master ,這個可以隨便取,但是為了明確其含義,最好給予特殊含義的單詞,這裡是主DB SERVER <dbServer name="master" parent="abstractServer"> <factoryConfig> # 設定這台DB server 的ip地址 <!-- mysql ip --> <property name="ipAddress">192.168.1.102</property> </factoryConfig> </dbServer># 再設定一台後端mysql資料庫,這裡叫slave,名字需要唯一[這裡可以建立N個後端資料庫,只要複製下面<dbServer>...</dbServer>] <dbServer name="slave" parent="abstractServer"> <factoryConfig># 設定這台DB server 的ip地址 <!-- mysql ip --> <property name="ipAddress">192.168.1.100</property> </factoryConfig> </dbServer># 指定一個虛擬dbServer,將上面定義的dbserver加入這個虛擬dbserver,相當於組成一個組[這裡我們將讀的資料庫組成一個組]# 這裡 需要將 name="mul..." 改成自己想要取的名字,這個名字也需要有含義,後面會用到 <dbServer name="ReadPool" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--># 選擇調度演算法 1 是輪詢 2 是權重 3 是HA 這裡選擇1 輪詢 <property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 --># 負載平衡,slave1,slave2當成2個伺服器進行調度,這類比量加權的調度演算法。# 注意這裡使用的dbserver必須是已經定義了的,可以寫多個,如slave1,slave2 <property name="poolNames">slave</property> </poolConfig> </dbServer></amoeba:dbServers>
4. 配置 Amoeba 監聽連接埠[amoeba.xml]
[root@centos conf]# vim amoeba.xml.........................(省略) <proxy> <!-- service class must implements com.meidusa.amoeba.service.Service --> <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager"> <!-- port --> # 設定amoeba監聽的連接埠(這裡如果預設,後面測試需要指定連接埠,就是這裡的連接埠) <property name="port">3306</property> <!-- bind ipAddress --> <!-- # 設定監聽的介面,如果不設定,則監聽所有的IP[選擇預設] <property name="ipAddress">127.0.0.1</property> -->.........................(省略) <property name="authenticator"> <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"># 提供用戶端串連amoeba時需要使用這裡設定的帳號 (這裡的帳號密碼和amoeba串連後端資料庫伺服器的密碼無關) <property name="user">kongzhong</property># 提供用戶端串連amoeba時需要使用這裡設定的密碼 <property name="password">kongzhong</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> </service>.........................(省略) <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> <property name="ruleLoader"> <bean class="com.meidusa.amoeba.route.TableRuleFileLoader"> <property name="ruleFile">${amoeba.home}/conf/rule.xml</property> <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property> </bean> </property> <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property> <property name="LRUMapSize">1500</property> <property name="defaultPool">master</property> <!-- --># 把預設注釋掉的讀寫分離選項,把注釋去掉並readpool修改成ReadPool(這個名字,我們前面在dbServer.xml裡設定一個讀資料庫組,這裡是作為唯讀池) <property name="writePool">master</property> <property name="readPool">ReadPool</property> <property name="needParse">true</property> </queryRouter>
5. 配置amoeba及JAVA的環境變數
[root@centos conf]# vim /etc/profileJAVA_HOME=/usr/locla/javaAMOEBA_HOME=/usr/local/amoebaexport PATH=$PATH:$AMOEBA_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin[root@centos conf]# source /etc/profile
6.啟動amoeba測試
# 如果確認能夠正常啟動,就加>>/dev/null 否則還是看一下提示資訊[root@centos conf]# amoeba start & >>/dev/null# 檢測啟動情況[root@centos conf]# netstat -tulnp |grep java# 停止amoeba測試指令是否可用[root@centos conf]# amoeba stop
7.在兩台資料庫做剛才設定中的相應操作(1).在主DB server上操作
# 建立設定檔指定的資料庫mysql> create database kongzhong;mysql> use kongzhong# 建立用於測試的表mysql> create table t1(name varchar(10));# 插入測試資料mysql> insert into t1 values('102');# 授予amoeba使用者串連資料庫的許可權mysql> grant all privileges on kongzhong.* to 'kongzhong123'@'192.168.1.104' identified by 'kongzhong123';mysql> flush privileges;
(2).在從DB server上操作
# 建立設定檔指定的資料庫mysql> create database kongzhong;mysql> use kongzhong# 建立用於測試的表mysql> create table t1(name varchar(10));# 插入測試資料mysql> insert into t1 values('100');# 授予amoeba使用者串連資料庫的許可權mysql> grant all privileges on kongzhong.* to 'kongzhong123'@'192.168.1.104' identified by 'kongzhong123';mysql> flush privileges;
8.在任何一台機器上登陸測試,這裡的ip地址指向amoeba所在伺服器的ip地址
# 登陸相應資料庫,查詢當前所在資料庫(相應大家都應該懂的,就不詳細示範了)[root@client102 ~]# mysql -ukongzhong -p -h192.168.1.104[root@client100 ~]# mysql -ukongzhong -p -h192.168.1.104[root@client104 ~]# mysql -ukongzhong -p -h192.168.1.104
9.遇到的問題(1).報錯1:
The stack size specified is too small, Specify at least 160kError: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.解決方案:[root@centos bin]# cd /usr/local/amoeba/# 修改設定檔[root@centos amoeba]# vim bin/amoeba將下面這行DEFAULT_OPTS="-server -Xms1024m -Xmx1024m -Xss128k"修改為:DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
(2).報錯2:
Error: JAVA_HOME environment variable is not set.解決方案:[root@centos local]# echo 'export JAVA_HOME=/usr/local/java' >> ~/.bashrc[root@centos local]# . ~/.bashrc
10.需要注意的問題,思路延伸(1).取消日誌產生,不然磁碟容易爆滿
[root@centos conf]# vim log4j.xml [此檔案在amoeba目錄下的conf目錄下]修改log4j.xml 取消記錄檔產生太大了,磁碟很容易滿)<param name="file" value="${amoeba.home}/logs/project.log"/>改成<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
(2).效能最佳化
[root@centos amoeba]# vim bin/amoebaDEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"改成DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"
本文出自 “沒有傘的孩子必須努力奔跑” 部落格,請務必保留此出處http://634871.blog.51cto.com/624871/1335129