楊志宇
摘要:分布式數據庫在性能、擴展性和可用性上有許多優(yōu)點,構建分布式數據庫要解決數據一致、位置透明和負載均衡等問題。針對構建分布式MySQL數據庫系統(tǒng)的應用場景,利用MySQL復制構建了一主多從的數據庫集群,提供了解決主從數據一致的方法,設計了一種基于Ice的分布式數據庫中間件,實現(xiàn)了數據庫訪問服務的位置透明,利用IceGrid特性實現(xiàn)了數據庫訪問的負載均衡,具有良好的擴展性和可用性,提高了開發(fā)效率。
關鍵詞:Ice;中間件;分布式數據庫;MySQL
中圖分類號:TP392 文獻標識碼:A 文章編號:1009-3044(2016)11-0012-03
Abstract: Distributed database system has many advantages on the performance, scalability and availability, while it also has problems such as data consistency, location transparency and load balancing to be solved. A middleware which based on ICE has been designed, using IceGrid features for database access load balancing and distribution services and using MySQL replication mechanism for data consistency. The distributed database cluster within one-master-multi-slave architect and Ice middleware implemented the location transparency and load balancing. The experimental data shows that, the distributed database architecture has good scalability and availability, significantly improved the development efficiency.
Key words: Ice; middleware; distributed database; MySQL
隨著互聯(lián)網業(yè)務的不斷增長,傳統(tǒng)的集中式數據庫難以滿足企業(yè)級應用的需求。首先,在讀寫流量增長到一定水平時,集中式數據庫會產生性能瓶頸問題;其次,集中式數據庫部署在一臺服務器上,一旦該服務器發(fā)生故障,則整個系統(tǒng)不可用;再次,集中式數據庫的規(guī)模和配置都不夠靈活,難以應對頻繁的業(yè)務變動。
因此,為解決集中式數據庫難以滿足的需求,分布式數據庫的應用越發(fā)重要。分布式數據庫是指使用多臺服務器共同提供數據存儲、查詢服務的數據庫系統(tǒng)。相比集中式數據庫,分布式數據庫有以下優(yōu)點:1)分布式數據庫能夠滿足更高的性能要求。2)分布式數據庫有更高的可靠性,分布式數據庫將數據分布在不同的機器上,同時有冗余存儲,可以有效避免單節(jié)點故障,提高系統(tǒng)可靠性。3)分布式數據庫具有良好的可擴展性,可以根據業(yè)務規(guī)模的變化靈活配置,使系統(tǒng)維持在高效率狀態(tài)。
分布式數據庫可以將數據分片,然后保存在不同的節(jié)點上,每個節(jié)點的數據不完全一致;數據也可以不分片,即每個節(jié)點都擁有完整的數據集,節(jié)點之間數據一致。對于各節(jié)點數據不完全一致的系統(tǒng),需要管理數據與節(jié)點的對應關系。無論數據是否分片存儲,只要存在冗余,就需要解決數據一致的問題。
分布式數據庫通常通過復制實現(xiàn)數據更新,將數據從一臺主服務器拷貝至一臺或多臺從服務器上。由于復制是異步的,主從數據庫在一定的時間段內存在同步延遲,分布式數據庫在處理讀請求時必須保證主從數據庫的數據一致。針對這一問題,本文以MySQL數據庫為例,提出合理化的解決方案。
同時,分布式數據庫的實現(xiàn)還要解決位置透明性和負載均衡的問題:分布式數據庫應作為一個整體為客戶端提供統(tǒng)一的接口,即數據存儲的物理位置對客戶端是透明的;分布式數據庫內部應該將讀寫操作合理地分配給各服務器,以提高整體效率。在分布式數據庫的實際應用中,通常通過使用數據庫中間件的方式來解決這兩個問題,本文采用ICE中間件實現(xiàn)分布式數據庫。
本文的結構如下:第1章介紹目前已有的分布式數據庫中間件,比較幾種中間件開發(fā)的平臺;第2章針對構建分布式MySQL數據庫,提供了保持主從數據一致的解決方法;第3章介紹了Ice中間件平臺的基本概念和特性;第四章詳細介紹如何基于Ice構建一種分布式MySQL數據庫的中間件,使整個數據庫集群能夠實現(xiàn)位置透明和負載均衡;最后,總結這種構建分布式數據庫服務解決方案的特點。
1 相關工作
為了實現(xiàn)高可用的分布式數據庫系統(tǒng),企業(yè)需要選擇合適的DBMS以及數據庫中間件。首先,在DBMS(數據庫管理系統(tǒng))的選擇上,MySQL因為開源和良好的可擴展性,一直是構建分布式數據庫集群的流行解決方案之一。其次,在數據庫中間件的選擇上,有許多為MySQL擴展提供支持的開源項目可以作為參考。Amoeba項目于2008年發(fā)布了Amoeba for MySQL,該中間件在應用層訪問MySQL時充當SQL路由,專注于分布式數據庫代理層開發(fā)。阿里巴巴于2012年正式對外開源了數據庫中間件Cobar。Cobar前身源于Amoeba,在穩(wěn)定性、性能和可靠性上做出了改進。Mycat是另一款源于Cobar的分布式數據庫中間件。
Ice是ZeroC公司提供的一套開源中間件平臺,是目前最流行的分布式應用解決方案之一。在主要的幾種分布式解決方案中,.Net只支持windows平臺,COBRA的實現(xiàn)復雜,學習和實施成本高,WebService在性能和安全性上均有缺陷。Ice源于解決其他中間件的不足,它不僅支持不同的系統(tǒng),如windows、Linux,還支持不同的開發(fā)語言,如C++、Java、Python等。Ice為分布式應用提供了一整套強大的特性和功能支持,如負載均衡、軟件分發(fā)、數據同步等,同時,在性能和安全性方面也十分出色。
因此,本文基于Ice,提供一種構建分布式MySQL數據庫服務的解決方案:基于MySQL搭建一主多從的數據庫集群,同時為解決數據一致性問題提供方案;基于IceGrid的特性開發(fā)數據庫中間件,使客戶端可以通過統(tǒng)一的接口讀寫數據庫集群,實現(xiàn)位置透明,將客戶端請求合理分配到集群內的各個節(jié)點,實現(xiàn)負載均衡。
2 構建分布式MySQL數據庫應用
MySQL支持一臺主服務器同時向多臺從服務器進行復制,利用MySQL復制可以構建一主多從的數據庫集群。MySQL復制的過程如下:
(1) 主庫(master)執(zhí)行更新操作、提交事務(commit)、記錄二進制日志(binlog)、標記事務成功,同時將binlog發(fā)送給從庫(salve);
(2) slave的IO線程接收binlog,轉存至中繼日志(relay log);
(3) slave 的SQL線程讀取relay log,重做更新操作。
在構建企業(yè)級的分布式數據庫應用時,MySQL復制有可能出現(xiàn)同步延時和主從不一致的問題。原因在于, MySQL復制在主庫上執(zhí)行(1)和在從庫上執(zhí)行(3)是異步的。有數據顯示,master的QPS達到1萬左右時,slave重做relay log的QPS只有2000,產生延遲的主要瓶頸在slave重做relog log上。
MySQL為了保證主從一致,提供了半同步復制。使用半同步復制后,master在寫入binlog后,通知所有slave接收該事務,等待至少一個slave寫入relay log并成功刷新到磁盤后,再標記事務成功。這樣master可以保證集群內,至少有一臺slave的數據是和master是一致的。
為了解決主從延遲問題,MySQL5.6開始支持多線程復制,slave上的SQL線程作為協(xié)調者將重做relay log任務分配給多個worker。MySQL5.7開始支持并行復制,一個組提交的事務可以并行回放,大大減少了同步延時。
在構建分布式MySQL數據庫應用時,保證數據庫集群的數據一致的解決方案如下:
(1) 對于MySQL5.7版本的系統(tǒng),使用并行復制;
(2) 對于MySQL5.6版本的系統(tǒng),在復制時使用GTID;
(3) 對實時性要求高的數據在主數據庫上查詢,實時性要求不高的數據在從數據庫上查詢;
(4) 使用半同步復制,使用SSD硬盤等優(yōu)化方法。
3 Ice中間件
Ice是一種構建面向對象的客戶端-服務器應用的中間件開發(fā)平臺。Ice將實現(xiàn)某種功能的應用稱為IceObject,將應用在服務端的實現(xiàn)稱為服務Servant。IceObject與Servant通過Adapter關聯(lián),Adapter包含通信端點等信息,屏蔽了遠程調用過程中的底層通信,即:IceObject包含了業(yè)務實現(xiàn)Servant和通信信息Adapter。客戶端通過服務代理Proxy調用IceObject內的方法。
IceGrid是Ice提供的分布式解決方案,包含文件分發(fā)、負載均衡、快捷部署等功能。一個IceGrid域由一個Registry(注冊表)和任意數量的Node(節(jié)點)構成。Node節(jié)點負責裝載和啟停服務實例,采集node節(jié)點的負載信息等;Registry負責維護各節(jié)點的信息和任務調度,并將這些信息持久化。
利用IceGrid的支持,可以實現(xiàn)分布式數據庫服務的負載均衡。IceGrid創(chuàng)建復制組replica-group,每個replica-group與多個相同的Ice服務實例綁定??蛻舳苏{用服務時,根據一定的策略將服務請求分發(fā)到Ice實例。負載均衡的策略分為4種:1、Random(隨機方式),Registry隨機選擇一個服務實例,不檢查實例的負載。2、Adaptive(自適應方式),Registry從所有實例中選擇一個負載最輕的實例供客戶端調用。3、Round-Robin(最近最少使用方式),Registry返回最近的最少被調用的實例。4、Ordered(順序方式):Registry根據實例優(yōu)先級,從高到低順序選擇一個實例返回。
利用Ice的間接代理,可以實現(xiàn)分布式數據庫服務的位置透明??蛻舳苏{用服務時,不會直接訪問某個服務實例,而是先訪問Register服務。Register記錄所有實例的通信端點,Register按一定的策略將一個可用的服務實例返回給客戶端代理??蛻舳烁鶕egister返回的端點跟遠程服務實例建立連接,實現(xiàn)調用。因此,客戶端在調用數據庫服務時,并不需要知道自己調用的是哪臺服務器上的哪個實例,可以將服務本身作為一個整體使用。
4 基于Ice的分布式MySQL數據庫訪問服務
4.1 服務的總體架構
總體架構如圖1所示:
(1) 數據庫訪問服務客戶端
客戶端首先獲得數據庫訪問服務的代理Proxy,然后通過代理Proxy提供的方法遠程調用數據庫訪問服務。
(2) 數據庫訪問服務
a) 監(jiān)聽客戶端的數據庫訪問請求,連接MySQL數據庫,執(zhí)行查詢或更新操作,將結果集返回客戶端。
b) 維護MySQL連接池,對于同一客戶端的請求,復用數據庫連接,減少建立數據庫連接的次數。
c) 緩存查詢結果,對于重復查詢直接返回查詢結果,提高查詢效率。
根據Ice的Slice語法,定義數據庫訪問服務DBOperator的接口如下:
客戶端通過代理連接數據庫,可以像使用本地方法一樣,使用數據庫訪問服務實例上的方法,進行數據庫操作。數據庫訪問服務實現(xiàn)了MySQL集群的讀寫分離。通過讀配置文件,找到Master數據庫的端口信息,將寫操作(數據庫更新)重新定向到Master節(jié)點所在的數據庫訪問服務上。對于讀操作,則直接訪問本地的MySQL數據庫。同時,在數據庫服務中實現(xiàn)了MySQL連接池和緩存,提高了數據庫訪問服務的性能。
(3) MySQL數據庫
MySQL數據庫被配置為“一主多從”的數據庫集群。主服務器Master負責處理服務端發(fā)來的更新操作,并將更新操作復制到從服務器Slave上;從服務器Slave負責響應服務端實例發(fā)來的查詢操作,重做Master發(fā)來的數據更新,保持主從數據一致。
(4) Node節(jié)點
a) 負責裝載和啟停服務。
b) 負責采集當前Node節(jié)點的負載信息,上報至Register,為負載均衡提供信息。
(5) Register(注冊表)、集群的管理、監(jiān)控和日志等
a) Register負責客戶端請求到服務端實例的路由,按照某種負載均衡策略,為客戶端的數據庫服務代理返回一個可用的服務端實例。
b) Register收集Node節(jié)點上報的負載信息,將負載信息持久化。
c) 監(jiān)控和管理IceGrid域內的每個Node和Server的狀態(tài)。
d) 收集與分析各節(jié)點的日志。
4.2. 服務的處理時序
(1) 客戶端訪問數據庫服務,向register請求獲得數據庫服務的代理Proxy。
(2) Register根據當前負載均衡策略,選擇一個合適的數據庫服務實例,將實例的端點(endpoint)信息返回給客戶端的代理,供業(yè)務模塊調用。
(3) 業(yè)務模塊在獲得代理Proxy后,根據Proxy的接口調用服務實例的數據庫訪問方法,如:建立數據庫連接,執(zhí)行查詢或更新,關閉數據庫連接等。
(4) 數據庫服務實例響應Proxy的請求。如果當前查詢結果在緩存中存在,數據庫服務實例直接返回結果集。否則,服務實例連接MySQL,執(zhí)行查詢或更新操作。
(5) 數據庫服務實例將MySQL的結果集加入緩存,返回給客戶端。
(6) 業(yè)務模塊由代理Proxy得到結果集。
4.3 服務的分布部署
Host1服務器部署Register、MySQL數據庫的Master實例、數據庫服務實例、Node節(jié)點等。Host2上的Registry作為Host1上的主Register的備份,在主Registry失效后工作。Host3是一個典型的處理讀操作的服務節(jié)點。根據業(yè)務量的需求,可以通過增加和Host3一樣的服務器來提高整個分布式數據庫的性能,可以根據服務器的資源,在Host上增加數據庫服務實例。
5 結語
針對構建分布式MySQL數據庫的應用場景,本文提供了一種基于Ice中間件平臺的分布式數據庫服務解決方案,具有以下特點:
(1) 基于MySQL,搭建一主多從的數據庫集群,給出了保證數據一致的解決方案。
(2) 基于Ice跨平臺、跨語言的特性,數據庫服務的客戶端和服務端程序可以使用不同語言實現(xiàn),提高了靈活性和兼容性。
(3) 基于Ice的間接代理和IceGrid提供的動態(tài)配置,數據庫訪問服務可以實現(xiàn)位置透明。
(下轉第16頁)
(上接第14頁)
(4) 基于IceGrid提供的負載均衡策略,使數據庫訪問請求合理分配到各節(jié)點,是一種簡捷高效的分布式數據庫訪問服務的實現(xiàn)手段。
(5) 數據庫訪問服務提供的接口,使開發(fā)人員可以專注于業(yè)務邏輯的實現(xiàn),簡化了數據庫訪問操作。
從系統(tǒng)運行的效果來看,這種分布式MySQL數據庫服務可以適應頻繁的增減設備和業(yè)務邏輯變更,有效提高了開發(fā)效率,降低了維護成本。
參考文獻:
[1]Henning M, Spruiell M. Distributed Programming with Ice[M].2009.
[2]蔣躍軍,郭建康.基于ICE中間件的分布式搜索服務[J].電腦知識與技術,2009,5(22).
[3]張俊軍,章旋.ICE中間件技術及其應用研究[J].計算機與現(xiàn)代化,2012(5):168.
[4]盧罡,徐勤良,許南山,郭俊霞.復雜網絡松耦合分布式計算框架的設計和實現(xiàn)[J].計算機工程,2015,41(11).
[5]丁云亮,谷利澤,楊榆.基于分布式中間件ICE的應用架構研究[J].計算機應用,2009,29(28).
[6]丁東京,周明天.基于ICE的局域網監(jiān)控設計與實現(xiàn)[J].計算機工程與設計,2007,28(10):2466.
[7]吳治輝.ZeroC Ice權威指南[M].北京:電子工業(yè)出版社,2015.6.
[8]張偉麗,江春華,魏勁超.MySQL復制技術的研究及應用[J].計算機科學,2012,39(11A):168.
[9]張飛,姜勁磊,李慶虎.利用MySQL構建分布式應用[J].計算機工程與應用,2001,37(18):102.