標籤:mysql fabric shard ha global group
Oracle在今年5月推出了一套為各方寄予厚望的MySQL產品 -- MySQL Fabric,從字面上不太能看出它是啥,但是從名稱上還是有跡可循的。fabric是“織物”的意思,這意味著它是用來“織”起一片MySQL資料庫。MySQL Fabric是一套資料庫伺服器場(Database Server Farm)的架構管理系統。
MySQL Fabric是什嗎?MySQL Fabric能“組織”多個MySQL資料庫,是應用系統將大於幾TB的表分散到多個資料庫,即資料分區(Data Shard)。在同一個分區內又可以含有多個資料庫,並且由Fabric
自動挑選一個適合的作為主要資料庫,其他的資料庫配置成從資料庫,來做主從複製。在主要資料庫掛掉時,從各個從資料庫中挑選一個提升為主要資料庫。之後,其他的從資料庫轉向新的主要資料庫複製新的資料。注意:這裡說的“自動”是指由MySQL Fabric在後台完成,而不需要使用者手動更改配置。最重要的是,MySQL Fabric是GPL的開源軟體,也就是在符合GPL的規範下,你可以自由的使用和修改這個軟體。MySQL Fabric要解決的問題為什麼做資料分區?當你的應用需要處理的表大於1TB的資料時,Data Shard常常是必須的。這麼大的表,無論在查詢、更新的效率上,或者是備份、更改結構所需要的時間上,都會造成很大的問題。然而當你將這麼大的表分散到多個資料庫伺服器上,又會使每一台資料庫服務器都有可能是單個故障點。只要有一台掛掉就會使整個系統的操作發生問題。另一方面,應用端的程式也會因為每個查詢都要依其查詢條件(where子句的內容)分別指向不同的資料庫而變得更加複雜。再者,當資料分區的結構改變時(例如增加一個資料庫),會使應用端的所有程式都必須修改,從而導致維護變得極為複雜。為瞭解決應用程式複雜度增加的問題,有人在應用程式和資料庫伺服器之間增加一個代理(proxy)或者成為switch,應用程式所有對資料庫的指令先送到proxy,再由proxy判斷要轉到哪個資料庫。就是這個方案的。這也許可以解決應用程序難以維護的問題,但是當應用端的數量增加,資料庫分區增加,或者系統壓力增加時,這個switch會成為容量及性能的瓶頸和單點故障(當它宕掉時,應用端找不到資料庫),而且所有的資料庫指令均需要傳兩次(先到switch再到資料庫)。每個查詢都會造成額外的負荷。 MySQL Fabric的架構
MySQL Fabric採用不用的做法,其架構如所示。主要的特點是把switch合并到各應用端的connector中,以解決單一switch的單點故障和效能瓶頸。
MySQL Fabric由三個部分構成:
1.MySQL Fabric管理節點:
是一個python指令碼,是整個架構的核心。MySQL Fabric管理節點主要的功能是管理整個資料庫伺服器場(Database Server Farm),它啟動時會找/etc/mysql/fabric.cnf這個設定檔,由它指定fabric背後當成存放Server Farm架構和配置之repository的MySQL資料庫位置、連接埠和串連帳號等資訊。Fabric在初始化時(執行mysqlfabric manage setup命令),會在MySQL資料庫上開一個schema(通常是名稱為fabric的database),存放Server Farm的配置相關資訊,如哪些伺服器組由哪些資料庫構成,各伺服器組中的主從伺服器分別是哪些,等等。MySQL Fabric節點在設定配置時,會對Server Farm中各資料庫下達建立主從複製的命令(的紅色線條)。在正常運行時定期ping各組的主伺服器 ,當發現主要資料庫沒有正常運行時,它會啟動容錯移轉程式,在該server farm的從資料庫中找一個合適的提升為主伺服器。其他的從資料庫則轉向新的主要資料庫繼續複製資料。
2. 資料庫伺服器場(database server farm)這是整個架構中的工作引擎,在傳統的資料庫應用中這是單一的MySQL資料庫,MySQL Fabric則是以多個資料庫支援大資料量表(TB級以上)和高可用性資料庫的需求。這些資料庫分成幾個高可用組(HA Group),每個組包含一個以上的資料庫伺服器,中最下面的幾個灰色和淺藍色的方塊代表高可用組。如果高可用組中有多個資料庫,MySQL Fabric會挑選(使用命令mysqlfabric group promote命令)一個提升為主要資料庫(Master),其他資料庫則成為從資料庫(Slave),從資料庫複寫主要資料庫的變化,完成設定同一高可用組內的主從複製。以後,Fabric會定期件事這個主要資料庫。當主要資料宕掉之後,Fabric會從高可用組內挑選一個提升為主要資料庫,其他的資料庫會轉向這個新的主要資料庫繼續複製。另一方面,MySQL Fabric也會只是應用端的conector對這些主從資料庫做讀寫分離,當應用程式對資料庫做讀寫兼有的操作時,connector會將該指令提交給主要資料庫。如果應用程式只會對資料庫進行讀操作,且連線的read_only參數設定為“ON”,則所有的查詢均輪流傳送到這幾個資料庫。藉助讀寫分離,應用系統的資料處理能力得以增加。此外,如前面所述,MySQL Fabric還能處理需要拆分到多個資料庫伺服器的表(sharding tables),每一個高可用組都可能存放shard table的部分資料。應用端的connector會將對shard table的指令依MySQL Fabric的管理節點的設定送到不同的高可用組,這樣可使資料庫的容量隨著高可用組的數量增加而增長。同時,對非拆分的表所下的指令和所有的DDL會由connector送到全域高可用組(global group),全域高可用組的主要資料庫被MySQL Fabric設定為其他高可用組的主要資料庫。所有存拆分表的高可用組的主要資料庫複製global group的變化,這麼一來其他高可用組都有一份非拆分表的資料。從而使得SQL中拆分表對非拆分表的JOIN操作變得更簡單。
3. Connector應用系統在運行時,每個SQL指令都會經由connector發送到資料庫。MySQL Fabric所搭配的connector和一般使用單機的MySQL資料庫一樣,只是在較新版的connector是fabric aware connector多了一些能處理資料庫伺服器場(database server farm)的功能。使他們能在建立資料庫連接時,以XML-RPC協議檢查MySQL Fabric的管理節點中server farm的配置,然後通過該串連下的查詢可依fabric的指示送到適合的資料庫。如此一來,常見的database shard方案中可能造成效能瓶頸的proxy放到connector中,從而解決了這個問題。目前MySQL Fabric支援的技術有java、python、PHP,即Connector/J、Connector/Python和Connector/PHP都是Fabric-aware。以java為例,JDBC driver必須是Connector/J 5.1.30以後的版本,Fabric的Java程式和一般對單機MySQL的查詢的Java程式差不多,只是在建立database connection object時database connection URL不是指向資料庫,改為指向MySQL Fabric管理節點(伺服器的IP和連接埠通常是32274)。當查詢的表時全域表(不做table shard)或DDL(例如建表或改表結構)時,建立connection object的要加上‘‘fabricServerGroup="參數,之後通過這個connection object所下的SQL指令會送到Global Group的主要資料庫,再由資料庫複寫到其他的高可用組(shard)中。如果SQL命令所要操作的表時分區表(shard table),則建立connection object時要在參數加上‘‘fabricShardTable="參數,之後通過這個connection object所下的SQL命令會根據MySQL Fabric所設定的分表(shard)原則送到各分區(shard)的高可用組。這樣一來,應用程式對這些shard table下的SQL指令時,不需要在SQL中判斷要送到哪個資料庫,完全由connector在建立資料庫連接時向MySQL Fabric所查到的server farm的配置資訊(哪個資料庫屬於哪個shard group,各shard table的拆分原則等)所決定。而且這個配置在建立主串連後就緩衝在Connector所在的應用端。這樣,在每次下SQL指令時就不需要重複查詢MySQL Fabric管理節點,而依存於應用端的分表配置直接送到正確的資料庫。而應用程式的效率不會因為做了表的拆分而有任何降低。
結語
MySQL Fabric推出正式發行版才兩個多月,已經引起許多重量級MySQL使用者的注意和使用。而Oracle也不吝於加大對它的投資,以加速其功能更加完善。現在已推出一個更新版,在最新版的MySQL Fabric加上了對SSL串連的支援,近期內對Fabric改良的重點將著重於使Fabric對應用程式更加透明化(例如單一SQL對shard table的查詢條件可以跨shard)、支援更多的高可用方案、提供更加有好易用的GUI等。在此建議關心MySQL發展的朋友可以留意這個產品的發展,進一步試用它。將能的意見和心得反映給Oracle,如果您滿意它所提供的功能和穩定性,可以將它加入您的投產系統正式營運,Fabric的Team Dev會很歡迎大家對這個MySQL家族的新成員所做的任何貢獻。本文的目的是介紹MySQL Fabric要解決的問題和Fabric的架構,至於詳細的設定和操作,請容我在下一篇文章中以一個樣本和各位分享,敬請期待。
MySQL Fabric概述