談書才 劉青青
基于Replication和LVS的MySQL分布式數據庫研究
談書才 劉青青
本文在對分布式數據庫研究的基礎上,提出了一種基于Replication和LVS的MySQL分布式數據庫實現方案。該方案采用Replication技術實現兩個數據庫之間的雙向數據同步,通過LVS和heartbeat實現負載均衡和故障切換,利用數據庫合并技術實現故障恢復,從而構建出一個跨網段、可用性高、可自動恢復常見故障的分布式數據庫系統。
隨著互聯網的高速發展,人們對計算機網絡的依賴性也越來越高,小到日常生活,大到企業運營,計算機網絡已經無處不在。與此同時,數據庫技術日趨成熟,數據庫應用已經普遍建立在計算機網絡之上。因此,各種應用的需求對數據庫的可用性和分布性提出了更高地要求。傳統的集中式數據庫因為通信開銷大,單點故障導致可靠性不高,所以逐漸被地理上分布,不因單臺數據庫服務器而全部癱瘓的分布式數據庫所代替。而在各類分布式數據庫中MySQL由于其低成本及開源等特性被廣大網站開發者所熱愛。在TechTarget發起的2012年中國數據管理優先度調查中顯示,有45.5% 的用戶表示愿意遷至MySQL數據庫平臺。
基于Amoeba中間件的分布式數據庫,集中地響應應用的請求,并將SQL請求發送到特定的數據庫服務器上執行,從而實現了負載均衡、讀寫分離等功能。但是它只能實現同網段內的數據庫服務器的分布式部署,無法跨越互聯網的不同網段,并且它在下屬數據庫節點異常時,無法自動恢復,需要人工進行處理。
為了解決上述問題,本文提出一種基于Replication和LVS的MySQL分布式數據庫實現方案。該方案采用Replication技術實現兩個跨網段數據庫之間的雙向數據同步,通過LVS和heartbeat實現負載均衡和故障切換,利用數據庫合并技術實現故障恢復,從而構建出一個跨網段、可用性高、可自動恢復常見故障的分布式數據庫系統。
MySQL的復制(Replication)技術是一種能夠讓運行在不同計算機上的兩個或者更多個MySQL服務器保持同步變化的機制,目前支持“主-從”復制關系,只有一臺主控系統(可讀/可寫),所有的數據修改操作都要在這臺系統上進行;有一臺或多臺從屬系統(只讀),它們有著與主控系統完全一樣的數據,主控系統上的數據變化在經過一個短暫的延時后也將發生在它們身上,并且不要求主控和從屬系統使用同一種操作系統。
Replication是一種異步的復制,從一個MySQL instace(稱之為Master)復制到另一個MySQL instance(稱之Slave)。實現整個復制操作主要是由三個線程完成的,其中兩個線程在Slave(SQL線程和I/0線程),另外一個線程(I/0線程)在Master上。
MySQL數據庫系統采用異步復制來保持數據的一致性,其復制過程可簡述如下:主服務器(Master)數據更新之后,通知從服務器(Slave),從服務器的I/O進程連接到主服務器(Master),并請求指定日志文件的指定位置(或者從最開始的日志)之后的日志內容;主服務器接收到從服務器I/O進程的請求后,其I/O進程根據請求信息讀取指定日志的指定位置之后的日志信息,并將其返回給從服務器的I/O進程。返回信息中除了日志所包含的信息之外,還包括Master端的bin-log文件的名稱以及binlog的位置;從服務器的I/O進程接收到信息后,將接收到的日志內容添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的bin-log的文件名和位置記錄到master-info文件中;從服務器的sql進程檢測到reday-log中新增加了內容后,會馬上解析relay-log的內容并執行,從而達到服務器之間的數據同步。
LVS的英文全稱是Linux Virtual Server,即Linux虛擬服務器。它是章文嵩博士主持的一個開源項目。
LVS主要用于多服務器的負載均衡。它可以實現高性能,高可用的服務器集群技術。它廉價,可把許多低性能的服務器組合在一起形成一個超級服務器。它易用,配置非常簡單,且有多種負載均衡的算法。它穩定可靠,即使在集群的服務器中某臺服務器無法正常工作,也不影響整體效果。另外可擴展性也非常好。
LVS工作在網絡層,相對于其它負載均衡的解決辦法,比如應用層負載的調度等,它的效率更高。LVS的通過控制IP來實現負載均衡。IPVS是其具體的實現模塊。IPVS的主要作用:安裝在Director Server上面,在Director Server虛擬一個對外訪問的IP(VIP)。用戶訪問VIP,到達Director Server,Director Server根據一定的規則選擇一個Real Server,處理完成后然后返回給客戶端數據。這些步驟產生了一些具體的實現問題,比如如何選擇具體的Real Server,Real Server如何返回給客戶端數據等等。IPVS為此有三種機制:VS/NAT(Virtual Server via Network Address Translation),即網絡地址轉換技術實現虛擬服務器;VS/TUN(Virtual Server via IP Tunneling),即IP隧道技術實現虛擬服務器;VS/DR(Virtual Server via Direct Routing),即用直接路由技術實現虛擬服務器。
本文基于上述Replication和LVS技術提出了一種MySQL分布式數據庫系統的實現方案,如圖1所示。
數據節點1(DB1)和數據節點2(DB2)分別部署在兩個不同網段,通過廣域網相連。DB1和DB2之間通過Replication技術實現雙向復制。虛擬服務器1(LVS1)和虛擬服務器2(LVS2)同樣部署在兩個不同網段,通過廣域網相連。每個虛擬服務器通過IP隧道技術與兩個數據節點建立虛擬連接,當一個數據節點故障時,自動切換到另一個數據節點,從而提高數據的可用性。用戶1(USER1)部署在DB1所屬網絡NETWORK1,通過LVS1優先訪問DB1;用戶2(USER2)部署在DB2所屬網絡NETWORK2,通過LVS2優先訪問DB2,就近使用本地數據節點,從而提高響應速度。

圖1 分布式數據庫系統示意圖
Replication技術實現
首先配置DB1為Master,DB2為Slave,DB2復制DB1的數據。然后配置DB2為Master,DB1為Slave,DB1復制DB2的數據。DB1配置為只寫入奇數行數據,DB2配置為只寫入偶數行數據。配置完成后,無論DB1還是DB2,任意一側數據發生變動,都能通過Replication技術復制到對方,從而保證數據的一致性,實現兩個跨網段數據庫之間的雙向數據同步。
LVS技術實現
本方案為達到負載均衡和故障切換的目的,采用了LVS中的IP隧道技術(VS/TUN)方式來實現虛擬服務器。
DB1設置兩個IP地址(DB1IP1/NETWORK1和DB1IP2/NETWORK1),創建兩個隧道(TUN1/ NETWORK1和TUN2/NETWORK2)分別為兩個虛擬服務器對外隧道IP地址。DB2設置兩個IP地址(DB2IP1/ NETWORK2和DB2IP2/NETWORK2),創建兩個隧道(TUN1/NETWORK1和TUN2/NETWORK2)分別為兩個虛擬服務器對外隧道IP地址。
LVS1創建一個隧道(TUN1/NETWORK1),通過加權負載均衡算法與DB1IP1和DB2IP1相連,給予同網段DB1IP1較高的權重值,保證優先使用同網段的數據庫,提高響應速度。LVS2創建一個隧道(TUN2/ NETWORK2),通過加權負載均衡算法與DB1IP1和DB2IP1相連,給予同網段DB2IP1較高的權重值,保證優先使用同網段的數據庫,提高響應速度。LVS1和LVS2中都通過heartbeat檢測與兩個數據庫之間的數據訪問連接狀態,當一個數據庫出現異常時,就會自動切換到另一個隧道連接的數據庫,從而實現負載均衡和故障切換。
數據庫合并技術實現
本方案采用基于SHELL腳本的數據庫合并技術實現對兩個數據庫的監控及故障恢復。腳本處理流程如下:
(1)啟動數據庫后臺故障檢測守護腳本進程;
(2)設置兩個數據庫的控制IP地址分別為DB1IP2和DB2IP2,設置兩個數據庫的LVS訪問IP地址為DB1IP1和DB2IP1;
(3)根據預先設置的故障檢測時間點(一般設置為用戶對數據庫訪問較少的時間點),對兩個數據庫的連接狀態進行檢測,未到檢測時間點守護腳本置于休眠狀態,到達檢測時間點喚醒;
(4)檢測守護腳本所在網絡和兩個數據庫的可通性,如果不通,寫日志報警,守護腳本置于休眠狀態,等待下一個檢測時間點喚醒(這種情況下物理網絡不通,需要人工干預,保證網絡暢通,否則無法獲取數據庫狀態);
(5)檢測守護腳本所在網絡和兩個數據庫的數據庫可訪問性,如果不可訪問,寫日志報警,守護腳本置于休眠狀態,等待下一個檢測時間點喚醒(這種情況下數據庫不可訪問,需要人工干預,保證單個節點數據庫運行正常,否則無法獲取數據庫的同步狀態);
(6)檢測兩個數據庫系統之間的同步狀態,如果正常同步,寫入正常同步日志,守護腳本置于休眠狀態,等待下一個檢測時間點喚醒;如果同步故障,寫入同步故障日志并執行后續步驟;
(7)通過控制IP地址DB1IP2和DB2IP2分別關閉兩個數據庫對LVS的訪問IP地址DB1IP1和DB2IP1,停止兩個數據庫之間的同步線程;
(8)通過控制IP地址DB1IP2和DB2IP2將數據庫DB2中的數據合并到數據庫DB1中,然后把數據庫DB1中合并后的數據復制到數據庫DB2中;
(9)重新配置數據庫DB1和數據庫DB2之間的雙向同步關系;
(10)重新設置兩個數據庫對外訪問的IP地址DB1IP1和DB2IP1;
(11)寫入同步成功日志,守護腳本置于休眠狀態,等待下一個檢測時間點喚醒。
近年來,數據庫技術已成為廣大學者和專家的研究熱點之一,特別是分布式數據庫技術。在國外,該領域已被研究多年,提出了各種成熟的實現方案,但在國內還處于研究階段。本文以應用廣泛的Replication技術實現兩個跨網段數據庫之間的雙向數據同步,采用LVS和heartbeat實現負載均衡和故障切換,利用數據庫合并技術實現故障恢復。但在研究過程中,也發現了一些新的問題:比如在網絡通暢但數據庫崩潰情況下,如何自動恢復數據庫。這將是將來有待解決的問題。
10.3969/j.issn.1001-8972.2015.10.021