作者:admin 日期:2023-09-03 瀏覽: 次
?數(shù)據(jù)庫備份還原系統(tǒng)
編者按:《運(yùn)維之下》一書覆蓋了系統(tǒng)、網(wǎng)絡(luò)、數(shù)據(jù)庫、安全、標(biāo)準(zhǔn)化、自動(dòng)化等多個(gè)層面,從創(chuàng)業(yè)初期見招拆招到BAT級(jí)別的規(guī)?;\(yùn)維,從PaaS、IaaS到公有云,從運(yùn)維理念到平臺(tái)實(shí)踐,都有所闡述。作者從個(gè)人成長經(jīng)歷出發(fā),分享了自己與團(tuán)隊(duì)在運(yùn)維工作發(fā)展過程中遇到的問題,如何去思考問題,怎樣去解決問題。與其說這是一本傳授管理經(jīng)驗(yàn)和工作秘訣的書,不如說它更是一本關(guān)于運(yùn)維體系化的指導(dǎo)手冊。在各種說教式理論類叢書漫天飛的同時(shí),筆者能夠耐得住性子,將自己的多年的從業(yè)經(jīng)驗(yàn),合力共聚為一本書,這本書的含金量自然可想而知。本篇為《運(yùn)維之下》第二十章。
第二十一章:數(shù)據(jù)庫備份還原系統(tǒng)
數(shù)據(jù)是出于用戶對公司產(chǎn)品的喜歡和信任,不斷創(chuàng)造和提交的。對于公司來說,這是無比珍貴的資產(chǎn)。如果不幸把數(shù)據(jù)損壞或者弄丟了,會(huì)嚴(yán)重地?fù)p害用戶的權(quán)益,有可能導(dǎo)致嚴(yán)重的用戶流失。讀者可以想象一下,如果facebook的用戶數(shù)據(jù)一夜之間消失了,用戶會(huì)有什么反應(yīng)呢?如果說對facebook的體驗(yàn)還不強(qiáng)烈,可以再想象一下,若此時(shí)存放著你所有存款的銀行突然告訴你,他們把數(shù)據(jù)弄丟了,而且沒法復(fù)原,你的銀行存款都只能清零,你還能繼續(xù)淡定地看下面的文字嗎?
相信通過上面的兩個(gè)例子你已經(jīng)理解了數(shù)據(jù)的重要性,那也就能明白對于整天和數(shù)據(jù)打交道的DBA來說,數(shù)據(jù)備份在日常工作中占據(jù)了多么重要的位置。對于DBA來說,不怕操作出問題,就怕出問題后沒有備份數(shù)據(jù)進(jìn)行修復(fù)。對數(shù)據(jù)的任何操作都有風(fēng)險(xiǎn),一旦出現(xiàn)誤操作、數(shù)據(jù)損壞等意料之外的情況,就可以隨時(shí)用備份數(shù)據(jù)把數(shù)據(jù)恢復(fù)到操作前的狀態(tài)。而如果需要進(jìn)行數(shù)據(jù)修復(fù)時(shí),卻無法找到備份數(shù)據(jù)進(jìn)行恢復(fù),這種抓狂和絕望,相信大家或多或少都體驗(yàn)過。
為了避免這種虐心的體驗(yàn),我們把數(shù)據(jù)庫備份還原系統(tǒng)的開發(fā)工作放到了第一優(yōu)先級(jí)的位置。經(jīng)過三個(gè)主要的版本開發(fā),備份還原系統(tǒng)已經(jīng)在生產(chǎn)環(huán)境中提供自動(dòng)創(chuàng)建備份任務(wù)、定期進(jìn)行備份、自動(dòng)數(shù)據(jù)恢復(fù)測試的功能,保障了業(yè)務(wù)數(shù)據(jù)100%的備份成功率和備份數(shù)據(jù)有效性。本章我們就來介紹數(shù)據(jù)庫備份還原系統(tǒng)的發(fā)展過程。
為了避免這種虐心的體驗(yàn),我們把數(shù)據(jù)庫備份還原系統(tǒng)的開發(fā)工作放到了第一優(yōu)先級(jí)的位置。經(jīng)過三個(gè)主要的版本開發(fā),備份還原系統(tǒng)已經(jīng)在生產(chǎn)環(huán)境中提供自動(dòng)創(chuàng)建備份任務(wù)、定期進(jìn)行備份、自動(dòng)數(shù)據(jù)恢復(fù)測試的功能,保障了業(yè)務(wù)數(shù)據(jù)100%的備份成功率和備份數(shù)據(jù)有效性。本章我們就來介紹數(shù)據(jù)庫備份還原系統(tǒng)的發(fā)展過程。
單機(jī)備份工具
我們的第一套備份系統(tǒng)是在每臺(tái)服務(wù)器上單獨(dú)運(yùn)行一個(gè)備份任務(wù),任務(wù)管理都是靠DBA手工進(jìn)行的,或許這個(gè)階段稱之為備份工具會(huì)更合適。
簡單來說,單機(jī)備份就是在需要進(jìn)行數(shù)據(jù)備份的服務(wù)器上安裝一個(gè)備份工具,比如MySQL官方自帶的Mysqldump工具,或者第三方開源的產(chǎn)品Mydumper或Xtrabackup,通過crontab等方式調(diào)度,備份數(shù)據(jù)存儲(chǔ)在本地服務(wù)器上;需要進(jìn)行數(shù)據(jù)恢復(fù)時(shí),從存有備份數(shù)據(jù)的服務(wù)器上拷貝一份數(shù)據(jù)到需要進(jìn)行恢復(fù)的服務(wù)器上。
單機(jī)備份是最簡單的一種方式,靠人工來管理備份任務(wù),并需要定期檢查備份任務(wù)運(yùn)行是否正常。這種方式上手快,門檻低,所需的開發(fā)工作量也很少,適合用在數(shù)據(jù)庫實(shí)例比較少、每個(gè)實(shí)例體量不大的場景下。
數(shù)據(jù)庫集群數(shù)量少的時(shí)候,單機(jī)備份方式還能滿足日常備份需求,但隨著數(shù)據(jù)規(guī)模的擴(kuò)大,問題就凸現(xiàn)出來了。
◎ 備份數(shù)據(jù)存儲(chǔ)周期不長:畢竟是存儲(chǔ)在本地?cái)?shù)據(jù)庫服務(wù)器上,一般情況下,為了保證數(shù)據(jù)庫服務(wù)的IO能力,磁盤都選用高IO能力、低存儲(chǔ)空間的高轉(zhuǎn)速SAS盤或者SSD盤,再加上做了RAID,實(shí)際可用的存儲(chǔ)空間本來就沒有多少,如果還要存儲(chǔ)幾個(gè)周期的備份數(shù)據(jù),空間資源捉襟見肘。
◎ 容易影響數(shù)據(jù)庫運(yùn)行:因?yàn)槿蝿?wù)運(yùn)行和數(shù)據(jù)存儲(chǔ)都與數(shù)據(jù)庫服務(wù)在同一臺(tái)服務(wù)器上,每次運(yùn)行備份任務(wù)時(shí),都會(huì)同時(shí)出現(xiàn)大量的磁盤讀/寫操作,容易和數(shù)據(jù)庫服務(wù)爭搶IO資源,影響服務(wù)的響應(yīng)效率;進(jìn)行數(shù)據(jù)還原時(shí),拷貝備份數(shù)據(jù)也會(huì)有大量的磁盤讀操作,同樣也會(huì)影響到正在運(yùn)行的數(shù)據(jù)庫。有的讀者也許會(huì)說,可以部署一臺(tái)數(shù)據(jù)庫服務(wù)器,專門用來做備份。這樣當(dāng)然可以,不過本著節(jié)約的原則,我們還是不推薦這種方式。想想:當(dāng)你有幾百上千個(gè)集群時(shí),會(huì)有幾百上千臺(tái)服務(wù)器專門用作備份,你說這事怎么給老板解釋?
◎ 維護(hù)代價(jià)高:靠人工維護(hù),不僅容易出錯(cuò),而且每次變更調(diào)整效率也會(huì)有所折扣。另外,由于備份任務(wù)零散地分布在多臺(tái)服務(wù)器上,只能靠人工記錄任務(wù)和服務(wù)器的對應(yīng)關(guān)系,正確性難以保證,時(shí)間一長,容易出現(xiàn)遺漏或錯(cuò)誤。
提高備份系統(tǒng)的自動(dòng)化程度,加強(qiáng)對備份任務(wù)的管理,減少DBA在備份管理上的時(shí)間投入,這是我們開發(fā)第二版?zhèn)浞莨芾硐到y(tǒng)的出發(fā)點(diǎn)。
集中管理備份系統(tǒng)
為了便于統(tǒng)一管理和調(diào)度備份任務(wù),我們設(shè)計(jì)了任務(wù)管理模塊,把所有備份任務(wù)的信息都進(jìn)行集中記錄和維護(hù)。管理模塊主要有三個(gè)功能。
◎ 任務(wù)管理:所有的備份任務(wù)管理都由任務(wù)管理模塊負(fù)責(zé),可以添加、刪除、修改備份任務(wù),或者激活、停止某個(gè)任務(wù)的運(yùn)行,并記錄每一次任務(wù)運(yùn)行的狀態(tài),比如什么時(shí)候在哪臺(tái)數(shù)據(jù)庫上啟動(dòng)了備份程序,備份過程運(yùn)行了多長時(shí)間,備份策略是全量還是增量,運(yùn)行結(jié)果是否正常,如果正常,備份數(shù)據(jù)占用了多少空間等,所有信息一目了然,便于DBA每天對備份任務(wù)進(jìn)行常規(guī)檢查。
◎ 任務(wù)調(diào)度:通過時(shí)間事件來調(diào)度備份任務(wù)。當(dāng)時(shí)間事件觸發(fā)某個(gè)備份任務(wù)開始運(yùn)行以后,管理程序先在本機(jī)開啟一個(gè)TCP端口,用于接收客戶端發(fā)回的備份數(shù)據(jù);然后遠(yuǎn)程調(diào)用部署在MySQL服務(wù)器上的備份執(zhí)行程序,執(zhí)行程序通過Xtrabackup開始數(shù)據(jù)拷貝,并將備份數(shù)據(jù)通過流式(stream)發(fā)回到備份服務(wù)器集中存儲(chǔ)。在備份過程中,只有一次數(shù)據(jù)讀取操作,不在MySQL服務(wù)器上再次寫入數(shù)據(jù),減少了對IO的影響。
◎ 數(shù)據(jù)存儲(chǔ):所有的備份數(shù)據(jù)都通過網(wǎng)絡(luò)傳回管理模塊所在的服務(wù)器統(tǒng)一存儲(chǔ),便于進(jìn)行查找和管理。
同時(shí)我們設(shè)計(jì)了任務(wù)執(zhí)行模塊,主要負(fù)責(zé)實(shí)施備份操作,完成管理模塊發(fā)送過來的備份任務(wù),并將備份出來的數(shù)據(jù)發(fā)送給管理模塊。如果在執(zhí)行過程中出現(xiàn)任何錯(cuò)誤,執(zhí)行模塊還會(huì)將錯(cuò)誤信息的上下文反饋給管理模塊,并停止任務(wù)運(yùn)行。對現(xiàn)有開源的備份工具進(jìn)行比對并結(jié)合生產(chǎn)環(huán)境情況綜合評(píng)估以后,我們選擇了Percona Xtrabackup作為基礎(chǔ)備份工具。Xtrabackup可以實(shí)現(xiàn)InnoDB表的無鎖在線備份,降低了備份任務(wù)對數(shù)據(jù)庫正常運(yùn)行的影響。Xtrabackup是執(zhí)行模塊的重要組成部分。
集中管理備份系統(tǒng)的結(jié)構(gòu)示意圖
集中化管理可以有效地提高DBA的工作效率,對備份任務(wù)的管理(增、刪、改、查)只需要在頁面上用鼠標(biāo)點(diǎn)擊幾下就可以完成,每天的備份任務(wù)運(yùn)行情況也一目了然。這種方式具有開發(fā)量小、管理直觀快捷的優(yōu)點(diǎn),特別適合用在中等規(guī)模的數(shù)據(jù)庫集群中。用戶可以通過Web管理頁面查看和管理所有的備份任務(wù),如圖所示。

備份任務(wù)管理
備份任務(wù)運(yùn)行報(bào)表
隨著數(shù)據(jù)規(guī)模的繼續(xù)增長,這套系統(tǒng)也逐漸難以滿足需求,下面是暴露出來的主要問題。
◎ 存儲(chǔ)空間飽和:由于所有的備份數(shù)據(jù)都要傳回存儲(chǔ)模塊進(jìn)行存儲(chǔ),在備份任務(wù)數(shù)量增多的同時(shí),存儲(chǔ)空間的爭搶問題變得愈加嚴(yán)重。
◎ 并發(fā)控制不便:由于備份任務(wù)是通過時(shí)間事件進(jìn)行觸發(fā)的,有可能出現(xiàn)在部分時(shí)間區(qū)間大量的備份任務(wù)一起運(yùn)行,備份存儲(chǔ)服務(wù)器的IO壓力非常大;而有些時(shí)段又沒有備份任務(wù)運(yùn)行,資源白白浪費(fèi)掉了。
◎ 無法進(jìn)行水平擴(kuò)展:為了便于在備份過程中就將備份數(shù)據(jù)傳回存儲(chǔ)模塊進(jìn)行存儲(chǔ),任務(wù)管理模塊和存儲(chǔ)模塊是整合在一起的,導(dǎo)致了嚴(yán)重的中心化,要擴(kuò)展存儲(chǔ)模塊非常麻煩。
細(xì)心的讀者可能會(huì)發(fā)現(xiàn),由于任務(wù)管理模塊和調(diào)度模塊是整合在一起的,而調(diào)度模塊和存儲(chǔ)模塊又相互依賴,管理模塊的中心化導(dǎo)致了后面兩個(gè)模塊無法做到水平擴(kuò)展,而出現(xiàn)瓶頸的主要是調(diào)度模塊和存儲(chǔ)模塊。如果能把任務(wù)管理模塊解耦,設(shè)計(jì)成獨(dú)立的一個(gè)部分,就可以對后兩個(gè)模塊進(jìn)行擴(kuò)容了?;谶@個(gè)思路,我們對第二版?zhèn)浞菹到y(tǒng)進(jìn)行了改版,把任務(wù)管理模塊和調(diào)度模塊分拆為兩個(gè)獨(dú)立部分,并引入了優(yōu)先級(jí)隊(duì)列,去除了時(shí)間事件驅(qū)動(dòng)的方式,形成了第三版?zhèn)浞莨芾硐到y(tǒng)——分布調(diào)度備份系統(tǒng)。
分布調(diào)度備份系統(tǒng)
第三版?zhèn)浞菹到y(tǒng)由三層邏輯組成,第一層是任務(wù)管理模塊(Task Manager),和第二版的任務(wù)管理模塊功能類似,用于管理所有的備份任務(wù)和記錄元信息;主要的改變就是增加了一個(gè)優(yōu)先級(jí)隊(duì)列。每個(gè)備份周期開始時(shí)(如每天零時(shí)),管理模塊會(huì)根據(jù)現(xiàn)有的所有處于激活狀態(tài)的任務(wù)的重要程度,生成一個(gè)備份任務(wù)優(yōu)先級(jí)隊(duì)列,然后等待處于第二層的調(diào)度模塊來請求任務(wù)。
調(diào)度模塊(Scheduler)的調(diào)度策略和第二版不同,放棄了時(shí)間事件觸發(fā)的方式,而是采用了自發(fā)請求任務(wù)的方式。如果調(diào)度模塊發(fā)現(xiàn)當(dāng)前自己正在運(yùn)行的任務(wù)數(shù)N,小于允許運(yùn)行的最大任務(wù)數(shù)M,即N 執(zhí)行模塊的功能和第二版相同,只負(fù)責(zé)執(zhí)行具體的備份操作,沒有任何變化。 分布調(diào)度備份系統(tǒng)的三層結(jié)構(gòu)示意圖如圖21-4所示。用戶可以繼續(xù)通過Web頁面管理和查看備份任務(wù),也可以通過API的方式和管理模塊進(jìn)行交互。 分布調(diào)度備份系統(tǒng)的三層結(jié)構(gòu)示意圖 第三版?zhèn)浞菹到y(tǒng)的主要特點(diǎn)如下: ◎ 任務(wù)管理集中化:所有的任務(wù)依然是集中管理,通過Web頁面或者API的方式,可以管理和查詢所有任務(wù)的信息和歷史運(yùn)行狀態(tài)。 ◎ 有效的并發(fā)控制:每個(gè)調(diào)度模塊都可以根據(jù)服務(wù)器的配置,調(diào)配允許同時(shí)運(yùn)行的任務(wù)數(shù),使備份服務(wù)器的壓力可控。 ◎ 方便水平擴(kuò)展:如果磁盤存儲(chǔ)空間不足,則可以通過增加服務(wù)器的方式快速擴(kuò)容,新增加的服務(wù)器可以自動(dòng)注冊到任務(wù)管理模塊中,并申請任務(wù)運(yùn)行,管理代價(jià)很小。 ◎ 數(shù)據(jù)分布存儲(chǔ):備份任務(wù)是隨機(jī)在不同的調(diào)度模塊(存儲(chǔ)服務(wù)器)上運(yùn)行的,每個(gè)備份任務(wù)的備份數(shù)據(jù)都會(huì)分布在多臺(tái)服務(wù)器上,如果其中一臺(tái)存儲(chǔ)服務(wù)器掛掉了,損失的也只是一部分備份任務(wù)的某幾次備份數(shù)據(jù),不會(huì)出現(xiàn)某個(gè)任務(wù)的全部備份數(shù)據(jù)丟失的情況。 ◎ binlog備份:前面介紹的備份都是某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)鏡像,如果需要恢復(fù)到任意時(shí)間點(diǎn),就需要使用binlog。在第三版?zhèn)浞菹到y(tǒng)中,支持binlog備份的需求。當(dāng)用戶添加了一個(gè)日常備份任務(wù)以后,備份系統(tǒng)通過獲取數(shù)據(jù)庫實(shí)例的復(fù)制信息(Slave status),找到當(dāng)前實(shí)例的上級(jí)主庫(或者主庫就是該實(shí)例自身),然后在備份服務(wù)器上啟動(dòng)一個(gè)程序,模擬成數(shù)據(jù)庫從庫,向主庫實(shí)時(shí)同步binlog任務(wù),達(dá)到更新數(shù)據(jù)實(shí)時(shí)備份的目的。 ◎ 自動(dòng)數(shù)據(jù)還原:由于任務(wù)管理模塊記錄了所有備份數(shù)據(jù)的信息,這些信息就可以用來實(shí)現(xiàn)自動(dòng)還原。自動(dòng)還原過程類似于備份過程,只不過數(shù)據(jù)傳輸方向是相反的。當(dāng)用戶發(fā)起一次數(shù)據(jù)還原請求時(shí),備份系統(tǒng)會(huì)找到一份符合條件的備份數(shù)據(jù),并將數(shù)據(jù)發(fā)送給需要恢復(fù)的目標(biāo)服務(wù)器,進(jìn)行恢復(fù)操作,如果有需要,還可以自動(dòng)建立新實(shí)例和主庫的復(fù)制關(guān)系,完成數(shù)據(jù)恢復(fù)過程。另外,結(jié)合binlog備份,可以恢復(fù)數(shù)據(jù)到任意時(shí)間點(diǎn),供DBA或者研發(fā)人員分析、測試使用。 ◎ 自動(dòng)恢復(fù)測試:備份系統(tǒng)會(huì)周期性地對備份數(shù)據(jù)進(jìn)行恢復(fù)測試,檢驗(yàn)備份數(shù)據(jù)的可用性和正確性,如果發(fā)現(xiàn)異常,會(huì)及時(shí)通知相關(guān)的負(fù)責(zé)人員。對備份數(shù)據(jù)定期進(jìn)行恢復(fù)測試,可以有效地保證備份數(shù)據(jù)的正確性和有效性,確保在需要的時(shí)候能有一份可用的數(shù)據(jù)副本。 總結(jié) 本章介紹了數(shù)據(jù)庫備份還原系統(tǒng)發(fā)展的主要?dú)v程和現(xiàn)狀。備份還原系統(tǒng)共經(jīng)歷了三個(gè)大版本的發(fā)展,從最初的單機(jī)備份,發(fā)展到目前在役的分布調(diào)度備份還原系統(tǒng),實(shí)現(xiàn)了備份管理自動(dòng)化、任務(wù)調(diào)度自動(dòng)化和可擴(kuò)展、數(shù)據(jù)恢復(fù)測試自動(dòng)化等重要功能。在保證數(shù)據(jù)備份覆蓋率和成功率的同時(shí),有效地提高了DBA的工作效率,減少了人工操作的時(shí)間投入和誤(漏)操作的數(shù)量。 更多精彩內(nèi)容技術(shù)頭條將持續(xù)跟進(jìn),第一時(shí)間為大家送上最新動(dòng)態(tài)~o(^▽^)o 請掃描以下二維碼關(guān)注技術(shù)頭條公眾號(hào)更多精彩內(nèi)容將在技術(shù)頭條持續(xù)發(fā)布,敬請關(guān)注!微信號(hào):jishutoutiao