介绍Amoeba
一. 介紹Amoeba
1. Amoeba是什么?
Amoeba(變形蟲)項目,該開源框架于2008年 開始發(fā)布一款 Amoeba for Mysql軟件。這個軟件致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要在應(yīng)用層訪問MySQL的 時候充當SQL路由功能,專注于分布式數(shù)據(jù)庫代理層(Database Proxy)開發(fā)。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關(guān)的到目標數(shù)據(jù)庫、可并發(fā)請求多臺數(shù)據(jù)庫合并結(jié)果。 通過Amoeba你能夠完成多數(shù)據(jù)源的高可用、負載均衡、數(shù)據(jù)切片的功能,目前Amoeba已在很多 企業(yè)的生產(chǎn)線上面使用。
2. 為何要使用Amoeba?
隨著傳統(tǒng)的數(shù)據(jù)庫技術(shù)日趨成熟、計算機網(wǎng)絡(luò)技術(shù)的飛速發(fā)展和應(yīng)用范圍的擴充,數(shù)據(jù)庫應(yīng)用 已經(jīng)普遍建立于計算機網(wǎng)絡(luò)之上。這時集中式數(shù)據(jù)庫系統(tǒng)表現(xiàn)出它的不足:集中式處理,勢必造成性 能瓶頸;應(yīng)用程序集中在一臺計算機上運行,一旦該計算機發(fā)生故障,則整個系統(tǒng)受到影響,可靠性 不高;集中式處理引起系統(tǒng)的規(guī)模和配置都不夠靈活,系統(tǒng)的可擴充性差。在這種形勢下,集中式數(shù) 據(jù)庫將向分布式數(shù)據(jù)庫發(fā)展。而Amoeba的透明、簡易配置及多個優(yōu)點使其成為分布式數(shù)據(jù)庫代理產(chǎn)品中的優(yōu)秀選擇。
3. 分布式數(shù)據(jù)庫代理的相關(guān)概念
Amoeba在分布式數(shù)據(jù)庫領(lǐng)域?qū)⒅铝鉀Q數(shù)據(jù)切分,應(yīng)付客戶端“集中式”處理分布式數(shù)據(jù)。這 里集中式是一個相對概念,客戶端不需要知道某種數(shù)據(jù)的物理存儲地。避免這種邏輯出現(xiàn)在業(yè)務(wù)端, 大大簡化了客戶端操作分布式數(shù)據(jù)的復雜程度。
分布式數(shù)據(jù)庫系統(tǒng)的優(yōu)點:
- 降低費用。分布式數(shù)據(jù)庫在地理上可以式分布的。其系統(tǒng)的結(jié)構(gòu)符合這種分布的要求。允許用 戶在自己的本地錄用、查詢、維護等操作,實行局部控制,降低通信代價,避免集中式需要更高要求 的硬件設(shè)備。而且分布式數(shù)據(jù)庫在單臺機器上面數(shù)據(jù)量較少,其響應(yīng)速度明顯提升。
- 提高系統(tǒng)整體可用性。避免了因為單臺數(shù)據(jù)庫的故障而造成全部癱瘓的后果。
- 易于擴展處理能力和系統(tǒng)規(guī)模。分布式數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)可以很容易地擴展系統(tǒng),在分布式數(shù) 據(jù)庫中增加一個新的節(jié)點,不影響現(xiàn)有系統(tǒng)的正常運行。這種方式比擴大集中式系統(tǒng)要靈活經(jīng)濟。在 集中式系統(tǒng)中擴大系統(tǒng)和系統(tǒng)升級,由于有硬件不兼容和軟件改變困難等缺點,升級的代價常常是昂貴和不可行的。
4. Amoeba相關(guān)產(chǎn)品及其介紹
-
Amoeba for MySQL
Amoeba for MySQL致力于MySQL的分布式數(shù)據(jù)庫前端代理層,它主要在應(yīng)用層訪問MySQL的時候充當query 路由功能,專注 分布式數(shù)據(jù)庫 proxy 開發(fā)。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、Query過濾、讀寫分離、可路由相關(guān)的query到目標數(shù)據(jù)庫、可并發(fā)請求多臺數(shù)據(jù)庫合并結(jié)果。 在Amoeba上面你能夠完成多數(shù)據(jù)源的高可用、負載均衡、數(shù)據(jù)切片的功能。目前在很多企業(yè)的生產(chǎn)線上面使用。
那么Amoeba for mysql 對客戶端程序來說是什么呢? 我們就當它是mysql吧,它是一個虛擬的mysql,對外提供mysql協(xié)議。客戶端連接amoeba就象連接mysql一樣。在amoeba內(nèi)部需要配置相關(guān)的認證屬性。具體請參閱后面的章節(jié)。?
-
Amoeba for Aladdin
與Amoeba for MySQL 類似,客戶端連接Aladdin必須用MySQL 協(xié)議,之所以用MySQL協(xié)議,主要是想借助mysql使用的廣泛程度以及對各種開發(fā)語言的支持。Aladdin后端可以同時連接各種數(shù)據(jù)庫。只要這些數(shù)據(jù)庫提供jdbc驅(qū)動。aladdin的出現(xiàn)可以解決企業(yè)在數(shù)據(jù)庫整合上面提供積極的幫助。使用者不需要知道后端到底使用了什么類型的數(shù)據(jù)庫、數(shù)據(jù)庫的物理地址什么,這些由aladdin來分析sql語句,并且獲得相應(yīng)的要查詢的表跟條件,然后由這些規(guī)則結(jié)合這些條件進行路由到相關(guān)的物理數(shù)據(jù)庫。
-
Amoeba for MongoDB
隨著NoSQL的日益興起,mongoDB作為一款nosql數(shù)據(jù)庫以其優(yōu)異的性能得到了廣泛的關(guān)注。可以說,mongoDB填補了傳統(tǒng)關(guān)系型數(shù)據(jù)庫以及傳統(tǒng)鍵值型數(shù)據(jù)庫的空白,并且兼具兩者優(yōu)秀特質(zhì)。Amoeba for MongoDB將提供與Amoeba for MySQL類似的,完全自主、可控的切分方式、并嘗試完成同樣的auto sharding的功能。 基于Amoeba框架,跟以往的產(chǎn)品一樣具備心跳檢測、負載均衡、故障轉(zhuǎn)移、查詢聚合等功能,保留了之前的配置方式,只要熟悉amoeba其中一款產(chǎn)品的配置,那么上手將非常容易的。
5. 比較Amoeba及其類似產(chǎn)品
-
Amoeba for Mysql 與MySQL Proxy比較
在MySQL proxy 6.0版本 上面如果想要讀寫分離并且 讀集群、寫集群 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現(xiàn)成的 lua腳本。mysql proxy根本沒有配置文件, lua腳本就是它的全部,當然lua是相當方便的。那么同樣這種東西需要編寫大量的腳本才能完成一 個復雜的配置。而Amoeba for Mysql只需要進行相關(guān)的配置就可以滿足需求。
-
Amoeba for mongoDB與mongos比較
mongodb中的數(shù)據(jù)切分有一個chunk的概念,每個chunk代表一個數(shù)據(jù)段(range),當一個chunk的大小到達了指定的數(shù)據(jù)大小,就會自動切分成兩個。 Mongos是根據(jù)數(shù)據(jù)段(chunk)進行切分的,且切分依據(jù)的字段必須是一個key。而目前大多的應(yīng)用中,id(尤其是用戶ID)是無序化的,可能有些用戶是手機號、有些是會員卡號等等。這使得proxy的range切分難以實施。 因此,雖然mongodb的mongos提供了automatic sharding的功能,但由于數(shù)據(jù)切分的不可控,常常不能滿足我們的需要。 Amoeba for MongoDB提供完全自主、可控的切分方式。
6. Amoeba不能做什么?
- 目前還不支持事務(wù)
- 暫時不支持存儲過程(近期會支持)
- 不適合從amoeba導數(shù)據(jù)的場景或者對大數(shù)據(jù)量查詢的query并不合適(比如一次請求返回10w以上甚至更多數(shù)據(jù)的場合)
- 暫時不支持分庫分表,amoeba目前只做到分數(shù)據(jù)庫實例,每個被切分的節(jié)點需要保持庫表結(jié)構(gòu)一致
二. 安裝和運行Amoeba
1. 驗證Java安裝
Amoeba框架是基于Java SE1.6開發(fā)的,建議使用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經(jīng)驗證在JavaTM?SE 1.5和Java SE 1.6能正常運行,(可能包括其他未經(jīng)驗證的版本)。
如果你的機器上沒有安裝JavaTM環(huán)境,可以訪問http://www.oracle.com/technetwork/java/javase/downloads/index.html進行下載??梢愿鶕?jù)你的操作系統(tǒng)等詳情安裝JavaTM環(huán)境。
2. 下載Amoeba
你可以在Amoeba在SourceForge的主頁下載Amoeba,http://sourceforge.net/projects/amoeba/files/。
當你下載的時候,請確保選擇Amoeba的最新版本。Amoeba目前有三個開源產(chǎn)品,分別是適用于擁有JDBC Driver的數(shù)據(jù)庫的Amoeba for Aladdin、適用于MySQL數(shù)據(jù)庫的Amoeba for MySQL以及適用于mongoDB數(shù)據(jù)庫的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
不同操作系統(tǒng)因其實現(xiàn)不同而有較大差異,以下小節(jié)概括了在常見系統(tǒng)中安裝Amoeba的最佳實踐。
以下的安裝過程僅僅以Amoeba for MySQL作為例子,Amoeba for Aladdin和Amoeba for MongoDB的安裝方式是類似的。
-
在Microsoft Windows上安裝Amoeba
你可以從http://sourceforge.net/projects/amoeba/files/下載Amoeba的最新版本。找個地方存放它,并解壓到你需要安裝的位置。這里假設(shè)你將存檔文件解壓到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系統(tǒng)上安裝的過程類似,下載后存放并解壓到安裝的位置。這里假設(shè)你將存檔文件解壓到/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節(jié)。
-
在FreeBSD或OpenBSD上安裝Amoeba
參照第3.2節(jié)。
4. 驗證Amoeba的安裝
安裝完成后,你可以通過命令確定Amoeba是否成功安裝。$ amoeba
amoeba start|stop
請按任意鍵繼續(xù). . .
三. Amoeba入門
1. 通過Amoeba對一個數(shù)據(jù)庫實例進行操作
本小節(jié)的主要目的是幫助你在修改最少配置并且僅僅有最少資源的情況下,快速的搭建起一個可用的,通過Amoeba連接的數(shù)據(jù)庫。本節(jié)并不會講述Amoeba的一些更實用的功能(比如分片等等)但相信這節(jié)會給你一個極大的使用Amoeba的信心,你會發(fā)現(xiàn)Amoeba的使用比想象的簡單地多。
2. 校驗amoeba的運行狀態(tài)
根據(jù)上一章文檔,相信你應(yīng)該已經(jīng)配置完成了Amoeba的環(huán)境。執(zhí)行以下命令:$ $AMOEBA_HOME/bin/amoeba
amoeba start|stop
請按任意鍵繼續(xù). . .當出現(xiàn)如上提示,表示Amoeba可以正常啟動。
3. 驗證數(shù)據(jù)庫是否可以正常連接
要通過Amoeba來連接數(shù)據(jù)庫首先數(shù)據(jù)庫需要正常對外提供服務(wù),根據(jù)不同的數(shù)據(jù)庫類型按以下方式進行驗證。
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服務(wù)的端口號。 |
通過以上命令你可以驗證MySQL的正常對外服務(wù)。
Caution
需要注意的是,以上命令需要在Amoeba所在的機器執(zhí)行。因為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登錄命令的示例,其中的主機地址以及端口號需根據(jù)你的實際情況。 |
Caution
需要注意的是,以上命令需要在Amoeba所在的機器執(zhí)行。因為iptables等配置很容易使得Amoeba無法訪問mongoDB。
4. 配置Amoeba
在這一節(jié)主要包含對Amoeba進行最基本的配置使得你可以通過Amoeba對一臺數(shù)據(jù)庫進行操作,當然借由這個機會本節(jié)也將對Amoeba的配置文件梗概性地介紹。
Amoeba基礎(chǔ)配置介紹
Amoeba有哪些主要的配置文件?
- 想象Amoeba作為數(shù)據(jù)庫代理層,它一定會和很多數(shù)據(jù)庫保持通信,因此它必須知道由它代理的數(shù)據(jù)庫如何連接,比如最基礎(chǔ)的:主機IP、端口、Amoeba使用的用戶名和密碼等等。這些信息存儲在$AMOEBA_HOME/conf/dbServers.xml中。
- Amoeba為了完成數(shù)據(jù)切分提供了完善的切分規(guī)則配置,為了了解如何分片數(shù)據(jù)、如何將數(shù)據(jù)庫返回的數(shù)據(jù)整合,它必須知道切分規(guī)則。與切分規(guī)則相關(guān)的信息存儲在$AMOEBA_HOME/conf/rule.xml中。
- 當我們書寫SQL來操作數(shù)據(jù)庫的時候,常常會用到很多不同的數(shù)據(jù)庫函數(shù),比如:UNIX_TIMESTAMP()、SYSDATE()等等。這些函數(shù)如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函數(shù)名和函數(shù)處理的關(guān)系。
- 對$AMOEBA_HOME/conf/rule.xml進行配置時,會用到一些我們自己定義的函數(shù),比如我們需要對用戶ID求HASH值來切分數(shù)據(jù),這些函數(shù)在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定義。
- Amoeba可以制定一些可訪問以及拒絕訪問的主機IP地址,這部分配置在$AMOEBA_HOME/conf/access_list.conf中
- Amoeba允許用戶配置輸出日志級別以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。
配置一個DB節(jié)點
以下是配置一個DB節(jié)點,使用Amoeba做操作轉(zhuǎn)發(fā)的步驟:
Example?1.1.?簡單的DB節(jié)點配置 <?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 factoryConfigsuch 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>
| ? | 這份dbServers配置文件中,我們定義了三個dbServer元素,這是第一個dbServer元素的定義。這個名為abstractServer的dbServer,其abstractive屬性為true,這意味著這是一個抽象的dbServer定義,可以由其他dbServer定義拓展。 |
| ? | 在第一個dbServer元素分別定義MySQL的端口號、數(shù)據(jù)庫名、用戶名以及密碼。 |
| ? | manager定義了該dbServer選擇的連接管理器(ConnectionManager),這里引用了amoeba.xml的配置,稍后介紹。 |
| ? | dbServer下有poolConfig的元素,這個元素的屬性主要配置了與數(shù)據(jù)庫的連接池,與此相關(guān)的具體配置會在后面的章節(jié)中詳細介紹。 |
| ? | 命名為server1的dbServer元素,正如你設(shè)想的那樣,這個server1是abstractServer的拓展,parent屬性配置了拓展的抽象dbServer,它拓展了abstractServer的ipAddress屬性來指名數(shù)據(jù)庫的IP地址,而在端口、用戶名密碼、連接池配置等屬性沿用了abstractServer的配置。 |
| ? | server1拓展了abstractServer的ipAddress屬性。 |
| ? | 這一段其實并不需要配置,并不會影響到基本使用。以下大致介紹下此配置的含義:multiPool是一個虛擬的數(shù)據(jù)庫節(jié)點,可以將這個節(jié)點配置成好幾臺數(shù)據(jù)庫組成的數(shù)據(jù)庫池。比如上面這個配置中僅配置了一臺server1,負載均衡策略為ROUNDROBIN(輪詢)。與虛擬數(shù)據(jù)庫節(jié)點相關(guān)的詳細教程會在后面的章節(jié)中介紹。 |
由此,你大概可以理解定義abstractServer的原因:當我們有一個數(shù)據(jù)庫集群需要管理,這個數(shù)據(jù)庫集群中節(jié)點的大部分信息可能是相同的,比如:端口號、用戶名、密碼等等。因此通過歸納這些共性定義出的abstractServer極大地簡化了dbServers配置文件:
Example?1.3.?一個基本的amoeba.xml例子
總結(jié)
- 上一篇: 高效的word转换成pdf转换器
- 下一篇: C# MemcachedHelper 帮