談書才 劉青青
基于Replication和LVS的MySQL分布式數(shù)據(jù)庫研究
談書才 劉青青
本文在對分布式數(shù)據(jù)庫研究的基礎(chǔ)上,提出了一種基于Replication和LVS的MySQL分布式數(shù)據(jù)庫實現(xiàn)方案。該方案采用Replication技術(shù)實現(xiàn)兩個數(shù)據(jù)庫之間的雙向數(shù)據(jù)同步,通過LVS和heartbeat實現(xiàn)負載均衡和故障切換,利用數(shù)據(jù)庫合并技術(shù)實現(xiàn)故障恢復,從而構(gòu)建出一個跨網(wǎng)段、可用性高、可自動恢復常見故障的分布式數(shù)據(jù)庫系統(tǒng)。
隨著互聯(lián)網(wǎng)的高速發(fā)展,人們對計算機網(wǎng)絡(luò)的依賴性也越來越高,小到日常生活,大到企業(yè)運營,計算機網(wǎng)絡(luò)已經(jīng)無處不在。與此同時,數(shù)據(jù)庫技術(shù)日趨成熟,數(shù)據(jù)庫應(yīng)用已經(jīng)普遍建立在計算機網(wǎng)絡(luò)之上。因此,各種應(yīng)用的需求對數(shù)據(jù)庫的可用性和分布性提出了更高地要求。傳統(tǒng)的集中式數(shù)據(jù)庫因為通信開銷大,單點故障導致可靠性不高,所以逐漸被地理上分布,不因單臺數(shù)據(jù)庫服務(wù)器而全部癱瘓的分布式數(shù)據(jù)庫所代替。而在各類分布式數(shù)據(jù)庫中MySQL由于其低成本及開源等特性被廣大網(wǎng)站開發(fā)者所熱愛。在TechTarget發(fā)起的2012年中國數(shù)據(jù)管理優(yōu)先度調(diào)查中顯示,有45.5% 的用戶表示愿意遷至MySQL數(shù)據(jù)庫平臺。
基于Amoeba中間件的分布式數(shù)據(jù)庫,集中地響應(yīng)應(yīng)用的請求,并將SQL請求發(fā)送到特定的數(shù)據(jù)庫服務(wù)器上執(zhí)行,從而實現(xiàn)了負載均衡、讀寫分離等功能。但是它只能實現(xiàn)同網(wǎng)段內(nèi)的數(shù)據(jù)庫服務(wù)器的分布式部署,無法跨越互聯(lián)網(wǎng)的不同網(wǎng)段,并且它在下屬數(shù)據(jù)庫節(jié)點異常時,無法自動恢復,需要人工進行處理。
為了解決上述問題,本文提出一種基于Replication和LVS的MySQL分布式數(shù)據(jù)庫實現(xiàn)方案。該方案采用Replication技術(shù)實現(xiàn)兩個跨網(wǎng)段數(shù)據(jù)庫之間的雙向數(shù)據(jù)同步,通過LVS和heartbeat實現(xiàn)負載均衡和故障切換,利用數(shù)據(jù)庫合并技術(shù)實現(xiàn)故障恢復,從而構(gòu)建出一個跨網(wǎng)段、可用性高、可自動恢復常見故障的分布式數(shù)據(jù)庫系統(tǒng)。
MySQL的復制(Replication)技術(shù)是一種能夠讓運行在不同計算機上的兩個或者更多個MySQL服務(wù)器保持同步變化的機制,目前支持“主-從”復制關(guān)系,只有一臺主控系統(tǒng)(可讀/可寫),所有的數(shù)據(jù)修改操作都要在這臺系統(tǒng)上進行;有一臺或多臺從屬系統(tǒng)(只讀),它們有著與主控系統(tǒng)完全一樣的數(shù)據(jù),主控系統(tǒng)上的數(shù)據(jù)變化在經(jīng)過一個短暫的延時后也將發(fā)生在它們身上,并且不要求主控和從屬系統(tǒng)使用同一種操作系統(tǒng)。
Replication是一種異步的復制,從一個MySQL instace(稱之為Master)復制到另一個MySQL instance(稱之Slave)。實現(xiàn)整個復制操作主要是由三個線程完成的,其中兩個線程在Slave(SQL線程和I/0線程),另外一個線程(I/0線程)在Master上。
MySQL數(shù)據(jù)庫系統(tǒng)采用異步復制來保持數(shù)據(jù)的一致性,其復制過程可簡述如下:主服務(wù)器(Master)數(shù)據(jù)更新之后,通知從服務(wù)器(Slave),從服務(wù)器的I/O進程連接到主服務(wù)器(Master),并請求指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容;主服務(wù)器接收到從服務(wù)器I/O進程的請求后,其I/O進程根據(jù)請求信息讀取指定日志的指定位置之后的日志信息,并將其返回給從服務(wù)器的I/O進程。返回信息中除了日志所包含的信息之外,還包括Master端的bin-log文件的名稱以及binlog的位置;從服務(wù)器的I/O進程接收到信息后,將接收到的日志內(nèi)容添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的bin-log的文件名和位置記錄到master-info文件中;從服務(wù)器的sql進程檢測到reday-log中新增加了內(nèi)容后,會馬上解析relay-log的內(nèi)容并執(zhí)行,從而達到服務(wù)器之間的數(shù)據(jù)同步。
LVS的英文全稱是Linux Virtual Server,即Linux虛擬服務(wù)器。它是章文嵩博士主持的一個開源項目。
LVS主要用于多服務(wù)器的負載均衡。它可以實現(xiàn)高性能,高可用的服務(wù)器集群技術(shù)。它廉價,可把許多低性能的服務(wù)器組合在一起形成一個超級服務(wù)器。它易用,配置非常簡單,且有多種負載均衡的算法。它穩(wěn)定可靠,即使在集群的服務(wù)器中某臺服務(wù)器無法正常工作,也不影響整體效果。另外可擴展性也非常好。
LVS工作在網(wǎng)絡(luò)層,相對于其它負載均衡的解決辦法,比如應(yīng)用層負載的調(diào)度等,它的效率更高。LVS的通過控制IP來實現(xiàn)負載均衡。IPVS是其具體的實現(xiàn)模塊。IPVS的主要作用:安裝在Director Server上面,在Director Server虛擬一個對外訪問的IP(VIP)。用戶訪問VIP,到達Director Server,Director Server根據(jù)一定的規(guī)則選擇一個Real Server,處理完成后然后返回給客戶端數(shù)據(jù)。這些步驟產(chǎn)生了一些具體的實現(xiàn)問題,比如如何選擇具體的Real Server,Real Server如何返回給客戶端數(shù)據(jù)等等。IPVS為此有三種機制:VS/NAT(Virtual Server via Network Address Translation),即網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)實現(xiàn)虛擬服務(wù)器;VS/TUN(Virtual Server via IP Tunneling),即IP隧道技術(shù)實現(xiàn)虛擬服務(wù)器;VS/DR(Virtual Server via Direct Routing),即用直接路由技術(shù)實現(xiàn)虛擬服務(wù)器。
本文基于上述Replication和LVS技術(shù)提出了一種MySQL分布式數(shù)據(jù)庫系統(tǒng)的實現(xiàn)方案,如圖1所示。
數(shù)據(jù)節(jié)點1(DB1)和數(shù)據(jù)節(jié)點2(DB2)分別部署在兩個不同網(wǎng)段,通過廣域網(wǎng)相連。DB1和DB2之間通過Replication技術(shù)實現(xiàn)雙向復制。虛擬服務(wù)器1(LVS1)和虛擬服務(wù)器2(LVS2)同樣部署在兩個不同網(wǎng)段,通過廣域網(wǎng)相連。每個虛擬服務(wù)器通過IP隧道技術(shù)與兩個數(shù)據(jù)節(jié)點建立虛擬連接,當一個數(shù)據(jù)節(jié)點故障時,自動切換到另一個數(shù)據(jù)節(jié)點,從而提高數(shù)據(jù)的可用性。用戶1(USER1)部署在DB1所屬網(wǎng)絡(luò)NETWORK1,通過LVS1優(yōu)先訪問DB1;用戶2(USER2)部署在DB2所屬網(wǎng)絡(luò)NETWORK2,通過LVS2優(yōu)先訪問DB2,就近使用本地數(shù)據(jù)節(jié)點,從而提高響應(yīng)速度。
圖1 分布式數(shù)據(jù)庫系統(tǒng)示意圖
Replication技術(shù)實現(xiàn)
首先配置DB1為Master,DB2為Slave,DB2復制DB1的數(shù)據(jù)。然后配置DB2為Master,DB1為Slave,DB1復制DB2的數(shù)據(jù)。DB1配置為只寫入奇數(shù)行數(shù)據(jù),DB2配置為只寫入偶數(shù)行數(shù)據(jù)。配置完成后,無論DB1還是DB2,任意一側(cè)數(shù)據(jù)發(fā)生變動,都能通過Replication技術(shù)復制到對方,從而保證數(shù)據(jù)的一致性,實現(xiàn)兩個跨網(wǎng)段數(shù)據(jù)庫之間的雙向數(shù)據(jù)同步。
LVS技術(shù)實現(xiàn)
本方案為達到負載均衡和故障切換的目的,采用了LVS中的IP隧道技術(shù)(VS/TUN)方式來實現(xiàn)虛擬服務(wù)器。
DB1設(shè)置兩個IP地址(DB1IP1/NETWORK1和DB1IP2/NETWORK1),創(chuàng)建兩個隧道(TUN1/ NETWORK1和TUN2/NETWORK2)分別為兩個虛擬服務(wù)器對外隧道IP地址。DB2設(shè)置兩個IP地址(DB2IP1/ NETWORK2和DB2IP2/NETWORK2),創(chuàng)建兩個隧道(TUN1/NETWORK1和TUN2/NETWORK2)分別為兩個虛擬服務(wù)器對外隧道IP地址。
LVS1創(chuàng)建一個隧道(TUN1/NETWORK1),通過加權(quán)負載均衡算法與DB1IP1和DB2IP1相連,給予同網(wǎng)段DB1IP1較高的權(quán)重值,保證優(yōu)先使用同網(wǎng)段的數(shù)據(jù)庫,提高響應(yīng)速度。LVS2創(chuàng)建一個隧道(TUN2/ NETWORK2),通過加權(quán)負載均衡算法與DB1IP1和DB2IP1相連,給予同網(wǎng)段DB2IP1較高的權(quán)重值,保證優(yōu)先使用同網(wǎng)段的數(shù)據(jù)庫,提高響應(yīng)速度。LVS1和LVS2中都通過heartbeat檢測與兩個數(shù)據(jù)庫之間的數(shù)據(jù)訪問連接狀態(tài),當一個數(shù)據(jù)庫出現(xiàn)異常時,就會自動切換到另一個隧道連接的數(shù)據(jù)庫,從而實現(xiàn)負載均衡和故障切換。
數(shù)據(jù)庫合并技術(shù)實現(xiàn)
本方案采用基于SHELL腳本的數(shù)據(jù)庫合并技術(shù)實現(xiàn)對兩個數(shù)據(jù)庫的監(jiān)控及故障恢復。腳本處理流程如下:
(1)啟動數(shù)據(jù)庫后臺故障檢測守護腳本進程;
(2)設(shè)置兩個數(shù)據(jù)庫的控制IP地址分別為DB1IP2和DB2IP2,設(shè)置兩個數(shù)據(jù)庫的LVS訪問IP地址為DB1IP1和DB2IP1;
(3)根據(jù)預先設(shè)置的故障檢測時間點(一般設(shè)置為用戶對數(shù)據(jù)庫訪問較少的時間點),對兩個數(shù)據(jù)庫的連接狀態(tài)進行檢測,未到檢測時間點守護腳本置于休眠狀態(tài),到達檢測時間點喚醒;
(4)檢測守護腳本所在網(wǎng)絡(luò)和兩個數(shù)據(jù)庫的可通性,如果不通,寫日志報警,守護腳本置于休眠狀態(tài),等待下一個檢測時間點喚醒(這種情況下物理網(wǎng)絡(luò)不通,需要人工干預,保證網(wǎng)絡(luò)暢通,否則無法獲取數(shù)據(jù)庫狀態(tài));
(5)檢測守護腳本所在網(wǎng)絡(luò)和兩個數(shù)據(jù)庫的數(shù)據(jù)庫可訪問性,如果不可訪問,寫日志報警,守護腳本置于休眠狀態(tài),等待下一個檢測時間點喚醒(這種情況下數(shù)據(jù)庫不可訪問,需要人工干預,保證單個節(jié)點數(shù)據(jù)庫運行正常,否則無法獲取數(shù)據(jù)庫的同步狀態(tài));
(6)檢測兩個數(shù)據(jù)庫系統(tǒng)之間的同步狀態(tài),如果正常同步,寫入正常同步日志,守護腳本置于休眠狀態(tài),等待下一個檢測時間點喚醒;如果同步故障,寫入同步故障日志并執(zhí)行后續(xù)步驟;
(7)通過控制IP地址DB1IP2和DB2IP2分別關(guān)閉兩個數(shù)據(jù)庫對LVS的訪問IP地址DB1IP1和DB2IP1,停止兩個數(shù)據(jù)庫之間的同步線程;
(8)通過控制IP地址DB1IP2和DB2IP2將數(shù)據(jù)庫DB2中的數(shù)據(jù)合并到數(shù)據(jù)庫DB1中,然后把數(shù)據(jù)庫DB1中合并后的數(shù)據(jù)復制到數(shù)據(jù)庫DB2中;
(9)重新配置數(shù)據(jù)庫DB1和數(shù)據(jù)庫DB2之間的雙向同步關(guān)系;
(10)重新設(shè)置兩個數(shù)據(jù)庫對外訪問的IP地址DB1IP1和DB2IP1;
(11)寫入同步成功日志,守護腳本置于休眠狀態(tài),等待下一個檢測時間點喚醒。
近年來,數(shù)據(jù)庫技術(shù)已成為廣大學者和專家的研究熱點之一,特別是分布式數(shù)據(jù)庫技術(shù)。在國外,該領(lǐng)域已被研究多年,提出了各種成熟的實現(xiàn)方案,但在國內(nèi)還處于研究階段。本文以應(yīng)用廣泛的Replication技術(shù)實現(xiàn)兩個跨網(wǎng)段數(shù)據(jù)庫之間的雙向數(shù)據(jù)同步,采用LVS和heartbeat實現(xiàn)負載均衡和故障切換,利用數(shù)據(jù)庫合并技術(shù)實現(xiàn)故障恢復。但在研究過程中,也發(fā)現(xiàn)了一些新的問題:比如在網(wǎng)絡(luò)通暢但數(shù)據(jù)庫崩潰情況下,如何自動恢復數(shù)據(jù)庫。這將是將來有待解決的問題。
10.3969/j.issn.1001-8972.2015.10.021