About Amoeba
Amoeba可譯為阿米巴、變型蟲
Amoeba是一個開源專案,致力於Mysq的分散式資料庫前端代理層
Amoeba是一個以MySQL為底層資料儲存,並對應用提供MySQL協議介面的proxy。它集中地響應應用的請求,依據使用者事先設定的規則,將SQL請求傳送到特定的資料庫上執行。
Amoeba相當於一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實現它們。使用者需要結合使用MySQL的Replication等機制來實現副本同步等功能
通過Amoeba可以實現資料來源的高可用、負載均衡、資料切片等功能
與MySQL官方的MySQL Proxy相比,amoeba配置更方便(基於XML的配置檔案,用SQLJEP語法書寫規則,比基於lua指令碼的MySQL Proxy簡單)
Amoeba對底層資料庫連線管理和路由實現也採用了可插撥的機制,第三方可以開發更高階的策略類來替代作者的實現,這個程式總體上比較符合KISS原則的思想。Amoeba主要的解決的問題有:
• 降低 資料切分帶來的複雜多資料庫結構
• 提供切分規則並降低 資料切分規則 給應用帶來的影響
• 降低db 與客戶端的連線數
• 讀寫分離
實驗架構圖
實驗環境
主機名 | 作業系統版本 | Mysql版本 | 主機IP | 其他版本說明 |
lyj1(Master) | Red Hat release 6.5 | Mysql5.6.31 | 10.0.100.201 | |
lyj2(Slave) | Red Hat release 6.5 | Mysql5.6.31 | 10.0.100.202 | |
lyj3(Amoeda) | Red Hat release 6.5 | Mysql5.6.31 | 10.0.100.204 | jdk-8u101-linux-i586.tar.gz、amoeba-mysql-1.3.1-BETA.zip |
安裝jdk(Amoeba是基於JavaSE1.5開發的因此需要Java環境)
//要看清系統的位數下載對應版本 # getconf LONG_BIT 32 //下載地址http://www.oracle.com/technetwork/java/javase/downloads/index.html # tar xvf jdk-8u101-linux-i586.tar.gz # cp jdk1.8.0_101/ /Amoeba -r # vim /etc/profile export JAVA_HOME=/Amoeba/jdk1.8.0_101 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH export PATH=$JAVA_HOME/bin:$PATH # source /etc/profile # java -version java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101-b13) Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode)
安裝Amoeba
//Amoeba安裝非常簡單,解壓即可使用 # mkdir /usr/local/amoede # unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba/ # chmod -R +x /usr/local/amoeba/bin/
Amoeba的配置
1. 為Amoeba訪問叢集中所有Mysql資料庫節點新建使用者與授權
//注意每個Mysql伺服器都要設定有 -> grant all privileges on *.* to 'amoeba'@'%' identified by 'amoeba123'; -> flush privileges;
2. Amoeba For MySQL 的使用非常簡單,所有的配置檔案都是標準的XML 檔案,總共有四個配置檔案。分別為:
- amoeba.xml:主配置檔案,配置所有資料來源以及Amoeba 自身的引數設定(實現主從的話配置這個檔案就可以了)
- rule.xml:配置所有Query 路由規則的資訊
- functionMap.xml:配置用於解析Query 中的函式所對應的Java 實現類
- rullFunctionMap.xml:配置路由規則中需要使用到的特定函式的實現類
3. 書寫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">9006</property> <!-- proxy server繫結的IP --> <property name="ipAddress">10.0.100.204</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.100.201</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.100.202</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>
4. 啟動Amoeba與常見報錯說明
# cd /usr/local/amoeba/bin/ # nohup bash -x amoeba & # cat nohup.out 2016-08-18 22:37:27,675 INFO net.ServerableConnectionManager - Server listening on /10.0.100.204:9006. ->出現這條說明成功
# netstat -tulnp|grep java
tcp 0 0 ::ffff:10.0.100.204:9006 :::* LISTEN 10664/java ->關閉Amoeba就是kill這個程式即可
常見報錯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. 解決1: # 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; 註釋中不允許出現字串 "--" 解決2: 要注意註釋兩邊註釋兩邊要有空格才行 <!-- 實體類路徑和名 --> 此外的報錯應該思考: 先嚐試著用amoeba是不是可以登入Mysql、許可權設定是否正確等 配置檔案中要注意細節不要出錯