濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > 淺析Facebook對(duì)MySQL數(shù)據(jù)庫的深度優(yōu)化

淺析Facebook對(duì)MySQL數(shù)據(jù)庫的深度優(yōu)化

熱門標(biāo)簽:綿竹平安400 電話申請(qǐng) 南昌智能外呼系統(tǒng)如何 美團(tuán)美容店地圖標(biāo)注 400電話辦理哪些類型 防封電銷卡 汽車定位 銷售 榆樹市地圖標(biāo)注app 全國營銷外呼系統(tǒng)報(bào)價(jià)表 百度地圖家政地圖標(biāo)注 世界之窗地圖標(biāo)注

Facebook擁有世界上最大的MySQL數(shù)據(jù)庫集群,其中包含了成千上萬臺(tái)服務(wù)器,這些服務(wù)器分布在跨越兩個(gè)大洲的多個(gè)數(shù)據(jù)中心里。
通過幾乎將所有的任務(wù)全部自動(dòng)化,這個(gè)集群只有一只非常小的MySQL DBA團(tuán)隊(duì)來進(jìn)行管理,集群甚至可以自己運(yùn)行。而實(shí)現(xiàn)這種自動(dòng)化的核心組件之一就是所謂的MPS系統(tǒng),即“MySQL Pool Scanner”。
MPS是一個(gè)大部分用Python寫的復(fù)雜狀態(tài)機(jī)。它能夠代替DBA執(zhí)行很多例行任務(wù),并且可以讓我們以很少或是不施加人為干預(yù)就能執(zhí)行批量維護(hù)工作。
單一數(shù)據(jù)庫結(jié)點(diǎn)
在Facebook數(shù)以千計(jì)的數(shù)據(jù)庫服務(wù)器中,每一個(gè)都能存儲(chǔ)一定數(shù)量的MySQL實(shí)例。一個(gè)實(shí)例是一個(gè)單獨(dú)的MySQL進(jìn)程,以其自身的數(shù)據(jù)集監(jiān)聽著一個(gè)單獨(dú)的端口。簡單來說,我們假設(shè)在圖表和示例中每個(gè)服務(wù)器正好有兩個(gè)實(shí)例。
整個(gè)數(shù)據(jù)集分割為無數(shù)的shard,并且每個(gè)實(shí)例都擁有一組這樣的shard,每個(gè)都在其自身的數(shù)據(jù)庫Schema里。一個(gè)Facebook用戶的信息在其創(chuàng)建的時(shí)候會(huì)分配給一個(gè)shard,這樣每個(gè)shard就會(huì)包含有成千上萬用戶的相關(guān)數(shù)據(jù)。
用一個(gè)單一數(shù)據(jù)庫服務(wù)器的圖表可以更容易解釋這一點(diǎn):

每個(gè)實(shí)例在駐留于不同服務(wù)器上的其他實(shí)例上都有幾個(gè)副本,而這些服務(wù)器通常是在不同數(shù)據(jù)中心里的。這樣做主要是為了實(shí)現(xiàn)兩個(gè)目的:
高可用性:如果一臺(tái)服務(wù)器宕機(jī)了,我們?cè)谄渌胤竭€有可用數(shù)據(jù)來提供服務(wù)。
性能:不同的地理位置擁有它們自己的副本,這樣便可以使讀取服務(wù)本地化。
這里是一個(gè)簡單的replica set示意,它的每個(gè)服務(wù)器都只有一個(gè)實(shí)例,并且其他實(shí)例為空(我們稱這些是spares):
一個(gè)服務(wù)器本質(zhì)上是實(shí)例容器,所以現(xiàn)實(shí)中的情況可以會(huì)變得更為復(fù)雜。
例如,一個(gè)單一服務(wù)器擁有一個(gè)主實(shí)例也可能擁有一個(gè)不同主實(shí)例的從實(shí)例,像下面這樣:

這里MPS依賴于兩個(gè)重要的“building block”操作:
1. 創(chuàng)建一個(gè)副本/放置服務(wù)器
第一個(gè)building block操作是在一臺(tái)不同的主機(jī)上創(chuàng)建一個(gè)實(shí)例的副本。我們使用Xtrabackup的修改版本來執(zhí)行大多數(shù)復(fù)制操作。如果我們?cè)趶?fù)制成功完成后移除實(shí)例,替代過程也是同樣的操作。
首先,系統(tǒng)為此操作分配一個(gè)空閑實(shí)例。我們選擇其中一個(gè)從實(shí)例或主實(shí)例并復(fù)制其數(shù)據(jù)到新分配的空閑實(shí)例。下表顯示了這一替代操作,它在復(fù)制完成后將實(shí)例移除:
2. 升級(jí)主實(shí)例
第二個(gè)building block操作是將一個(gè)不同的實(shí)例升級(jí)為一個(gè)replica set的主實(shí)例。
在升級(jí)過程中,我們首先選擇一個(gè)目標(biāo),停止寫入到replica set,將從實(shí)例改為從新的主實(shí)例進(jìn)行復(fù)制,并恢復(fù)寫入。在下圖中演示了一個(gè)刪除操作,即在升級(jí)成功完成之后舊實(shí)例會(huì)被丟棄。為簡單起見,下面的replica set只包含三個(gè)實(shí)例:

這兩個(gè)操作對(duì)于大多數(shù)使用MySQL的公司來說通常是很復(fù)雜的過程,而在Facebook,它不需要人為干預(yù)的情況下就已經(jīng)可以由MPS快速而安全的全自動(dòng)化運(yùn)行。
主機(jī)管理和狀態(tài)
通過上文我們已經(jīng)解決了基本問題,現(xiàn)在可以利用這些building block來探索更為抽象的概念。
MPS會(huì)連接到一個(gè)存有當(dāng)前所有數(shù)據(jù)庫主機(jī)狀態(tài)和元數(shù)據(jù)的庫,這個(gè)庫還包含了當(dāng)前和過期MPS的復(fù)制操作。注冊(cè)表是由數(shù)據(jù)庫服務(wù)器自身進(jìn)行管理,因此數(shù)據(jù)庫集群和MPS可與不需要安裝一個(gè)復(fù)雜的應(yīng)用服務(wù)器。MPS本身實(shí)際上是無狀態(tài)的,它在自己的主機(jī)池上運(yùn)行并依賴于上述的庫來進(jìn)行狀態(tài)管理。而狀態(tài)是分別并行處理的。
當(dāng)一個(gè)服務(wù)器在數(shù)據(jù)中心被“喚醒”(連接并配置好一個(gè)新的機(jī)架),它會(huì)每隔幾分鐘運(yùn)行一個(gè)本地代理。此代理會(huì)執(zhí)行以下步驟:
收集關(guān)于它自身的數(shù)據(jù)。(我在哪里?我有什么硬件?我正在運(yùn)行什么版本的軟件?)
根據(jù)問題對(duì)主機(jī)進(jìn)行分類。(是否是在active的集群中被喚醒的?磁盤運(yùn)轉(zhuǎn)是否正常?閃存卡是否正常?)
確保服務(wù)器已注冊(cè),核心庫系統(tǒng)中所包含的元數(shù)據(jù)保持最新。
在首次運(yùn)行中,如果沒有服務(wù)器的當(dāng)前記錄就將服務(wù)器上的實(shí)例置為初始的“reimage”狀態(tài)。這便是新服務(wù)器在MPS中生命的開端。
所以每隔幾分鐘,每臺(tái)正常的服務(wù)器都會(huì)到核心庫“報(bào)道”并更新其狀態(tài),同時(shí)同步數(shù)據(jù)使用和系統(tǒng)健康度之類的事項(xiàng)。
目前MPS管理的最小單元就是一個(gè)實(shí)例。每個(gè)實(shí)例可以處于不同的狀態(tài)。這些重要狀態(tài)如下所列:
生產(chǎn)狀態(tài):實(shí)例正在服務(wù)于生產(chǎn)環(huán)境的流量。
空閑狀態(tài):實(shí)例準(zhǔn)備被復(fù)制或被分配一些其他工作。
空閑分配狀態(tài):實(shí)例已被選中作為復(fù)制的對(duì)象,并且復(fù)制正在進(jìn)行中。
空閑解除分配狀態(tài):.臨時(shí)分流狀態(tài)。實(shí)例已經(jīng)改從生產(chǎn)環(huán)境移除并等待分流和清理。不會(huì)有實(shí)例在此狀態(tài)停留很久。
排出狀態(tài):實(shí)例未被使用,而是預(yù)留給測試,數(shù)據(jù)中心維護(hù)等。需要有人工干預(yù)使得主機(jī)脫離此狀態(tài)。
重塑(reimage)狀態(tài): 此狀態(tài)下,擁有所有實(shí)例的服務(wù)器正處在重塑或修復(fù)過程中。此狀態(tài)下的服務(wù)器會(huì)被移交并由一個(gè)稱為Windex的協(xié)同系統(tǒng)加以管理。
由于MPS執(zhí)行操作或是人工干預(yù),一個(gè)實(shí)例可能會(huì)在不同狀態(tài)間轉(zhuǎn)換。以下狀態(tài)表顯示了幾個(gè)主要狀態(tài)以及可能讓一個(gè)實(shí)例在不同狀態(tài)間轉(zhuǎn)換的操作。

上圖只展示了MPS中一個(gè)實(shí)例很小一部分的可能采取的路徑。這里所描述的狀態(tài)改變是簡單復(fù)制和維護(hù)操作的結(jié)果。還有很多其他原因可以讓實(shí)例改變狀態(tài),并且將所有操作和檢查都進(jìn)行硬編碼會(huì)讓軟件維護(hù)起來變得困難復(fù)雜。滿足“問題”是MPS中另一個(gè)基本概念。
“問題”是附屬于實(shí)例的一個(gè)屬性。如果一臺(tái)主機(jī)上所有的實(shí)例都有此問題,那么我們就會(huì)認(rèn)為它是附屬于服務(wù)器本身的。另外一種考慮問題的方式類似于標(biāo)簽。MPS會(huì)通過一個(gè)決策矩陣來協(xié)助有某個(gè)特定問題的實(shí)例做出決策。它基本上是一個(gè)個(gè)元組之間的映射(狀態(tài),問題)——(行動(dòng),狀態(tài))。
通過具體例子理解起來會(huì)更容易一些:
(生產(chǎn),低空閑)——(替換,空閑解除分配):用有限空間在生產(chǎn)中替代一個(gè)實(shí)例,同時(shí)將其遷移至一臺(tái)不同的服務(wù)器。
(空閑解除分配,舊內(nèi)核)——(遷移,重塑):如果一個(gè)實(shí)例在此狀態(tài)發(fā)生遷移,它就不會(huì)有生產(chǎn)數(shù)據(jù),那么為什么不對(duì)它進(jìn)行重塑呢?
(生產(chǎn),主實(shí)例位于撤退位置)——(升級(jí),生產(chǎn)):我們應(yīng)該把主實(shí)例升級(jí)至正確的位置,并將此實(shí)例置于生產(chǎn)狀態(tài)。
MPS中不同的狀態(tài)和“問題”使得我們可以創(chuàng)建一個(gè)靈活、可維護(hù)的基礎(chǔ)設(shè)施,用來管理服務(wù)器的整個(gè)生命周期。
MPS所解決的常見問題
在一個(gè)大型數(shù)據(jù)中心中,每天都會(huì)有幾十個(gè)甚至上百個(gè)的服務(wù)器故障發(fā)生。下面介紹一些不需要人工干預(yù),MPS就能自行處理的日常故障:
檢測到損壞的從實(shí)例并將其禁用,直到它們?cè)诤笈_(tái)被替換。
損壞的主實(shí)例降級(jí),這樣正常運(yùn)行的副本便會(huì)取代它們并在后臺(tái)進(jìn)行替換。
服務(wù)器上由于增長而耗盡空間的實(shí)例會(huì)被遷移至未充分使用的服務(wù)器。
當(dāng)數(shù)據(jù)中心中存在成千上萬臺(tái)服務(wù)器的時(shí)候,升級(jí)新內(nèi)核、改變分區(qū)大小或是升級(jí)控制器固件的維護(hù)工作會(huì)變得非常復(fù)雜。而對(duì)于像是遷移某些框架或是為工程團(tuán)隊(duì)分配測試服務(wù)器這些本地化操作也面臨同樣的問題。以下是一個(gè)運(yùn)維人員可以通過單一命令讓MPS執(zhí)行的常見維護(hù)操作:
將任意數(shù)量的數(shù)據(jù)庫服務(wù)器下架并移出生產(chǎn)環(huán)境。大多數(shù)這樣的操作可以在24小時(shí)內(nèi)完成。
在特定并發(fā)下重塑上萬臺(tái)機(jī)器(例如執(zhí)行內(nèi)核升級(jí))。MPS會(huì)替代每臺(tái)機(jī)器然后發(fā)送給Windex。
為一個(gè)新項(xiàng)目或測試分配任意數(shù)量的空閑空間。例如想要200臺(tái)服務(wù)器來運(yùn)行測試?完全沒問題。
在一個(gè)新數(shù)據(jù)中心的特定并發(fā)下,為整個(gè)Facebook數(shù)據(jù)集創(chuàng)建副本。
用MPS將基礎(chǔ)任務(wù)自動(dòng)化,這樣可以對(duì)我們所管理的服務(wù)器進(jìn)行更好的規(guī)劃,而且還能解放MySQL數(shù)據(jù)庫團(tuán)隊(duì)來讓他們從事更具挑戰(zhàn)的工作。

標(biāo)簽:興安盟 綏化 香港 丹東 西寧 濮陽 克拉瑪依 伊春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺析Facebook對(duì)MySQL數(shù)據(jù)庫的深度優(yōu)化》,本文關(guān)鍵詞  淺析,Facebook,對(duì),MySQL,數(shù)據(jù)庫,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺析Facebook對(duì)MySQL數(shù)據(jù)庫的深度優(yōu)化》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺析Facebook對(duì)MySQL數(shù)據(jù)庫的深度優(yōu)化的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    师宗县| 临猗县| 和顺县| 沙坪坝区| 河间市| 苗栗县| 武定县| 马山县| 达拉特旗| 渝中区| 崇信县| 南川市| 讷河市| 田东县| 宣城市| 康定县| 镇原县| 宁河县| 张家川| 长子县| 蛟河市| 栖霞市| 姜堰市| 德惠市| 砀山县| 蒙自县| 达孜县| 清苑县| 开阳县| 汝城县| 库尔勒市| 常宁市| 黔西| 探索| 金秀| 綦江县| 棋牌| 浦县| 锦屏县| 镶黄旗| 建始县|