mysql的讀寫分離amoeba

 此文凝聚筆者不少心血請尊重筆者勞動,轉載請註明出處http://freeze.blog.51cto.com/ 

  一、關於讀寫分離

讀寫分離(Read/Write Splitting),基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫複製被用來把事務性操作導致的變更同步到集羣中的從數據庫。

 

二、同類產品比較 

雖然大多數都是從程序裏直接實現讀寫分離的,但對於分佈式的部署和水平和垂直分割,一些代理的類似中間件的軟件還是挺實用的,Amoeba for Mysql 與MySQL Proxy比較 在MySQL proxy 6.0版本 上面如果想要讀寫分離並且 讀集羣、寫集羣 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua腳本。mysql proxy根本沒有配置文件, lua腳本就是它的全部,當然lua是相當方便的。那麼同樣這種東西需要編寫大量的腳本才能完成一 個複雜的配置。而Amoeba for Mysql只需要進行相關的配置就可以滿足需求。

 

三、關於Amoeba

 

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

 

四、Amoeba的安裝

4.1下載 

wget http://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz

4.2安裝amoeba 

mkdir /usr/local/amoeba #mv amoeba-mysql-binary-2.1.0-RC5.tar.gz /usr/local/amoeba #tar  xvf amoeba-mysql-binary-2.1.0-RC5.tar.gz

4.3安裝JDK 

因爲Amoeba是java開發的,需要JDK支持。 Amoeba框架是基於Java SE1.5開發的,建議使用Java SE 1.5版本。  % java -version java version "1.6.0_18" Java(TM) SE Runtime Environment (build 1.6.0_18-b07) Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing) 目前Amoeba經驗證在JavaTM SE 1.5和Java SE 1.6能正常運行,(可能包括其他未經驗證的版本)。 如果你的機器上沒有安裝JavaTM環境,可以訪問http://www.oracle.com/technetwork/java/javase/downloads/index.html進行下載。可以根據你的操作系統等詳情安裝JavaTM環境。  去oracle官網下載jdk安裝包後,安裝jdk  # chmod 755 jdk-6u25-linux-i586.bin # ./jdk-6u25-linux-i586.bin # mv jdk1.6.0_25/ /usr/local/jdk 聲明路徑,修改/etc/profile,在末尾加上以下代碼  export AMOEBA_HOME=/usr/local/amoeba export JAVA_HOME=/usr/local/jdk export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$AMOEBA_HOME/bin


 五、Amoeba配置

cd /usr/local/amoeba/conf 主要配置以下2個配置文件:  dbServers.xml  #定義連接數據庫信息 amoeba.xml     #定義讀寫分離節點管理信息

5.1 配置dbServers.xml

<?xml version="1.0" encoding="gbk"?>  <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd"> <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">                  <!--                          Each dbServer needs to be configured into a Pool,                          such as 'multiPool' dbServer                    -->          <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 port -->                         <property name="port">3306</property>         __ ** ##後端數據庫端口**__                          <!-- mysql schema -->                         <property name="schema">test</property>        __ ** ##後端數據庫默認庫**__                         <!--  mysql password                         <property name="password">password</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="testWhileIdle">true</property>                 </poolConfig>         </dbServer>           <dbServer name="master"  parent="abstractServer">                          __ ** ##定義主的寫的節點**__                 <factoryConfig>                         <property name="ipAddress">192.168.1.1</property>      __ ** ##主masterIP**__                         <property name="user">test1</property>                 __ ** ##與主mysql通信,連接數據庫的帳號,以下是密碼**__                         <property name="password">test1</property>                 </factoryConfig>         </dbServer>          <dbServer name="slave"  parent="abstractServer">                 <factoryConfig>                         <property name="ipAddress">192.168.1.2</property>                         <property name="user">test2</property>                 __ ** ##與從mysql通信,連接數據庫的帳號,以下是密碼**__                         <property name="password">test2</property>                 </factoryConfig>         </dbServer>          <dbServer name="server1" virtual="true">                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">    __ ** ##定義寫的池,把master節點加入**__                         <property name="loadbalance">1</property>                         <property name="poolNames">master</property>                 </poolConfig>         </dbServer>          <dbServer name="server2" virtual="true">                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">    __ ** ##定義讀的池,把slave節點加入**__                         <property name="loadbalance">1</property>                         <property name="poolNames">slave</property>                 </poolConfig>         </dbServer> </amoeba:dbServers>

5.2 配置amoeba.xml

<?xml version="1.0" encoding="gbk"?> <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">          <proxy>                  <!-- service class must implements com.meidusa.amoeba.service.Service -->                         <!-- port -->                          <property name="port">6666</property>                   __ ** ##定義amoeba讀寫分離proxy對外代理的端口**__                         <!-- bind ipAddress -->                         <!--                          <property name="ipAddress">127.0.0.1</property>                          -->                          <property name="manager">${clientConnectioneManager}</property>                          <property name="connectionFactory">                                         <property name="sendBufferSize">128</property>                                         <property name="receiveBufferSize">64</property>                                 </bean>                         </property>                          <property name="authenticator">                                          <property name="user">dbproxy</property>     __ ** ##定義proxy的管理帳號密碼,客戶端和程序只需要連接proxy的帳號密碼即可,相當於中間接封裝**__                                         <property name="password">123456</property>                                          <property name="filter">                                                 </bean>                                         </property>                                 </bean>                         </property>                  </service>                  <!-- server class must implements com.meidusa.amoeba.service.Service -->                         <!-- port -->                         <!--  default value: random number                         <property name="port">9066</property>                         -->                         <!-- bind ipAddress -->                         <property name="ipAddress">127.0.0.1</property>                         <property name="daemon">true</property>                         <property name="manager">${clientConnectioneManager}</property>                         <property name="connectionFactory">                 <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">                         <!-- proxy server net IO Read thread size -->                         <property name="readThreadPoolSize">20</property>                          <!-- proxy server client process thread size -->                          <!-- per connection cache prepared statement size  -->                         <property name="statementCacheSize">500</property>                          <!-- query timeout( default: 60 second , TimeUnit:second) -->                         <property name="queryTimeout">60</property>                 </runtime>          </proxy>          <!--                  Each ConnectionManager will start as thread                 manager responsible for the Connection IO read , Death Detection         -->         <connectionManagerList>                         <!--                            default value is avaliable Processors                          <property name="processors">5</property>                          -->                 </connectionManager>                          <!--                            default value is avaliable Processors                          <property name="processors">5</property>                          -->                 </connectionManager>         </connectionManagerList>                  <!-- default using file loader -->         <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">                 <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>         </dbServerLoader>          <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">server1</property>                   __ ** ##定義默認的池,一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行。**__                 <property name="writePool">server1</property>                      __ ** ##定義寫的池**__                 <property name="readPool">server2</property>                      __ ** ##定義讀的池**__                 <property name="needParse">true</property>         </queryRouter> </amoeba:configuration>

六、啓動Amoeba

/usr/local/amoeba/bin/amoeba start & 開機自動啓動可加入到 /etc/rc.local內 echo "/usr/local/amoeba/bin/amoeba start &" >> /etc/rc.local

七、日誌排錯

日誌文件在/usr/local/amoeba/log下

 

   PS:amoeba雖然是JAVA寫的,看似效率不高,但功能異常強大,支持讀寫分離,表和庫級別的讀寫分離,數據庫水平分割,垂直分割,還有集羣。是淘寶的得力作品。喜歡的童鞋可以嘗試下。mysql-proxy 只是輕量級的讀寫分離程序,雖然C寫的,但是驅動是需要lua的腳本跑,而且在高併發下經常掛掉。程序還忽略了一些字符設定,如果數據庫不是同一編碼還會出現亂碼,amoeba就不存在。就簡單介紹到這裏吧。

喜歡技術的朋友,也可以加QQ羣進行交流,羣裏大神多,我們共同努力,推動開源。

QQ羣:170838394

linux運維培訓 http://www.magedu.com

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