通俗解釋「爲何數據庫難以拓展」

「如何通俗解釋「爲何數據庫難以拓展」」,這個問題來自 Quora,題主還補充說本身有一些數據庫的基本知識,但依然不理解爲何擴展數據庫如此困難。伯樂在線編譯摘編了這個問答貼的兩個熱門回覆。web

Paul King , Facebook 數據科學家(3.6K 贊)

要擴展數據庫有四大挑戰:搜索、併發性、一致性和速度。算法

假設你有一張清單,上面有10我的名。若是你想要查找某我的,只須要看一眼清單就行。數據庫

但若是清單上有100萬我的名呢?這時,你就須要一些策略了。電話簿把人名按照字母順序排列,這樣你就能夠略過不須要的部分了。這就是針對搜索問題的一種解決方案。服務器

若是有100萬人在同時使用這本電話簿呢?這就是併發性的問題。要麼你們在市政廳排長隊等待使用電話簿,要麼把電話簿複印100萬份——「主從複製」策略。若是你把這100萬份複印件放到每一個人的家裏——「分佈式」策略——你一樣能夠獲得快速響應。併發

若是有人電話號碼更換了呢?主從複製策略形成了一個問題:如今必須對100萬本電話簿做出更改。並且它們還在被使用呢,什麼時候才能進行更改呢?若是一本一本的更改,就可能形成數據一致性問題。若是所有回收並印發新的,就可能形成可用性問題。數據庫設計

若是每小時都有成百上千的人更換他們的電話號碼呢?這時你就面臨因爲「資源爭用」引發的嚴重的信息堵塞,這種堵塞還會致使「競態條件」(不可預知的輸出)和「死鎖」(數據庫的僵局)。分佈式

以上全部問題都有解決方案,但這些解決方案可能會很是複雜。好比,能夠經過發放電話簿的附錄(稱爲「修改日誌」)而不是從新打印它們,不過你得時時刻刻檢查你的附錄。你能夠按照修改日期發佈電話簿的新版本,這樣人們能夠同一時間交換它們以得到更高的一致性,不過這樣的話,電話簿就總會稍微有一點過期。佈局

如今,把規模擴展到有上百萬的用戶使用,數十億條數據分佈式的存儲在世界各地的數據中心中。網站

數據庫基本目標是維護一種假象,即它只有一份拷貝,同一時間只有一我的在修改它,全部人看到的都是最新的數據,而且能當即響應。當數據庫擴展到全球有上百萬的人使用和修改上以萬億計的數據時,這個目標就沒法達到了。spa

所以數據庫設計的任務是使用環環相扣的算法技巧以儘量的接近這一假象。


黃易山,Reddit 前 CEO,(2k 贊)

這裏有一個專門針對門外漢,例如徹底不懂數據庫的非技術人員的解釋。

(對於懂數據庫的人,請自行忽略這句話以及接下來這個類比中的一些小技術錯誤。)

「擴展」在不少方面都是很難的,可是首先我想要從根本上講爲何擴展很難——緣由是「擴展」並非一個單一方向的活動。總的來講,它的本質是把一個 複雜的系統變得「更好」——一般是更大或更多,並且一般很快就不得不這麼作。關鍵在於一個複雜的系統不能經過一個簡單的方法就能變得更大或更多產或更高效 ——一般系統的各個方面相互影響,因此若是你想要拓展某一部分,那麼其它部分一般會失效,從而你沒法獲得想要的擴展——你幾乎總要作一些重構

打個比方:

把數據庫想象成一個圖書館。你在那裏存放書籍或者叢書(好比全套的哈利波特系列叢書)。特別的,你的web應用也是一個圖書館,它存放圖書,方便的 提供人們閱讀。想象一下,這個圖書館出如今了TechCrunch上,變得很是受歡迎,如此一來你就忽然面臨了一系列的擴張問題。讓咱們列舉幾個問題,用 簡單的術語進行解釋:

例一:不少、不少書

你的圖書館愈來愈受歡迎。所以,你比當初開始創建圖書館的時候多了不少書,很長一段時間裏,你只是把它們放在房間的新書架上。可是目前的房子裏沒法 放下所有的書了。它們已經超出了你的小圖書館能夠承載的規模。你必須購買或者租賃相鄰的建築物,把書放在裏面。這可能會帶來一些問題,由於你附近的建築物 是有限的,或者房地產價格很是高以致於沒法持續的租賃隔壁那個很貴的房子。所以你必須認真思考租賃哪一個房子,如何找到那些距離很近又很合算的用於存放書籍 的房子。

這是真實的模擬,數據庫一般存儲在硬盤上,硬盤存放在有限的空間裏,你只能在一臺計算機(一個數據中心,一個機架)中存放許多的硬盤。爲了抗衡這個 廣泛的問題數據中心設計的很大,可是若是你是一個很是大的圖書館,你可能仍是會遇到這種限制,數據中心的機架沒法承受如此之多的硬盤,甚至你須要廢棄掉這 個數據中心並創建一個新的(這種狀況不多見)。儘管如此,問題的核心是無論你最開始有多少空間,你老是須要擴展它,而且你無法一直線性的在空間中增長「單 元」(比如在圖書室裏增長書架),你終會須要作出跨越性的改變,例如租賃隔壁的房子或者租賃又一個機架或者創建又一個數據中心。

例二:在書的海洋裏找書

當你的圖書館只佔用一個房間的時候,你只須要把全部的書按照字母順序排列放好就行。若是有人想要某本書,他只須要在房間裏順序查找到他想要的那本就好。這大約須要花費30分鐘。

如今你的圖書館很大,你租賃了不少房子。若是有人想要看某本書的話,他可能須要走遍全部的房子。人們根本不能接受找一本書須要花費這麼多的時間(和 人們承受網頁的加載時間相似)。人們只想要直接走到正確的房子裏,走到正確的樓層,走到正確的那個書架,直接拿到那本想要的書。他們根本不肯意花費超過半 小時的時間。

爲了實現這一目標,你得建立一個新的關聯繫統,叫作索引。現實中的圖書館確實遇到了這個問題,他們使用的解決方案是卡片目錄。以下圖所示:

年輕一代可能不知道這是什麼,由於這是計算機時代以前的產物。卡片目錄簡直就是個使用小抽屜和小紙片(卡片)的數據庫。由於它們太過笨重,因此咱們把它們數字化並放進了計算機中。若是你小於25歲的話,你可能根本沒見過它們。

卡片目錄(即索引)爲每本書建造了一個卡片,把卡片放進抽屜,按照標題、做者、主題等排序。若是你想要查找某本書,就直接使用卡片目錄——放在單獨 的一個房間裏——查找你要的書的卡片,卡片中會有這本書的具體所在位置。因此你只需花費10分鐘來檢索卡片,10分鐘走到正確的房子,5分鐘走到確切的樓 層和書架前,再花5分鐘找到確切的書。

若是一個圖書館變得太大了,它就須要引進卡片目錄,使得查找一本書須要的時間保持在合理的範圍內(例如半小時),不然就須要花好幾天來搜索遍全部房 子以找到一本書,這樣人們就不會使用這個圖書館了。這和僅僅只是租賃更多的房子並所有搜索有本質上的不一樣——這個例子說明當你在擴展中遇到門檻時,必需要 想出一個新的解決方案以克服問題——不只僅是增長書架,你還必須整理書目,打印出全部的卡片(這很困難,由於你必須遍歷全部的書,把他們按照做者、標題和 主題等排序,這很痛苦,由於你的書堆滿了好幾個房子),而後你得在圖書館靠門口的位置空出一個特殊的房間用於存放你的卡片目錄,告訴每一個人先檢查卡片。

例三:不少人同時查找同一本書

讓咱們舉一個超級簡單的例子來講明這個問題:你的圖書館如今很受歡迎,天天有成千上萬的人同時光臨。人山人海,摩肩接踵。這可不是聽起來那麼荒謬——這是當一個web應用忽然火起來時遇到的最廣泛的問題。

如今有好多人想要看同一本書以致於他們卡住了大門。這聽起來很荒謬,由於現實中這不多發生。可是想一想這個——現實中的大門能夠容許一秒鐘經過一個 人。所以若是每秒鐘有20我的想要進入你的圖書館, 那麼很快門口會排起長隊。愈來愈多的人到來,隊伍愈來愈長。最終,門口排隊的人數會超過在圖書館中的人數,大量等待的人羣口口相傳他們只能一直在門口等待 而永遠也沒法讀到一本書。看不到書而恨你的人比看到書而獲得知足的人多的多,壞口碑就產生了。

一個顯而易見的解決方案是在牆上開更多的門。你如今又開了一道門,兩倍的人涌入了!你開了更多的門,最終有上百個門,每面牆都擠滿了門。嘿,你只需移除全部的牆!這樣,更多的人可使用圖書館了!數量級的激增!

但很快你就會遇到另外一個問題,每本書所在的書架前只有有限的空間,只能給有限的人站立,也許他們速度能夠很快——他們瀏覽書架找到想要的書而後就離 開。可是他們依然須要在書架前站立幾秒鐘,但最終由於你的圖書館太受歡迎,成百上千的人都在查找同一本書(或者被查找的兩本書放在同一個垂直空間),他們 無法都擠在書架前的一小塊空地裏。

再一次,書架前排起了長隊——也許是全部的書架,也許只是某一個放着暢銷書的書架。如下是一些可能的解決方案:

若是人羣只是彙集在暢銷書架附近,那你只須要把暢銷書分散放在圖書館便可。但這樣,書本就再也不是按序擺放的了,它們變得隨機分佈,因此你就須要重構你的卡片目錄以使得人們能夠快速找到它們。這不是那麼痛苦——由於你僅僅只須要更新全部的暢銷書的卡片而已。

若是處處都人擠人,例如,全部的書都很受歡迎,或者僅僅是人太多,你能夠嘗試增長副本。也就是說,複製你的整個圖書館而後在城市的另外一邊(或者下一 個街區)租賃一些新的房子,把通常的人遷移到新圖書館去。你能夠這樣重複作幾回,增長一些副本。這樣作的話須要確保備份都是最新的,你必須確保全部的新書 在多個圖書館都有最新的備份。有一個解決方案是把其中一個圖書館稱爲「主」圖書館,全部的新書都只進入這一個圖書館,每次有新書進入時,你得派人複印這些 書並排一個快遞員把這些備份送到其它圖書館中。這些快遞員也須要佔用交通資源,這又限制了可使用你的圖書館的人數,所以你須要限制每一個圖書館的接待人 數,當人數過多的時候,你就要再新建一個圖書館了。

總結以下,最開始的時候你想要擴展你的圖書館以應對大量的人羣,你僅僅只是增長新的門,經過人數瞬間翻倍。你能夠再開一扇門再次增長經過人數。在一 段時間裏,你均可以經過增長新的門來擴展,直到你在全部的牆上都開滿了門——即你移除了全部的牆。在此以後你還想繼續擴展(記住,來你圖書館的人永不停息 的在增加),你就得想一個全新的解決方案了,好比創建幾個備份圖書館。這樣作形成不少影響——你得複印你全部的書,租賃新的房子,而後還得想出一個合理分 流的方案使得每一個圖書館的人數都很合理。全部的這些都是新的基礎設施,你無法等到你意識到須要開闢足夠多的門的時候再作這些,由於建設它們的時候訪問人數 依然在不斷增長,等待的人羣會很不滿意。因此你得根據訪問量的增加速率來預測當你開闢新門策略可能無效的時候就早早開始增長圖書館的數量。

例四:增長不少、不少新書

全部的圖書館都得與時俱進,也就意味着得不停的增長新書。讓咱們假設你有一個很活躍的圖書館,每時每刻都有成百上千的新書增長進來。

如此一來,你得安排人購買新書,在主圖書館複印它們,把這些書分散放到書架上。你有一個超級通暢的交通和足夠數量的圖書館們,即便快遞員們在各個圖書館之間遊走送達新書,也不會影響你的圖書館的訪問速度。太棒了,一切看起來都很贊,你決定今天終於能夠休個假了。

好的,你圖書館中全部的書都是排好序的,也就是說他們不是隨機的放在書架上,而是按照做者或者標題或者別的什麼排序擺放(在現實中,是按照杜威十進 分類法,當你在小學第一次接觸到它的時候確定以爲很荒謬,但一旦你明白了這些數據庫問題以後,很奇怪的,你就能明白它實際上是頗有意義的)不管如何,書本按 序排放,當有人經過卡片目錄找到某本書在某個書架上的時候,他不須要瀏覽整個書架來找到那本書——書架上的每本書都是按序排放的,因此能夠查閱書架中間的 書,選取他的左側或者右側繼續查閱,以此遞歸找到特定的書。不管什麼時候,全部的書都得排好序讓使用者能夠照此方法找書。

書架上的書按需排列,書架也走擺的滿滿的。也就意味着當快遞員想要把新書放進書架的時候,須要把排在末尾的書移到下一個書架上,下一個書架上的末尾 的書移到又一個書架上,以此往復。最終,你得從新設計書架,使其有一些空隙能夠放書,而再也不須要把書移到另外一個書架,這個過程是很惱人的,也很花費時間, 更重要的是,當你從新設計書架排放的時候,你不但願有其餘的使用者或者快遞員從這些書架上拿書或者放書。因此你得「鎖住」這些書架以及周圍的全部書架,以 防止你須要把書挪到別的書架上去,別的書架上的書又得挪到又一個別的書架上去等等。

這種鎖定形成了巨大的交通問題。問題從找書的時候須要等待其餘站立在書架前的人離開變成了大量的人羣須要等待在書架區的外圍,等待快遞員插入新書以 及移動書籍的位置。若是快遞員不少,那這個問題就會常常發生。大量的人羣須要等待某一個快遞員完成操做,更糟的是,一個快遞員可能須要等待另外一個快遞員。 在現實中,新書並不經常增長,但若是你運行一個網站有不少人同時上傳不少東西,這就等同於每時每刻都有有不少快遞員給圖書館快遞新書,你就會遇到上述的問 題。

同時,若是快遞員動做不夠快,例如無法把全部的備份同時送到全部的圖書館,那麼有些人不能找到某本書可是其餘人能夠,他們就會獲得相互矛盾的信息。

該問題的解決方案就給讀者留做練習吧。

要記住,解決該問題就得幫快遞員們想出一個全新的解決方案(也許能夠將臨近的書放在同一批次一塊兒更新,這樣一次就能夠在一個書架上更新不少書了), 或者改變圖書館的佈局方式(也許你能夠爲全部的書周圍都留下空位;但若是這些空位又被填滿了呢?)——總而言之,咱們能夠獲得以下的教訓:若是你的快遞員 數量很少,你天天新增的書本數量也很少,那這就不是什麼大問題,但若是你超過一個閥值(好比多如潮水的快遞員和新書)你就得改變你如今的整個解決方案和物 理佈局,而這每每須要想象力和創造力。

這就是爲何數據庫難以擴展的緣由。

事實上,這也是爲何擴展任何一個稍許複雜的系統(好比web應用,它包含了數據庫和其餘服務器及其交互)很難的緣由。參考一所完整的研究性大學 吧,它包含了實驗室、教室和宿舍等等,圖書館及其用途只是整個大學的組成之一。這些組成部分的任何一個的使用量的快速增加都會引起擴展問題。爲了克服這種 問題,你一般都得重構整個動態底層協議和重排操做協議(即你代碼裏的算法)或者你的資源佈局。實現這些老是須要創造性的努力而且不一樣系統的底層細節各不相 同,所以,只有一些通用的解決方案——上文提到了其中一些——你經常得調整這些通用解決方案以適應你的狀況:也許你很難租到房子用來當作複製圖書館;也許 你的書都是大百科全書,快遞員無法一次快遞不少本書;也許你那兒環境太冷,你無法開不少扇門,不然顧客就凍死了。適用於這個環境的解決方案無法徹底適用於 那個環境,因此你每次都不得不調整解決方案以適應眼前的環境,敏銳的觀察力是幫助你發現問題並找到最適宜該問題的解決方案的必備品。

最後要記住,當你從新設計解決方案的時候,會有愈來愈多的顧客敲你的門,衝你叫嚷,由於隊伍太長他們無法看到想看的書了!

哦,對了。你的圖書館可能會讓你的錢包邊的空空,讓你的心流血,由於你要購買足夠多的書架,租賃足夠多的房子,那你怎麼樣才能開始賺錢呢?全部的風險投資者都不想資助你,由於你竟然想讓顧客免費借書?你竟然不肯意插頁內廣告?

謝謝欣賞!^_^

相關文章
相關標籤/搜索