天天看點

介紹Amoeba一. 介紹Amoeba二. 安裝和運作Amoeba三. Amoeba入門

一. 介紹Amoeba

1. Amoeba是什麼?

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

2. 為何要使用Amoeba?

随着傳統的資料庫技術日趨成熟、計算機網絡技術的飛速發展和應用範圍的擴充,資料庫應用 已經普遍建立于計算機網絡之上。這時集中式資料庫系統表現出它的不足:集中式處理,勢必造成性 能瓶頸;應用程式集中在一台計算機上運作,一旦該計算機發生故障,則整個系統受到影響,可靠性 不高;集中式處理引起系統的規模和配置都不夠靈活,系統的可擴充性差。在這種形勢下,集中式數 據庫将向分布式資料庫發展。而Amoeba的透明、簡易配置及多個優點使其成為分布式資料庫代理産品中的優秀選擇。

3. 分布式資料庫代理的相關概念

Amoeba在分布式資料庫領域将緻力解決資料切分,應付用戶端“集中式”處理分布式資料。這 裡集中式是一個相對概念,用戶端不需要知道某種資料的實體存儲地。避免這種邏輯出現在業務端, 大大簡化了用戶端操作分布式資料的複雜程度。

分布式資料庫系統的優點:

  • 降低費用。分布式資料庫在地理上可以式分布的。其系統的結構符合這種分布的要求。允許用 戶在自己的本地錄用、查詢、維護等操作,實行局部控制,降低通信代價,避免集中式需要更高要求 的硬體裝置。而且分布式資料庫在單台機器上面資料量較少,其響應速度明顯提升。
  • 提高系統整體可用性。避免了因為單台資料庫的故障而造成全部癱瘓的後果。
  • 易于擴充處理能力和系統規模。分布式資料庫系統的結構可以很容易地擴充系統,在分布式數 據庫中增加一個新的節點,不影響現有系統的正常運作。這種方式比擴大集中式系統要靈活經濟。在 集中式系統中擴大系統和系統更新,由于有硬體不相容和軟體改變困難等缺點,更新的代價常常是昂貴和不可行的。

4. Amoeba相關産品及其介紹

  • Amoeba for MySQL

Amoeba for MySQL緻力于MySQL的分布式資料庫前端代理層,它主要在應用層通路MySQL的時候充當query 路由功能,專注 分布式資料庫 proxy 開發。座落與Client、DB Server(s)之間。對用戶端透明。具有負載均衡、高可用性、Query過濾、讀寫分離、可路由相關的query到目标資料庫、可并發請求多台資料庫合并結果。 在Amoeba上面你能夠完成多資料源的高可用、負載均衡、資料切片的功能。目前在很多企業的生産線上面使用。

那麼Amoeba for mysql 對用戶端程式來說是什麼呢? 我們就當它是mysql吧,它是一個虛拟的mysql,對外提供mysql協定。用戶端連接配接amoeba就象連接配接mysql一樣。在amoeba内部需要配置相關的認證屬性。具體請參閱後面的章節。 

  • Amoeba for Aladdin

與Amoeba for MySQL 類似,用戶端連接配接Aladdin必須用MySQL 協定,之是以用MySQL協定,主要是想借助mysql使用的廣泛程度以及對各種開發語言的支援。Aladdin後端可以同時連接配接各種資料庫。隻要這些資料庫提供jdbc驅動。aladdin的出現可以解決企業在資料庫整合上面提供積極的幫助。使用者不需要知道後端到底使用了什麼類型的資料庫、資料庫的實體位址什麼,這些由aladdin來分析sql語句,并且獲得相應的要查詢的表跟條件,然後由這些規則結合這些條件進行路由到相關的實體資料庫。

  • Amoeba for MongoDB

随着NoSQL的日益興起,mongoDB作為一款nosql資料庫以其優異的性能得到了廣泛的關注。可以說,mongoDB填補了傳統關系型資料庫以及傳統鍵值型資料庫的空白,并且兼具兩者優秀特質。Amoeba for MongoDB将提供與Amoeba for MySQL類似的,完全自主、可控的切分方式、并嘗試完成同樣的auto sharding的功能。 基于Amoeba架構,跟以往的産品一樣具備心跳檢測、負載均衡、故障轉移、查詢聚合等功能,保留了之前的配置方式,隻要熟悉amoeba其中一款産品的配置,那麼上手将非常容易的。

5. 比較Amoeba及其類似産品

  • Amoeba for Mysql 與MySQL Proxy比較

在MySQL proxy 6.0版本 上面如果想要讀寫分離并且 讀叢集、寫叢集 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua腳本。mysql proxy根本沒有配置檔案, lua腳本就是它的全部,當然lua是相當友善的。那麼同樣這種東西需要編寫大量的腳本才能完成一 個複雜的配置。而Amoeba for Mysql隻需要進行相關的配置就可以滿足需求。

  • Amoeba for mongoDB與mongos比較

mongodb中的資料切分有一個chunk的概念,每個chunk代表一個資料段(range),當一個chunk的大小到達了指定的資料大小,就會自動切分成兩個。 Mongos是根據資料段(chunk)進行切分的,且切分依據的字段必須是一個key。而目前大多的應用中,id(尤其是使用者ID)是無序化的,可能有些使用者是手機号、有些是會員卡号等等。這使得proxy的range切分難以實施。 是以,雖然mongodb的mongos提供了automatic sharding的功能,但由于資料切分的不可控,常常不能滿足我們的需要。 Amoeba for MongoDB提供完全自主、可控的切分方式。

6. Amoeba不能做什麼?

  • 目前還不支援事務
  • 暫時不支援存儲過程(近期會支援)
  • 不适合從amoeba導資料的場景或者對大資料量查詢的query并不合适(比如一次請求傳回10w以上甚至更多資料的場合)
  • 暫時不支援分庫分表,amoeba目前隻做到分資料庫執行個體,每個被切分的節點需要保持庫表結構一緻

二. 安裝和運作Amoeba

1. 驗證Java安裝

Amoeba架構是基于Java SE1.6開發的,建議使用Java SE 1.6版本。% 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環境。

2. 下載下傳Amoeba

你可以在Amoeba在SourceForge的首頁下載下傳Amoeba,http://sourceforge.net/projects/amoeba/files/。

當你下載下傳的時候,請確定選擇Amoeba的最新版本。Amoeba目前有三個開源産品,分别是适用于擁有JDBC Driver的資料庫的Amoeba for Aladdin、适用于MySQL資料庫的Amoeba for MySQL以及适用于mongoDB資料庫的Amoeba for mongoDB。本指南編寫時,Amoeba for Aladdin的最新版本是amoeba-aladdin-0.7.0-BETA.tar.gz,Amoeba for MySQL的最新版本是amoeba-mysql-binary-2.0.1-BETA.tar.gz,Amoeba for mongoDB的最新版本是amoeba-mongodb-binary-1.2.0-BETA.tar.gz,請選擇合适的版本下載下傳。

3. 安裝Amoeba

不同作業系統因其實作不同而有較大差異,以下小節概括了在常見系統中安裝Amoeba的最佳實踐。

以下的安裝過程僅僅以Amoeba for MySQL作為例子,Amoeba for Aladdin和Amoeba for MongoDB的安裝方式是類似的。

  • 在Microsoft Windows上安裝Amoeba

你可以從http://sourceforge.net/projects/amoeba/files/下載下傳Amoeba的最新版本。找個地方存放它,并解壓到你需要安裝的位置。這裡假設你将存檔檔案解壓到C:\Program Files\amoeba-mysql-binary-2.0.1-BETA,解壓到其他路徑是一樣的。進入Ameoba運作目錄:C:\Users\Admin > cd c:\Program Files\amoeba-mysql-binary-2.0.1-BETA\bin

  • 在Linux上安裝Amoeba

與在Microsoft Windows系統上安裝的過程類似,下載下傳後存放并解壓到安裝的位置。這裡假設你将存檔檔案解壓到/usr/local/amoeba-mysql-binary-2.0.1-BETA,解壓到其他路徑也是一樣的。進入Ameoba運作目錄:[]$ cd AMOEBA_HOME=/usr/local/amoeba-mysql-binary-2.0.1-BETA/bin

  • 在Mac OSX上安裝Amoeba

參照第3.2節。

  • 在FreeBSD或OpenBSD上安裝Amoeba

參照第3.2節。

4. 驗證Amoeba的安裝

安裝完成後,你可以通過指令确定Amoeba是否成功安裝。$ amoeba

amoeba start|stop

請按任意鍵繼續. . .

三. Amoeba入門

1. 通過Amoeba對一個資料庫執行個體進行操作

本小節的主要目的是幫助你在修改最少配置并且僅僅有最少資源的情況下,快速的搭建起一個可用的,通過Amoeba連接配接的資料庫。本節并不會講述Amoeba的一些更實用的功能(比如分片等等)但相信這節會給你一個極大的使用Amoeba的信心,你會發現Amoeba的使用比想象的簡單地多。

2. 校驗amoeba的運作狀态

根據上一章文檔,相信你應該已經配置完成了Amoeba的環境。執行以下指令:$ $AMOEBA_HOME/bin/amoeba

amoeba start|stop

請按任意鍵繼續. . .當出現如上提示,表示Amoeba可以正常啟動。

3. 驗證資料庫是否可以正常連接配接

要通過Amoeba來連接配接資料庫首先資料庫需要正常對外提供服務,根據不同的資料庫類型按以下方式進行驗證。

MySQL的情形下:

$ mysql -uroot -ppassword -h127.0.0.1 -P3306
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 125
Server version: 5.5.9 MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
           
這裡隻是一個指令的例子,其中*-u選項後是MySQL使用者名、-p選項後是MySQL密碼、-h選項後是MySQL所在主機位址以及-P{*}選項後是MySQL服務的端口号。

通過以上指令你可以驗證MySQL的正常對外服務。

Caution

需要注意的是,以上指令需要在Amoeba所在的機器執行。因為iptables等配置很容易使得Amoeba無法通路MySQL。

MongoDB的情形下:

$ mongo 127.0.0.1:27017
MongoDB shell version: 1.6.2
connecting to: 127.0.0.1:27017/test
> 
           
裡隻是一個mongodb登入指令的示例,其中的主機位址以及端口号需根據你的實際情況。

Caution

需要注意的是,以上指令需要在Amoeba所在的機器執行。因為iptables等配置很容易使得Amoeba無法通路mongoDB。

4. 配置Amoeba

在這一節主要包含對Amoeba進行最基本的配置使得你可以通過Amoeba對一台資料庫進行操作,當然借由這個機會本節也将對Amoeba的配置檔案梗概性地介紹。

Amoeba基礎配置介紹

Amoeba有哪些主要的配置檔案?

  • 想象Amoeba作為資料庫代理層,它一定會和很多資料庫保持通信,是以它必須知道由它代理的資料庫如何連接配接,比如最基礎的:主機IP、端口、Amoeba使用的使用者名和密碼等等。這些資訊存儲在$AMOEBA_HOME/conf/dbServers.xml中。
  • Amoeba為了完成資料切分提供了完善的切分規則配置,為了了解如何分片資料、如何将資料庫傳回的資料整合,它必須知道切分規則。與切分規則相關的資訊存儲在$AMOEBA_HOME/conf/rule.xml中。
  • 當我們書寫SQL來操作資料庫的時候,常常會用到很多不同的資料庫函數,比如:UNIX_TIMESTAMP()、SYSDATE()等等。這些函數如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函數名和函數處理的關系。
  • 對$AMOEBA_HOME/conf/rule.xml進行配置時,會用到一些我們自己定義的函數,比如我們需要對使用者ID求HASH值來切分資料,這些函數在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定義。
  • Amoeba可以制定一些可通路以及拒絕通路的主機IP位址,這部配置設定置在$AMOEBA_HOME/conf/access_list.conf中
  • Amoeba允許使用者配置輸出日志級别以及方式,配置方法使用log4j的檔案格式,檔案是$AMOEBA_HOME/conf/log4j.xml。

配置一個DB節點

以下是配置一個DB節點,使用Amoeba做操作轉發的步驟:

  1. 首先,在$AMOEBA_HOME/conf/dbServers.xml中配置一台資料庫,如下:

    Example 1.1. 簡單的DB節點配置

    <?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,
       If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
        add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
        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 user -->
       <property name="user">root</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="server1"  parent="abstractServer">
      <factoryConfig>
       <!-- mysql ip -->
       <property name="ipAddress">127.0.0.1</property>
      </factoryConfig>
     </dbServer>
    
     <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">server1</property>
      </poolConfig>
     </dbServer>
    
    </amoeba:dbServers>
               
    1. 以下對這個簡單的配置檔案進行一些分析:
      這份dbServers配置檔案中,我們定義了三個dbServer元素,這是第一個dbServer元素的定義。這個名為abstractServer的dbServer,其abstractive屬性為true,這意味着這是一個抽象的dbServer定義,可以由其他dbServer定義拓展。
      在第一個dbServer元素分别定義MySQL的端口号、資料庫名、使用者名以及密碼。
      manager定義了該dbServer選擇的連接配接管理器(ConnectionManager),這裡引用了amoeba.xml的配置,稍後介紹。
      dbServer下有poolConfig的元素,這個元素的屬性主要配置了與資料庫的連接配接池,與此相關的具體配置會在後面的章節中詳細介紹。
      命名為server1的dbServer元素,正如你設想的那樣,這個server1是abstractServer的拓展,parent屬性配置了拓展的抽象dbServer,它拓展了abstractServer的ipAddress屬性來指名資料庫的IP位址,而在端口、使用者名密碼、連接配接池配置等屬性沿用了abstractServer的配置。
      server1拓展了abstractServer的ipAddress屬性。
      這一段其實并不需要配置,并不會影響到基本使用。以下大緻介紹下此配置的含義:multiPool是一個虛拟的資料庫節點,可以将這個節點配置成好幾台資料庫組成的資料庫池。比如上面這個配置中僅配置了一台server1,負載均衡政策為ROUNDROBIN(輪詢)。與虛拟資料庫節點相關的詳細教程會在後面的章節中介紹。
      由此,你大概可以了解定義abstractServer的原因:當我們有一個資料庫叢集需要管理,這個資料庫叢集中節點的大部分資訊可能是相同的,比如:端口号、使用者名、密碼等等。是以通過歸納這些共性定義出的abstractServer極大地簡化了dbServers配置檔案:
  2. Example 1.2. 一個利用定義抽象節點配置叢集的例子
<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

 <dbServer name="abstractServerForBilling" 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>
   <property name="port">3306</property>
   <property name="schema">test</property>
   <property name="user">root</property>
   <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="billing1"  parent="abstractServer">
  <factoryConfig>
   <!-- mysql ip -->
   <property name="ipAddress">192.168.0.1</property>
  </factoryConfig>
 </dbServer>

 <dbServer name="billing2"  parent="abstractServer">
  <factoryConfig>
   <!-- mysql ip -->
   <property name="ipAddress">192.168.0.2</property>
  </factoryConfig>
 </dbServer>
......
</amoeba:dbServers>
           
  1. 再配置完dbServer.xml後,繼續配置amoeba.xml檔案:

    Example 1.3. 一個基本的amoeba.xml例子