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 CLASSPATHbash
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>