一個(gè)系統(tǒng)可能包含很多模塊,如數(shù)據(jù)庫、前端、緩存、搜索、消息隊(duì)列等,每個(gè)模塊都需要做到高可用,才能保證整個(gè)系統(tǒng)的高可用。對于數(shù)據(jù)庫服務(wù)而言,高可用的實(shí)現(xiàn)可能更加復(fù)雜,對用戶的服務(wù)可用,不僅僅是能訪問,還需要有正確性保證,因此討論數(shù)據(jù)庫的高可用方案時(shí),在容災(zāi)之外,還要同時(shí)考慮方案中數(shù)據(jù)一致性問題。
一、高可用數(shù)據(jù)庫概述
1. 什么是高可用數(shù)據(jù)庫?
高可用數(shù)據(jù)庫是由一系列數(shù)據(jù)庫構(gòu)成的總體系統(tǒng),在任何時(shí)刻,至少有一個(gè)節(jié)點(diǎn)可以接受用戶的請求并提供數(shù)據(jù)庫服務(wù)。大多數(shù)數(shù)據(jù)庫架構(gòu)中,有一個(gè)主節(jié)點(diǎn)處理主要請求,還有若干備用節(jié)點(diǎn)用于容災(zāi)切換,當(dāng)主節(jié)點(diǎn)不能提供服務(wù)時(shí),備用節(jié)點(diǎn)成為主節(jié)點(diǎn)繼續(xù)提供服務(wù),用以保證整個(gè)系統(tǒng)的可用和穩(wěn)定。
2. 高可用數(shù)據(jù)庫有很多優(yōu)點(diǎn):
- 第一,方便讀寫分離。數(shù)據(jù)庫請求當(dāng)中,一般讀操作的請求次數(shù)遠(yuǎn)大于寫操作,高可用數(shù)據(jù)庫可以通過將寫操作放在主數(shù)據(jù)庫節(jié)點(diǎn)上進(jìn)行,將讀操作分擔(dān)到若干從庫上,來提升讀操作吞吐量,進(jìn)而提升讀寫效率;
- 第二,變更不停服。當(dāng)整個(gè)高可用數(shù)據(jù)庫架構(gòu)或者主節(jié)點(diǎn)升級時(shí),可以讓高可用數(shù)據(jù)庫先進(jìn)行主庫切換,讓備用節(jié)點(diǎn)替換原主節(jié)點(diǎn)提供數(shù)據(jù)庫服務(wù),當(dāng)主節(jié)點(diǎn)升級完畢后,再將主從庫服務(wù)切換回來,這樣能有效避免系統(tǒng)升級或變更時(shí)對用戶服務(wù)質(zhì)量產(chǎn)生影響;
- 第三,備份不影響服務(wù)性能。高可用數(shù)據(jù)庫架構(gòu)包含多個(gè)從庫,在不影響主節(jié)點(diǎn)服務(wù)性能的情況下,能非常方便地實(shí)現(xiàn)數(shù)據(jù)的容災(zāi)備份。
3. 高可用數(shù)據(jù)庫設(shè)計(jì)
一般,高可用數(shù)據(jù)庫架構(gòu)設(shè)計(jì)時(shí),也需要考慮三個(gè)問題:
- 第一,如何同步各數(shù)據(jù)庫之間的節(jié)點(diǎn)數(shù)據(jù)?同步需要保證切換后的數(shù)據(jù)庫是最新數(shù)據(jù),以及在切換過程中數(shù)據(jù)不會丟失,同時(shí)還要考慮同步過程對主庫和備庫的影響。
- 第二,高可用數(shù)據(jù)庫的容災(zāi)切換如何進(jìn)行?架構(gòu)不同容災(zāi)切換的復(fù)雜度也不一樣,且切換以后需要保證主、從庫數(shù)據(jù)的一致性,這可能需要開發(fā)者在設(shè)計(jì)之初就盡量優(yōu)化和簡化容災(zāi)切換邏輯。
- 第三,如何提高高可用的運(yùn)維效率?
二、業(yè)界高可用架構(gòu)方案
業(yè)界典型的高可用架構(gòu)可以劃分為四種:
1. 共享存儲。
共享存儲是指若干DB服務(wù)使用同一份存儲,一個(gè)主DB,其他的為備用DB,若主服務(wù)崩潰,則系統(tǒng)啟動(dòng)備用DB,成為新的主DB,繼續(xù)提供服務(wù)。一般共享存儲采用比較多的是SAN/NAS方案,這種方案的優(yōu)點(diǎn)是沒有數(shù)據(jù)同步的問題,缺點(diǎn)是對網(wǎng)絡(luò)性能要求比較高。
2. 操作系統(tǒng)實(shí)時(shí)數(shù)據(jù)塊復(fù)制。
這種方案的典型場景是DRBD。如下圖所示,左邊數(shù)據(jù)庫寫入數(shù)據(jù)以后立即同步到右邊的存儲設(shè)備當(dāng)中。如果左邊數(shù)據(jù)庫崩潰,系統(tǒng)直接將右邊的數(shù)據(jù)庫存儲設(shè)備激活,完成數(shù)據(jù)庫的容災(zāi)切換。這個(gè)方案同樣有一些問題,如系統(tǒng)只能有一個(gè)數(shù)據(jù)副本提供服務(wù),無法實(shí)現(xiàn)讀寫分離;另外,系統(tǒng)崩潰后需要的容災(zāi)恢復(fù)時(shí)間較長。
3. 數(shù)據(jù)庫主從復(fù)制。
這種方案是較經(jīng)典的數(shù)據(jù)同步模式,系統(tǒng)采用一個(gè)主庫和多個(gè)從庫,主庫同步數(shù)據(jù)庫日志到各個(gè)從庫,從庫各自回放日志。它的好處是一個(gè)主庫可以連接多個(gè)從庫,能很方便地實(shí)現(xiàn)讀寫分離,同時(shí),因?yàn)槊總€(gè)備庫都在啟動(dòng)當(dāng)中,所以備庫當(dāng)中的數(shù)據(jù)基本上都是熱數(shù)據(jù),容災(zāi)切換也非???。
4. 數(shù)據(jù)庫高可用集群。
前面三種是通過復(fù)制日志的模式實(shí)現(xiàn)高可用,第四種方案是基于一致性算法來做數(shù)據(jù)同步。數(shù)據(jù)庫提供一種多節(jié)點(diǎn)的一致性同步機(jī)制,然后利用該機(jī)制構(gòu)建多節(jié)點(diǎn)同步集群,這是業(yè)界近年來比較流行的高可用集群的方案。
三、數(shù)據(jù)庫容災(zāi)規(guī)劃
一般數(shù)據(jù)容災(zāi)會實(shí)現(xiàn)兩地兩個(gè)數(shù)據(jù)中心,1 主 2 從數(shù)據(jù)容災(zāi)架構(gòu),并建立數(shù)據(jù)庫日常數(shù)據(jù)災(zāi)備體系。但為了提高 IT 服務(wù)管理水平,企業(yè)用戶需要構(gòu)建新一代多活系統(tǒng)規(guī)劃設(shè)計(jì)總體目標(biāo):實(shí)現(xiàn)數(shù)據(jù) 0 丟失,同時(shí)滿足在任何災(zāi)難情況下實(shí)現(xiàn) 30 分鐘恢復(fù)對外數(shù)據(jù)服務(wù)。主要結(jié)合當(dāng)前主流容災(zāi)、災(zāi)備技術(shù)與企業(yè)未來 5 年內(nèi),多地?cái)?shù)據(jù)中心建設(shè)進(jìn)行整體容災(zāi)與災(zāi)備建設(shè)規(guī)劃、容災(zāi)演練、自動(dòng)化監(jiān)控與管理規(guī)劃。
1. 服務(wù)連續(xù)性規(guī)劃
衡量連續(xù)性水平主要指標(biāo)是恢復(fù)時(shí)間目標(biāo)(RTO)和恢復(fù)點(diǎn)目標(biāo)(RPO)。
- 恢復(fù)時(shí)間目標(biāo)(RTO):企業(yè)可容許服務(wù)中斷的時(shí)長;
- 恢復(fù)點(diǎn)目標(biāo)(RPO):指當(dāng)服務(wù)恢復(fù)后,恢復(fù)得來的數(shù)據(jù)所對應(yīng)時(shí)間點(diǎn)。
結(jié)合當(dāng)前 XXX 實(shí)際現(xiàn)狀目前規(guī)劃 2 個(gè)級別連續(xù)性等級規(guī)劃:
2. 技術(shù)選型規(guī)劃
3. 自動(dòng)化管理平臺規(guī)劃
通過數(shù)據(jù)庫自動(dòng)化管理平臺中容災(zāi)&災(zāi)備監(jiān)控管理中心可以實(shí)現(xiàn)對多個(gè)數(shù)據(jù)中心全局?jǐn)?shù)據(jù)容災(zāi)、數(shù)據(jù)災(zāi)備的情況進(jìn)行整體拓?fù)浔O(jiān)控與管理。并且
為了保證數(shù)據(jù)容災(zāi)、數(shù)據(jù)災(zāi)備有效性對數(shù)據(jù)同步延遲、數(shù)據(jù)傳輸流量根據(jù)數(shù)據(jù)中心的鏈路帶寬分配情況定制對應(yīng)的告警監(jiān)控。
自動(dòng)化運(yùn)維是高可用數(shù)據(jù)庫中的難點(diǎn),因?yàn)槠髽I(yè)業(yè)務(wù)不一定只有一個(gè)數(shù)據(jù)庫,可能需要同時(shí)管理十幾個(gè)甚至上百個(gè)數(shù)據(jù)庫,如果每一個(gè)數(shù)據(jù)庫都配置一個(gè)高可用數(shù)據(jù)庫架構(gòu),系統(tǒng)則需要保證其中任何一個(gè)發(fā)生問題以后都可以進(jìn)行容災(zāi),這無疑給運(yùn)維帶來了極大挑戰(zhàn)。
下面提供幾個(gè)自動(dòng)化運(yùn)維方向的思路:
(1) 容災(zāi)切換自動(dòng)化。
要實(shí)現(xiàn)容災(zāi)切換的自動(dòng)化,首先需要考慮兩個(gè)問題:
- 第一,怎樣準(zhǔn)確判斷需要容災(zāi)。這是實(shí)現(xiàn)自動(dòng)容災(zāi)的基礎(chǔ)和前提,它需要結(jié)合實(shí)際情況討論和判斷。如發(fā)生網(wǎng)絡(luò)波動(dòng)時(shí),可能有一段時(shí)間發(fā)現(xiàn)無法連上主庫,實(shí)際上幾秒鐘以后整個(gè)業(yè)務(wù)系統(tǒng)又恢復(fù)了,如果這時(shí)候數(shù)據(jù)庫做容災(zāi)的話代價(jià)比較大,且容災(zāi)后還可能會有額外的風(fēng)險(xiǎn)。所以需要在前期準(zhǔn)確判斷是否需要容災(zāi),并保證在最需要容災(zāi)的時(shí)候及時(shí)容災(zāi);
- 第二,容災(zāi)切換時(shí),備庫數(shù)據(jù)盡量和主庫數(shù)據(jù)保持一致,否則,就會帶來數(shù)據(jù)丟失的問題。
針對上述問題,MySQL已經(jīng)有比較常用方案供參考,老牌的如MHA,還有一種比較新的方案叫Orchestrator,如果大家自己搭建數(shù)據(jù)庫,可以考慮采用這兩種方案。
(2) 健康狀況自動(dòng)檢查。
健康狀況檢查需要通過自動(dòng)監(jiān)控搭配告警來做,高可用容災(zāi)中,最關(guān)心的還是高可用數(shù)據(jù)庫的主庫和備庫數(shù)據(jù)是否一致,一般情況,導(dǎo)致主從庫數(shù)據(jù)不一致的主要是兩點(diǎn):
- 第一,復(fù)制有沒有正常進(jìn)行,如發(fā)送日志時(shí)主庫與備庫之間的連接突然斷掉,這時(shí)候需要系統(tǒng)時(shí)常掃描主備庫是否異常;
- 第二,主從延時(shí),如果主從之間的數(shù)據(jù)延遲較大,那么切換數(shù)據(jù)庫時(shí)也會比較麻煩,這方面也可以考慮使用業(yè)內(nèi)比較常用的監(jiān)控模塊如Prometheus等工具定期采集,發(fā)現(xiàn)異常狀況后及時(shí)調(diào)整。
- 第三,異常情況自適應(yīng)調(diào)整。以主從延遲為例,一般來說可能是CPU的問題或者IO的問題等,如果是IO的問題,一種辦法是將IO調(diào)高,這是一種比較好的解決方案,如果IO調(diào)高以后發(fā)現(xiàn)還是無法降低延時(shí),可以在從庫把日志的持久化等級暫時(shí)性調(diào)低。當(dāng)然,如果主從之間延遲過大,完全無法調(diào)整為正常水平,這時(shí)候就要考慮通過一些手段重做從庫。
4. 數(shù)據(jù)庫容災(zāi)&災(zāi)備演練規(guī)劃
規(guī)劃通過使用數(shù)據(jù)庫自動(dòng)化管理平臺中的“一鍵容災(zāi)切換”-演練切換、“一鍵災(zāi)備恢復(fù)”-數(shù)據(jù)庫恢復(fù)模塊進(jìn)行恢復(fù)演練操作。
定期容災(zāi)演練很有必要。容災(zāi)演練就是在平臺上跑自己的容災(zāi)邏輯,我們需要在不同場景下做切換,看數(shù)據(jù)有沒有丟失、是否保持了數(shù)據(jù)的一致性等等,因?yàn)榫€上環(huán)境非常復(fù)雜,可能會有各種莫名其妙的問題導(dǎo)致切換邏輯在發(fā)生切換以后結(jié)果不一致,所以要通過定期演練把各種可能性降到最低。
總結(jié)
高可用架構(gòu)是數(shù)據(jù)庫運(yùn)行穩(wěn)定必不可少的一部分,設(shè)計(jì)架構(gòu)時(shí)要考慮諸多問題,如數(shù)據(jù)是否同步、高可用自動(dòng)切換、自動(dòng)化運(yùn)維等等。
【責(zé)任編輯:趙寧寧 TEL:(010)68476606】