萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> Amoeba:開源的分布式數據庫Porxy解決方案

Amoeba:開源的分布式數據庫Porxy解決方案

Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。

基於此可以實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。
Amoeba相當於一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實現它們。用戶需要結合使用MySQL的 Replication等機制來實現副本同步等功能。amoeba對底層數據庫連接管理和路由實現也采用了可插撥的機制,第三方可以開發更高級的策略類來替代作者的實現。這個程序總體上比較符合KISS原則的思想。

 

什麼是Amoeba?

 

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

 


  • 降低 數據切分帶來的復雜多數據庫結構

  • 提供切分規則並降低 數據切分規則 給應用帶來的影響

  • 降低 db 與客戶端的連接數

  • 讀寫分離

 

為什麼要使用Amoeba

 

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

 

分布式數據庫代理的相關概念

 

Amoeba在分布式數據庫領域將致力解決數據切分,應付客戶端“集中式”處理分布式數據。這裡集中式是一個相對概念,客戶端不需要知道某種數據的物理存儲地。避免這種邏輯出現在業務端, 大大簡化了客戶端操作分布式數據的復雜程度。分布式數據庫系統的優點:

 


  • 降低費用。分布式數據庫在地理上可以式分布的。其系統的結構符合這種分布的要求。允許用 戶在自己的本地錄用、查詢、維護等操作,實行局部控制,降低通信代價,避免集中式需要更高要求 的硬件設備。而且分布式數據庫在單台機器上面數據量較少,其響應速度明顯提升。

  • 提高系統整體可用性。避免了因為單台數據庫的故障而造成全部癱瘓的後果。

  • 易於擴展處理能力和系統規模。分布式數據庫系統的結構可以很容易地擴展系統,在分布式數 據庫中增加一個新的節點,不影響現有系統的正常運行。這種方式比擴大集中式系統要靈活經濟。在 集中式系統中擴大系統和系統升級,由於有硬件不兼容和軟件改變困難等缺點,升級的代價常常是昂貴和不可行的。

 

Amoeba相關產品及其介紹

 

1、Amoeba for MySQL

 

Amoeba for MySQL致力於MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當query 路由功能,專注分布式數據庫proxy開發。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、Query過濾、讀寫分離、可路由相關的query到目標數據庫、可並發請求多台數據庫合並結果。 在Amoeba上面你能夠完成多數據源的高可用、負載均衡、數據切片的功能。目前在很多企業的生產線上面使用。Amoeba for mysql對客戶端程序來說,它是一個虛擬的mysql,對外提供mysql協議。客戶端連接amoeba就象連接mysql一樣。在amoeba內部需要配置相關的認證屬性。

 

amoeba-for-mysql

 

2、Amoeba for Aladdin

 

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

 

amoeba-for-aladdin

 

3、Amoeba for MongoDB

 

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

 

比較Amoeba及其類似產品

 

1、Amoeba for Mysql 與MySQL Proxy比較

 

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

 

2、Amoeba for mongoDB與mongos比較

 

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

 

Amoeba不能做什麼?

 


  • 目前還不支持事務

  • 暫時不支持存儲過程(近期會支持)

  • 不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(比如一次請求返回10w以上甚至更多數據的場合)

  • 暫時不支持分庫分表,amoeba目前只做到分數據庫實例,每個被切分的節點需要保持庫表結構一致

 

Amoeba的架構

 

Amoeba 作為DataBase Proxy的開發框架。致力於解決數據切分、讀寫分離。以下將為您介紹Amoeba 框架

 


  • Built on Java NIO

    • NIO 框架采用無阻塞模式,不像傳統的Socket編程在大量並發的情況非常浪費系統資源、而且可擴展性也較差

  • Reusable Server Connection

    • Amoeba 提供與數據庫連接的可重用度非常高,在Amoeba系統內所有Database Connection同時共享給所有連接到Amoeba的客戶端

  • 提供讀寫分離、數據切分

    • 傳統的讀寫分離技術需要通過客戶端或者相關的Database Driver技術才能解決,而且客戶端的配置也比較復雜

    • 單台Database 性能總是有限制的,基於Amoeba上面可以尋找一種可線性擴展的多數據支持。Amoeba為DBA提供一種非常友好的類似SQL語法的數據切分規則。
      同時客戶端不用擔心過多的DataBase Server會給應用帶來更多的配置。

  • 支持高可用性、負責均衡

    • Amoeba 提供Database 連接的異常檢測與連接恢復功能。

    • 用戶可節省使用其他昂貴的負載均衡的硬件設備,Amoeba提供多台Database Server負載均衡策略(輪詢、當前活動連接數量)。

  • Amoeba Sequence

 

amoeba
copyright © 萬盛學電腦網 all rights reserved