mysql實現讀寫分離中間件Amoeba

Amoeba(變形蟲)項目,該開源框架於2008年 開始發佈一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分佈式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注於分佈式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可併發請求多臺數據庫合併結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多 企業的生產線上面使用。


amoeba主要解決以下問題:

a). 降低數據切分帶來的複雜多數據庫結構

b). 提供數據切分規則並降低數據切分規則給數據庫帶來的影響
c). 降低數據庫與客戶端連接
d). 讀寫分離路由

e).制定一種規則可支持DB線性擴容

暫不支持:

目前還不支持事務
暫時不支持存儲過程(近期會支持)
不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(比如一次請求返回10w以上甚至更多數據的場合)
暫時不支持分庫分表,amoeba目前只做到分數據庫實例,每個被切分的節點需要保持庫表結構一致

官方地址:http://wiki.hexnova.com/display/amoeba/Home

使用指南:http://docs.hexnova.com/amoeba/

下載地址:https://sourceforge.net/projects/amoeba/files/

一、環境

master 192.168.0.109

slave 192.168.0.110

slave 192.168.0.112

已經配置好主從複製,基於gtid 事務的複製。mysql版本5.7.12

數據庫統一訪問用戶:root  密碼:abc123 並授權其他機器訪問

grant all privileges on test_db.* to 'root'@'%' identified by 'abc123';
flush privileges;
創建了數據庫test_db,和表temp。

二、amoeba安裝

由於amoeba需要java環境,安裝前提配置好java環境

下載amoeba-mysql-binary-2.2.0.tar.gz,並解壓

tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C amoeba

由於我安裝的是jdk1.7,啓動報如下錯誤:

The stack size specified is too small, Specify at least 228k
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
JDK7啓動對xss參數有最小值要求,必須大於228才能啓動JVM。需要將-Xss調整爲256k,

三、修改amoeba配置

配置文件在conf下:

access_list.conf   訪問機器列表設置
amoeba.xml  主配置文件,配置所有數據源以及Amoeba 自身的參數設置;實現主從的話配置這個文件就可以了
dbServers.xml  mysql主從實例配置
log4j.xml  日誌配置
functionMap.xml  配置用於解析Query 中的函數所對應的Java 實現類;
rullFunctionMap.xml 配置路由規則中需要使用到的特定函數的實現類;
rule.xml 配置所有Query 路由規則的信息

1.修改amoeba.xml,設置登陸amoeba的帳號密碼

<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
    <property name="user">root</property>
    <property name="password">123456</property>
    <property name="filter">
            <bean class="com.meidusa.amoeba.server.IPAccessController">
                    <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
            </bean>
    </property>
</bean>
2.修改dbServers.xml,設置主從數據庫、訪問的用戶和密碼 、端口
<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_db</property>
    <!-- mysql user -->
    <property name="user">root</property>
    <!--  mysql password -->
    <property name="password">abc123</property>
</factoryConAfig>
3.修改dbServers.xml,設置數據庫服務器的IP地址和服務器別名。
<dbServer name="Master"  parent="abstractServer">
   <factoryConfig>
       <property name="ipAddress">192.168.0.109</property>
   </factoryConfig>
</dbServer>
<dbServer name="Slave1"  parent="abstractServer">
    <factoryConfig>
        <property name="ipAddress">192.168.0.110</property>
    </factoryConfig>
</dbServer>
<dbServer name="Slave2"  parent="abstractServer">
     <factoryConfig>
          <property name="ipAddress">192.168.0.112</property>
     </factoryConfig>
</dbServer>
4.修改dbServers.xml,設置ROUNDROBIN(輪詢策略)
<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">Master,Slave1,Slave2</property>
    </poolConfig>
</dbServer>
5.修改amoeba.xml,設置讀寫分離
<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>
    <property name="writePool">Master</property>
    <property name="readPool">multiPool</property>
    <property name="needParse">true</property>
</queryRouter>
四、啓動測試
1.啓動amoeba
nohup bin/amoeba start|stop  &
2.測試
使用mysql客戶端連接amoeba
mysql -u root -p123456 -h 192.168.0.112 -P 8066
更改數據主從可以正常同步。
手動將2個從數據庫刪除一條不同的數據,驗證讀的輪詢策略
五、表分片配置說明
修改rule.xml,設置分片規則,設置需要分片的表、數據庫名、分片的服務器、分片規則:對ID mod 2,分別分片到master1、master2。
<tableRule name="store" schema="test_db" defaultPools="master1,master2">
<rule name="rule1" ruleResult="POOLNAME">
<parameters>ID</parameters>
<expression><![CDATA[
      var division = ID%2;
      case division when 0 then 'master1';
                      when 1 then 'master2';
      end case;
      ]]></expression>
</rule>
六,注意事項
1.修改log4j.xml 取消日誌文件生成(太大了,磁盤很容易滿),<param name="file" value="${amoeba.home}/logs/project.log"/>改成:<paramname="file"value="<![CDATA[{amoeba.home}/logs/project.log>/dev/null]]>"/>
2.性能優化,打開bin/amoeba,DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"改成:DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"
3.loadbalance元素設置了loadbalance策略的選項,這裏選擇第一個“ROUNDROBIN”輪詢策略,該配置提供負載均衡、failOver、故障恢復功能。poolNames定義了其中的數據庫節點配置(當然也可以是虛擬的節點)。此外對於輪詢策略,poolNames還定義了其輪詢規則,比如設置成“Slave1,Slave1,Slave2”那麼Amoeba將會以兩次Slave1,一次Slave2的順序循環對這些數據庫節點轉發請求。

七、參考文獻

在Master/Slave結構下的讀寫分離

Amoeba使用指南

Amoeba新版本MYSQL讀寫分離配置log4j.xml設置

Amoeba for mysql讀寫分離比較多的測試

MYSQL之--amoeba 實現讀寫分離,負載均衡

Mysql 基於 Amoeba  讀寫分離

Amoeba搞定mysql主從讀寫分離

Amoeba for Mysql 試用小結


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章