基於amoeba實現mysql資料庫的讀寫分離/負載平衡

來源:互聯網
上載者:User

更多博文請關註:沒有傘的孩子必須努力奔跑 (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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.