Amobea讀寫分離

          Amoeba的中文意思是變型蟲,Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的    規則,將SQL請求發送到特定的數據庫上執行。基於此能夠實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,做者強調的是amoeba配      置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單);java

   Amoeba至關於一個SQL請求的路由器,目的是爲負載均衡、讀寫分離、高可用性提供機制,而不是徹底實現它們。用戶須要結合使用MySQL的 Replication等機制      來實現副本同步等功能。amoeba對底層數據庫鏈接管理和路由實現也採用了可插撥的機制,第三方能夠開發更高級的策略類來替代做者的實現。這個程序整體上比較符    合KISS原的思想。mysql


  主要解決:
    • 下降數據切分帶來的複雜多數據庫結構
    • 提供切分規則並下降數據切分規則給應用帶來的影響
    • 下降db 與客戶端的鏈接數
    • 讀寫分離
linux

 

    不足之處:
    a)目前還不支持事務
    b)暫時不支持存儲過程(近期會支持)
    c)不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(好比一次請求返回10w以上甚至更多數據的場合)
    d)暫時不支持分庫分表,amoeba目前只作到分數據庫實例,每一個被切分的節點須要保持庫表結構一致:
   Amoeba:阿米巴原蟲
sql

                

                     

1》環境介紹數據庫

  master--IP:192.168.100.161
  slave---IP:192.168.100.160
  Amoeba--IP:192.168.100.214
2》
安裝JDKvim

  #mkdir /Amoeba
  #tar –xvf jdk-7u40-linux-x64.tar.gz -C /Amoeba
  # vim /etc/profile
  JAVA_HOME=/Amoeba/jdk1.7.0_40
  export JAVA_HOME
  PATH=$JAVA_HOME/bin:$PATH
  export PATH
  CLASSPATH=:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
  export CLASSPATH
bash

3》安裝Amoeba  #:mkdir /usr/local/amoebaapp

  #:unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
  #:chmod -R +x /usr/local/amoeba/bin/
  #java -version
  java version "1.7.0_40"
  Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
  Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

4》
主從受權,增長用戶
負載均衡

  mysql-->grant all privileges on *.* to amoeba@'%' identified by 'amoeba123';
  mysql-->flush privileges;
socket

5》Amoeba配置介紹  

      Amoeba For MySQL 的使用很是簡單,全部的配置文件都是標準的XML 文件,總共有四個配置文件。分別爲:amoeba.xml:主配置文件,配置全部數據源以及           Amoeba 自身的參數設置;實現主從的話配置這個文件就能夠了;

  rule.xml:配置全部Query 路由規則的信息;
  functionMap.xml:配置用於解析Query 中的函數所對應的Java 實現類;
  rullFunctionMap.xml:配置路由規則中須要使用到的特定函數的實現類;
6》
配置Amoeba IP 與用戶

  # vim /usr/local/amoeba/conf/amoeba.xml

            

7》Amoeba配置Master基本信息

         

               

8》Amoeba配置Slave基本信息

           

              

9》Master負載配置

          

10》Slave負載配置

          

11》最後配置讀寫分離

         

  啓動Amoeba
  # cd /usr/local/amoeba/bin
這種啓動方便看nohup.log日誌.防止提示溢出
  #:nohup bash -x amoeba & 

     常見錯誤:1
    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.
  解決辦法:
    # vim /usr/local/amoeba/bin/amoeba
    #DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k" 註釋
    DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k" 增長

  常見錯誤2:
  
org.xml.sax.SAXParseException; lineNumber: 406; columnNumber: 6; 註釋中不容許出現字符串"--"。
  解決辦法:
  後來改了一大通,試了一下午,才發現。咱們的註釋兩邊要有空格,才行。

          

    舉例<!-- 實體類路徑和名 -->

12》測試是否讀寫分離

  1>在(master)主上的test庫創建一個alvin的表
    Mysql->use test;
    Mysql->create table alvin(id int(10),name char(10));

                

      2>在(slave)從上查看test庫是否同步了alvin表
    Mysql-> use test;
    Mysql->show tables;
   3>在主(master)操做.插入一條數據.
    mysql-->insert into alvin values(1,'master');
   4>在從(slave)操做,插入一條數據.
    mysql-->insert into alvin values(2,'slave');
    注意由於從同步主的數據。因此這裏有2條數據,

             

    5>在Amoeba機器上操做
   在192.168.100.214上面測試,這個密碼就是配置文件裏面對外的驗證密碼root 和密碼123456

                  

        #mysql –u root –p 123456 –h 192.168.100.214 –P 9066
  (1) 先驗證讀:咱們配置文件是用的是DR輪詢,注意這個IP地址要寫:amoeba的IP地址,不是master也不是slave ,是經過amoeba代理登錄192.168.100.214
    Mysql->use test;
    測試輪詢成功,主和從各查詢一次。
  (2) 驗證寫:正常來講。若是隻有所有寫到主裏面,兩邊的數據纔會以至。若是其中有一個不一致的話。那麼說明寫到從裏面去了。由於主不會同步從的數據。都是                           單向數據傳輸。

                  

                     

13》經常使用配置寫法

  (1)若是負載多個庫,軟件會根據你用戶受權來決定對哪些庫有權限
    grant all privileges on *.* to amoeba@'%' identified by 'amoeba123'; 這裏寫的是all 那麼就是對全部的庫有權限(會自動負載全部的庫).
    上面配置文件的庫名test.根據這個語句來決定.若是是all.那麼直接用寫test來測試.方便一點.

  (2)一主一從的負載寫法一:
    主只寫.<property name="poolNames">server1</property>
    從只讀.<property name="poolNames">server2</property>

  (3)一主一從的負載寫法:
    主負寫:<property name="poolNames">server1</property>
    主也負責讀,從也負責讀.比例1:1 第一讀.從.第二次讀住.循環寫的話,只能寫主.<property name="poolNames">server1,server2</property>

  (4)一主多從的負載寫法:
    好比.一臺主.3臺從.在最上面定義了.server1(master) server2(slave1) server3(slave2) server4(slave3)
    1主只寫:<property name="poolNames">server1</property>
    3從負載讀 <property name="poolNames">server2,server3,server4</property>
    權重:1:1 3臺輪詢各一次.持續循環

  (5)好比我想要.slave1 權重高一點.其它的.2臺從.每次讀一次.slave1讀.2次.
    <property name="poolNames">server2,server2,server3,server4</property>

  =================================================================amoeba.xml配置文件<?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd"><amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/"> <server> <!-- proxy server綁定的端口 --> <property name="port">6006</property> <!-- proxy server綁定的IP --> <property name="ipAddress">10.0.2.160</property> <!-- proxy server net IO Read thread size --> <property name="readThreadPoolSize">20</property> <!-- proxy server client process thread size --> <property name="clientSideThreadPoolSize">30</property> <!-- mysql server data packet process thread size --> <property name="serverSideThreadPoolSize">30</property> <!-- socket Send and receive BufferSize(unit:K) --> <property name="netBufferSize">128</property> <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). --> <property name="tcpNoDelay">true</property> <!-- 對外驗證的用戶名 --> <property name="user">root</property> <!-- 對外驗證的密碼 --> <property name="password">123456</property> <!-- query timeout( default: 60 second , TimeUnit:second) --> <property name="queryTimeout">60</property> </server> <!-- 每一個ConnectionManager都將做爲一個線程啓動。 manager負責Connection IO讀寫/死亡檢測 --> <connectionManagerList> <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper"> <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property> <!-- default value is avaliable Processors <property name="processors">5</property> --> </connectionManager> </connectionManagerList> <dbServerList> <!-- 一臺mysqlServer 須要配置一個pool, 若是多臺 平等的mysql須要進行loadBalance, 平臺已經提供一個具備負載均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool 簡單的配置是屬性加上 virtual="true",該Pool 不容許配置factoryConfig 或者本身寫一個ObjectPool。 --> <dbServer name="server1"> <!-- PoolableObjectFactory實現類 --> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真實mysql數據庫端口 --> <property name="port">3306</property> <!-- 真實mysql數據庫IP --> <property name="ipAddress">10.0.2.159</property> <property name="schema">test</property> <!-- 用於登錄mysql的用戶名 --> <property name="user">amoeba</property> <!-- 用於登錄mysql的密碼 --> <property name="password">amoeba123</property> </factoryConfig> <!-- ObjectPool實現類 --> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <property name="maxActive">200</property> <property name="maxIdle">200</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="server2"> <!-- PoolableObjectFactory實現類 --> <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> <property name="manager">defaultManager</property> <!-- 真實mysql數據庫端口 --> <property name="port">3306</property> <!-- 真實mysql數據庫IP --> <property name="ipAddress">10.0.2.158</property> <property name="schema">test</property> <!-- 用於登錄mysql的用戶名 --> <property name="user">amoeba</property> <!-- 用於登錄mysql的密碼 --> <property name="password">amoeba123</property> </factoryConfig> <!-- ObjectPool實現類 --> <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool"> <property name="maxActive">200</property> <property name="maxIdle">200</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="master" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA --> <property name="loadbalance">1</property> <!-- 參與該pool負載均衡的poolName列表以逗號分割 --> <property name="poolNames">server1</property> </poolConfig> </dbServer> <dbServer name="slave" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA --> <property name="loadbalance">1</property> <!-- 參與該pool負載均衡的poolName列表以逗號分割 --> <property name="poolNames">server1,server2</property> </poolConfig> </dbServer> </dbServerList> <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property> <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property> <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property> <property name="LRUMapSize">1500</property> <property name="defaultPool">master</property> <property name="writePool">master</property> <property name="readPool">slave</property> <property name="needParse">true</property> </queryRouter></amoeba:configuration>

相關文章
相關標籤/搜索