關(guān)于我們
書單推薦
新書推薦
|
數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)幕 本書旨在指導(dǎo)開發(fā)者理解現(xiàn)代數(shù)據(jù)庫(kù)和存儲(chǔ)引擎背后的內(nèi)部概念,包含從眾多書籍、論文、博客和多個(gè)開源數(shù)據(jù)庫(kù)源代碼中精心選取的相關(guān)材料。本書深入介紹了數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)構(gòu)建塊、分布式系統(tǒng)和數(shù)據(jù)集群,并且指出了現(xiàn)代數(shù)據(jù)庫(kù)之間最重要的區(qū)別在于決定存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)分布的子系統(tǒng)。本書分為兩部分:第一部分討論節(jié)點(diǎn)本地的進(jìn)程,并關(guān)注數(shù)據(jù)庫(kù)系統(tǒng)的核心組件——存儲(chǔ)引擎,以及最重要的一個(gè)特有元素;第二部分探討如何將多個(gè)節(jié)點(diǎn)組織到一個(gè)數(shù)據(jù)庫(kù)集群中。本書主要面向數(shù)據(jù)庫(kù)開發(fā)人員,以及使用數(shù)據(jù)庫(kù)系統(tǒng)構(gòu)建軟件的人員,如軟件開發(fā)人員、運(yùn)維工程師、架構(gòu)師和工程技術(shù)經(jīng)理。 適讀人群 :數(shù)據(jù)庫(kù)系統(tǒng)工程師、開發(fā)工程師、運(yùn)維工程師、存儲(chǔ)工程師及其他相關(guān)從業(yè)人員 本書從數(shù)據(jù)庫(kù)開發(fā)者角度,對(duì)現(xiàn)代數(shù)據(jù)庫(kù)技術(shù)進(jìn)行了全景式解讀,完全不拘泥于任何一款數(shù)據(jù)庫(kù)系統(tǒng),也不偏袒任何一種數(shù)據(jù)庫(kù)的類型或特性。這本書只會(huì)討論現(xiàn)代數(shù)據(jù)庫(kù)必不可少的那些東西,例如存儲(chǔ)格式、索引數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)一致性等,以及相關(guān)的許多選項(xiàng)與權(quán)衡。第一部分從單機(jī)的角度,介紹磁盤存儲(chǔ)格式、索引數(shù)據(jù)結(jié)構(gòu)、事務(wù)處理等,第二部分則以分布式系統(tǒng)切入,講解分布式數(shù)據(jù)庫(kù)的多副本、分布式事務(wù)、一致性等問(wèn)題。書中內(nèi)容的選材緊跟業(yè)內(nèi)前沿進(jìn)展,不僅有提及各種新興的數(shù)據(jù)庫(kù)產(chǎn)品,還有涉及許多來(lái)自學(xué)術(shù)界前沿的研究成果。不論你是一名有志于從事云計(jì)算領(lǐng)域的開發(fā)者,深入的研究數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),還是作為一名開發(fā)者,即將使用云數(shù)據(jù)庫(kù)以及云原生數(shù)據(jù)庫(kù),閱讀本書都會(huì)大有裨益。 分布式數(shù)據(jù)庫(kù)系統(tǒng)是大多數(shù)企業(yè)和絕大多數(shù)應(yīng)用程序不可或缺的一部分。這些應(yīng)用程序提供業(yè)務(wù)邏輯和用戶界面,而數(shù)據(jù)庫(kù)系統(tǒng)則負(fù)責(zé)確保數(shù)據(jù)的完整性、一致性和冗余性。 回到2000年,那時(shí)如果你要選擇一個(gè)數(shù)據(jù)庫(kù),則只有少數(shù)幾個(gè)選項(xiàng),而且其中大部分都屬于關(guān)系型數(shù)據(jù)庫(kù),因此它們之間的差異相對(duì)較小。當(dāng)然,這并不是說(shuō)所有數(shù)據(jù)庫(kù)都是完全相同的,只是它們的功能和使用場(chǎng)景都非常相似。 其中一些數(shù)據(jù)庫(kù)專注于水平擴(kuò)展(scale out),即通過(guò)運(yùn)行多個(gè)數(shù)據(jù)庫(kù)實(shí)例(表現(xiàn)得像是一個(gè)單一邏輯單元)來(lái)提高性能并增加容量,例如:Gamma數(shù)據(jù)庫(kù)機(jī)器項(xiàng)目、Teradata、Greenplum、Parallel DB2等。如今,水平擴(kuò)展仍然是客戶期望的最重要的數(shù)據(jù)庫(kù)特性之一,云服務(wù)的日益普及詮釋了這一點(diǎn)。相較于將數(shù)據(jù)庫(kù)遷移至更大型、功能更強(qiáng)大的計(jì)算機(jī)進(jìn)行垂直擴(kuò)展(scale up),啟動(dòng)一個(gè)新實(shí)例并將其添加到集群中通常要容易得多。因?yàn)檫w移可能會(huì)耗時(shí)冗長(zhǎng)且令人痛苦不堪,還可能會(huì)導(dǎo)致停機(jī)。 在2010年左右,一類新型的最終一致性數(shù)據(jù)庫(kù)開始逐步涌現(xiàn),并且一些諸如NoSQL、大數(shù)據(jù)等術(shù)語(yǔ)也日益流行。在過(guò)去的15年間,開源社區(qū)、大型互聯(lián)網(wǎng)公司和數(shù)據(jù)庫(kù)供應(yīng)商構(gòu)建了眾多的數(shù)據(jù)庫(kù)和工具,以至于當(dāng)人們?cè)谠噲D理解它們的使用場(chǎng)景、細(xì)節(jié)和規(guī)范時(shí)很容易迷失方向。 Amazon團(tuán)隊(duì)于2007年發(fā)布的Dynamo論文[DECANDIA07]對(duì)數(shù)據(jù)庫(kù)社區(qū)產(chǎn)生了相當(dāng)巨大的影響,在短時(shí)間內(nèi)它便激發(fā)出了許多變體和實(shí)現(xiàn)。其中最突出的是誕生于Facebook的Apache Cassandra、LinkedIn研發(fā)的Voldemort,以及由前Akamai工程師研發(fā)的Riak。 如今,該領(lǐng)域再次發(fā)生了變化:在鍵值存儲(chǔ)、NoSQL和最終一致性數(shù)據(jù)庫(kù)之后,我們開始看到一些可擴(kuò)展性更強(qiáng)、性能更高的數(shù)據(jù)庫(kù),它們能夠在保證具有更強(qiáng)一致性的同時(shí)執(zhí)行復(fù)雜的查詢。
本書的受眾 在技術(shù)會(huì)議的交流中,我經(jīng)常聽到同樣的問(wèn)題:“如何更多地了解有關(guān)數(shù)據(jù)庫(kù)內(nèi)部的原理?我甚至不知道從哪里開始!标P(guān)于數(shù)據(jù)庫(kù)系統(tǒng)的大多數(shù)書籍都沒(méi)有詳細(xì)介紹存儲(chǔ)引擎的實(shí)現(xiàn),并且只是在較高的層次上介紹了訪問(wèn)方法,例如B樹。很少有書籍涵蓋較新的概念,例如不同的B樹變體和日志結(jié)構(gòu)存儲(chǔ)(log-structured storage),因此我通常建議直接閱讀論文。 但是每個(gè)讀過(guò)論文的人都知道這并不容易:時(shí)常缺乏上下文,措辭可能含糊不清,論文之間甚至幾乎根本沒(méi)有聯(lián)系,論文本身也不容易找到。本書簡(jiǎn)要總結(jié)了重要的數(shù)據(jù)庫(kù)系統(tǒng)概念,并可以為希望深入研究的人們提供指南,也可以為已經(jīng)熟悉這些概念的人們提供備忘單。 并非每個(gè)人都希望成為數(shù)據(jù)庫(kù)開發(fā)者,但是本書也將為使用數(shù)據(jù)庫(kù)系統(tǒng)構(gòu)建軟件的人員提供幫助,如:軟件開發(fā)者、運(yùn)維工程師、架構(gòu)師和工程技術(shù)經(jīng)理。 如果你的公司依賴于任何基礎(chǔ)架構(gòu)組件,無(wú)論是數(shù)據(jù)庫(kù)、消息隊(duì)列、容器平臺(tái)還是任務(wù)調(diào)度器,你都必須通過(guò)閱讀項(xiàng)目變更日志(change-log)和郵件列表來(lái)與社區(qū)保持聯(lián)系、同步項(xiàng)目的最新進(jìn)展。理解術(shù)語(yǔ)并了解其中的工作原理將使你能夠從這些信息來(lái)源中獲取更多信息,并可以更高效地使用工具來(lái)進(jìn)行故障診斷,識(shí)別和避免潛在的風(fēng)險(xiǎn)與瓶頸。如果系統(tǒng)出現(xiàn)了某些問(wèn)題,那么對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的工作原理有一個(gè)全面和基本的了解將會(huì)對(duì)你有所幫助。利用這些知識(shí),在面對(duì)問(wèn)題時(shí),你將有能力提出假設(shè)、進(jìn)行驗(yàn)證、找到根本原因,并將其講解給其他項(xiàng)目成員。 本書也適合那些具備好奇心的人:喜歡學(xué)習(xí)一些不急用的知識(shí)的人,將空閑時(shí)間花在搗鼓一些有趣事情上的人。他們有的自己編寫編譯器,有的編寫自用的操作系統(tǒng)、文本編輯器、電腦游戲,有的學(xué)習(xí)編程語(yǔ)言—他們樂(lè)于獲取新知識(shí)。 本書假設(shè)讀者具有一些開發(fā)后端系統(tǒng)和以用戶身份使用數(shù)據(jù)庫(kù)系統(tǒng)的經(jīng)驗(yàn)。同時(shí),具備一些不同種類數(shù)據(jù)結(jié)構(gòu)的知識(shí)將有助于更快地吸收書中的知識(shí)。
為什么應(yīng)該閱讀本書 我們經(jīng)常聽到人們用他們實(shí)現(xiàn)的概念和算法來(lái)描述數(shù)據(jù)庫(kù)系統(tǒng):“該數(shù)據(jù)庫(kù)使用Gossip來(lái)進(jìn)行成員資格的傳播”(參見第12章)、“他們已經(jīng)實(shí)現(xiàn)了Dynamo”或“這就像他們?cè)赟panner論文中描述的一樣”(參見第13章)。抑或,如果你正在討論算法和數(shù)據(jù)結(jié)構(gòu),那么你會(huì)聽到類似于“ZAB和Raft有很多共同點(diǎn)”(參見第14章)、“Bw樹就像是在日志結(jié)構(gòu)化存儲(chǔ)上實(shí)現(xiàn)的B樹一樣”(參見第6章)或“它們使用的是類似于Blink樹中的同級(jí)指針”(參見第5章)的描述。 我們需要使用抽象來(lái)討論復(fù)雜的概念,但是我們不能在每次開啟一場(chǎng)對(duì)話時(shí)都討論抽象術(shù)語(yǔ)。以白話的形式來(lái)掌握這些抽象概念是一個(gè)捷徑,這能幫助我們將注意力轉(zhuǎn)移到其他更高層次的問(wèn)題上。 學(xué)習(xí)基本概念、證明和算法的一個(gè)優(yōu)點(diǎn)是它們永不過(guò)時(shí)。當(dāng)然,總會(huì)有新的東西出現(xiàn),但是新算法往往是在發(fā)現(xiàn)經(jīng)典算法的缺陷或改進(jìn)空間之后才被創(chuàng)造出來(lái)的。了解歷史有助于更好地理解這些算法之間的差異和它們的發(fā)明動(dòng)機(jī)。 學(xué)習(xí)這些內(nèi)容是鼓舞人心的。你將看到各種各樣的算法,了解我們的工業(yè)界是如何一個(gè)接一個(gè)地解決問(wèn)題的,并開始欣賞數(shù)據(jù)系統(tǒng)。同時(shí),學(xué)習(xí)這些是有回報(bào)的:你幾乎可以感覺(jué)到多個(gè)拼圖碎片在腦海中移動(dòng)到一起,最終形成一幅完整的圖畫,并且你將總是能夠與他人分享這幅圖畫。
本書的范疇 本書既不是關(guān)于關(guān)系型數(shù)據(jù)庫(kù)的書,也不是關(guān)于NoSQL的書,而是關(guān)于在各種數(shù)據(jù)庫(kù)系統(tǒng)中使用的算法和概念的書,且重點(diǎn)是存儲(chǔ)引擎和負(fù)責(zé)數(shù)據(jù)分布的組件。 諸如查詢計(jì)劃、查詢優(yōu)化、調(diào)度、關(guān)系模型等概念,在一些優(yōu)秀的數(shù)據(jù)庫(kù)系統(tǒng)教科書中已均有涉及。這些概念中的一部分通常是從用戶的角度進(jìn)行描述的,而本書則著重于內(nèi)部結(jié)構(gòu)。你可以在第二部分的總結(jié)和每章的小結(jié)中找到一些有用文獻(xiàn)的推薦。這些文獻(xiàn)應(yīng)該能回答很多與數(shù)據(jù)庫(kù)相關(guān)的問(wèn)題。 由于本書中提到的數(shù)據(jù)庫(kù)系統(tǒng)之間沒(méi)有一種通用的查詢語(yǔ)言,所以本書將不討論查詢語(yǔ)言。 為了收集本書的材料,我研究了15本書、300多篇論文、無(wú)數(shù)的博客文章、源代碼以及幾個(gè)開源數(shù)據(jù)庫(kù)的文檔。對(duì)于是否要在書中包含某個(gè)特定概念的原則,我常常會(huì)問(wèn)自己這樣一個(gè)問(wèn)題:“數(shù)據(jù)庫(kù)工業(yè)界和學(xué)術(shù)界的人都在談?wù)撨@個(gè)概念嗎?”如果答案是“是”,我便會(huì)將該概念添加到一個(gè)長(zhǎng)長(zhǎng)的討論清單里。
本書的結(jié)構(gòu) 市面上有一些支持可插拔組件的可擴(kuò)展數(shù)據(jù)庫(kù)的例子(例如[SCHWARZ86]),但它們較為少見。與此同時(shí),數(shù)據(jù)庫(kù)使用可插拔存儲(chǔ)的例子卻頗多。類似地,我們很少聽到數(shù)據(jù)庫(kù)供應(yīng)商談?wù)摬樵兊膱?zhí)行,但他們卻非常熱衷于討論其數(shù)據(jù)庫(kù)是如何保證一致性的。 數(shù)據(jù)庫(kù)系統(tǒng)之間最顯著的區(qū)別集中在兩個(gè)方面:如何存儲(chǔ)和分布數(shù)據(jù)(其他子系統(tǒng)有時(shí)也很重要,但這里不作介紹)。本書分為兩部分,討論了負(fù)責(zé)數(shù)據(jù)存儲(chǔ)(第一部分)和數(shù)據(jù)分布(第二部分)的子系統(tǒng)和組件。 第一部分討論節(jié)點(diǎn)本地的進(jìn)程,并關(guān)注存儲(chǔ)引擎,它是數(shù)據(jù)庫(kù)系統(tǒng)的核心組件以及最重要的一個(gè)特有元素。首先,我們從數(shù)據(jù)庫(kù)管理系統(tǒng)的架構(gòu)開始介紹,并提出幾種基于主存介質(zhì)和布局來(lái)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行分類的方法。隨后,我們將介紹存儲(chǔ)結(jié)構(gòu),并學(xué)習(xí)基于磁盤的存儲(chǔ)結(jié)構(gòu)與基于內(nèi)存的存儲(chǔ)結(jié)構(gòu)之間的區(qū)別。然后介紹B樹以及在磁盤上高效維護(hù)B樹結(jié)構(gòu)的算法,包括序列化、頁(yè)布局以及磁盤存儲(chǔ)形式。再之后,我們會(huì)討論B樹的一些變體,以說(shuō)明上述概念的作用以及受B樹所影響和啟發(fā)的數(shù)據(jù)結(jié)構(gòu)的多樣性。最后,我們將討論日志結(jié)構(gòu)存儲(chǔ)的幾種變體(它們通常用于實(shí)現(xiàn)文件和存儲(chǔ)系統(tǒng)),并介紹日志結(jié)構(gòu)存儲(chǔ)的起源以及使用它們的原因。 第二部分介紹如何將多個(gè)節(jié)點(diǎn)組織到一個(gè)數(shù)據(jù)庫(kù)集群中。我們從構(gòu)建具備容錯(cuò)性的分布式系統(tǒng)理論開始,進(jìn)而討論分布式系統(tǒng)與單節(jié)點(diǎn)應(yīng)用程序有何不同,以及我們?cè)诜植际江h(huán)境中面臨的問(wèn)題、約束和復(fù)雜性。之后,我們將深入研究分布式算法。其中,我們從故障檢測(cè)算法入手,這些算法通過(guò)檢測(cè)和報(bào)告故障并排除故障節(jié)點(diǎn)的方式來(lái)提高系統(tǒng)整體的性能和穩(wěn)定性。由于本書稍后討論的許多算法都依賴于集群領(lǐng)導(dǎo)權(quán)這個(gè)概念,所以我們將介紹幾種領(lǐng)導(dǎo)者選舉算法,并討論它們的使用范圍。分布式系統(tǒng)中最困難的事情之一就是要保證數(shù)據(jù)一致性,因此我們將討論復(fù)制的概念,緊接著討論一致性模型、副本之間可能存在的差異以及最終一致性。由于最終一致性系統(tǒng)有時(shí)會(huì)依賴于反熵進(jìn)行收斂,并依靠Gossip來(lái)進(jìn)行數(shù)據(jù)分發(fā),所以我們會(huì)討論幾種反熵和Gossip方法。最后,我們討論數(shù)據(jù)庫(kù)事務(wù)上下文中的邏輯一致性,并以共識(shí)算法結(jié)尾。 如果沒(méi)有書中提到的這些研究和出版物,我是不可能完成本書的。在本書中,方括號(hào)代表參考文獻(xiàn)的索引,例如[DECANDIA07]。你可以使用這些參考資料來(lái)更詳細(xì)地了解有關(guān)概念。 在每章最后的小結(jié)中都包含與該章內(nèi)容相關(guān)的進(jìn)一步研究的材料。
本書約定 本書使用了下述約定。 楷體 表示新術(shù)語(yǔ)。 斜體(Italic) 表示URL、電子郵件地址、文件名和文件擴(kuò)展名。 等寬字體(Constant width) 用于程序清單,以及段落中引用的程序元素,例如變量或函數(shù)名、數(shù)據(jù)庫(kù)、數(shù)據(jù)類型、環(huán)境變量、語(yǔ)句和關(guān)鍵詞。 這個(gè)圖標(biāo)表示提示或建議。 這個(gè)圖標(biāo)表示一般性說(shuō)明。 這個(gè)圖標(biāo)表示警告或提醒。
示例代碼 寫作本書的目的是幫助你完成工作,而書中的示例代碼則是為了幫助你更好地理解本書的內(nèi)容。通常,可以在程序或文檔中使用本書中的代碼,而不需要聯(lián)系O扲eilly獲得許可,除非需要大段地復(fù)制代碼。例如,使用本書中所提供的幾個(gè)代碼片段來(lái)編寫一個(gè)程序不需要得到我們的許可,但銷售或發(fā)布O扲eilly的配套CD-ROM則需要獲得許可。引用本書的示例代碼來(lái)回答一個(gè)問(wèn)題也不需要許可,將本書中的示例代碼的很大一部分放到自己的產(chǎn)品文檔中則需要獲得許可。 我們希望(但不強(qiáng)制)讀者在使用本書代碼時(shí)注明出處。出處的形式包含標(biāo)題、作者、出版社和ISBN,例如: Database Internals,作者Alex Petrov,由O扲eilly出版,書號(hào)978-1-492-04034-7 如果讀者覺(jué)得對(duì)示例代碼的使用超出了上面所給出的許可范圍,歡迎通過(guò)permission@oreilly.com聯(lián)系我們。 O'Reilly在線學(xué)習(xí)平臺(tái)(O'Reilly Online Learning) 近40年來(lái),O'Reilly Media致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來(lái)幫助眾多公司取得成功。 我們擁有獨(dú)一無(wú)二的專家和革新者組成的龐大網(wǎng)絡(luò),他們通過(guò)圖書、文章、會(huì)議和我們的在線學(xué)習(xí)平臺(tái)分享他們的知識(shí)和經(jīng)驗(yàn)。O扲eilly的在線學(xué)習(xí)平臺(tái)允許你按需訪問(wèn)現(xiàn)場(chǎng)培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及O扲eilly和200多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請(qǐng)?jiān)L問(wèn)http://oreilly.com。
聯(lián)系方式 對(duì)于本書,如果有任何意見或疑問(wèn),請(qǐng)按照以下地址聯(lián)系本書出版商。 美國(guó): O'Reilly Media,Inc. 1005 Gravenstein Highway North Sebastopol,CA 95472 中國(guó): 北京市西城區(qū)西直門南大街2號(hào)成銘大廈C座807室(100035) 奧萊利技術(shù)咨詢(北京)有限公司 本書配套網(wǎng)站(http://bit.ly/database-internals)列出了勘誤表、示例以及其他信息。 要詢問(wèn)技術(shù)問(wèn)題或?qū)Ρ緯岢鼋ㄗh,請(qǐng)發(fā)送電子郵件至bookquestions@oreilly.com。 關(guān)于書籍、課程、會(huì)議和新聞的更多信息,請(qǐng)?jiān)L問(wèn)我們的網(wǎng)站: http://www.oreilly.com http://www.oreilly.com.cn 我們?cè)贔acebook上的地址:http://facebook.com/oreilly 我們?cè)赥witter上的地址:http://twitter.com/oreillymedia 我們?cè)赮ouTube上的地址:http://www.youtube.com/oreillymedia
致謝 如果沒(méi)有數(shù)以百計(jì)的人辛勤撰寫相關(guān)研究論文和書籍,本書就不可能出版。這些論文和書籍是分布式數(shù)據(jù)系統(tǒng)思想的源泉,亦是這些思想的參考物,更是本書的參考來(lái)源。 我想對(duì)所有審閱本書手稿并提供反饋的人表示謝意,是你們確保了書中內(nèi)容與措辭的正確性:Dmitry Alimov、Peter Alvaro、Carlos Baquero、Jason Brown、Blake Eggleston、Marcus Eriksson、Francisco Fernández Casta、Joel Knighton、Eugene Lazin、Nate McCall、Christopher Meiklejohn、Tyler Neely、Maxim Neverov、Marina Petrova、Stefan Podkowinski、Edward Ribiero、Denis Rytsov、Kir Shatrov、Alex Sorokoumov、Massimiliano Tomassi及Ariel Weisberg。 當(dāng)然,如果沒(méi)有家人的支持,本書是不可能完成的,感謝我的妻子Marina和我的女兒Alexandra。這一路走來(lái)的每一步,她們都一直在支持我。 作者簡(jiǎn)介 Alex Petrov是一位數(shù)據(jù)基礎(chǔ)架構(gòu)工程師,數(shù)據(jù)庫(kù)和存儲(chǔ)系統(tǒng)的狂熱愛(ài)好者,Apache Cassandra 提交者和PMC成員,精通存儲(chǔ)、分布式系統(tǒng)和算法。
黃鵬程 畢業(yè)于北京郵電大學(xué),過(guò)去八年一直專注于數(shù)據(jù)庫(kù)和大數(shù)據(jù)平臺(tái)研發(fā)與架構(gòu)工作。畢業(yè)后就職于中國(guó)民生銀行,歷任軟件工程師及大數(shù)據(jù)基礎(chǔ)架構(gòu)團(tuán)隊(duì)負(fù)責(zé)人,目前為阿里云高級(jí)產(chǎn)品專家,負(fù)責(zé)阿里云數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品的設(shè)計(jì)與規(guī)劃工作。你可以通過(guò)搜索“gnuhpc”在LinkedIn或者微信上找到他。
傅宇 畢業(yè)于南京大學(xué)計(jì)算機(jī)系,專注于數(shù)據(jù)庫(kù)技術(shù),現(xiàn)任阿里云技術(shù)專家,擔(dān)任 PolarDB-X 分布式關(guān)系型數(shù)據(jù)庫(kù)內(nèi)核研發(fā)工作,在分布式事務(wù)、查詢優(yōu)化器、執(zhí)行器等方向略有經(jīng)驗(yàn),對(duì)數(shù)據(jù)庫(kù)和大數(shù)據(jù)領(lǐng)域充滿熱情。個(gè)人博客:https://ericfu.me,知乎賬號(hào) Eric Fu,歡迎與我交流!
張晨 畢業(yè)于上海交通大學(xué)。大數(shù)據(jù)、數(shù)據(jù)庫(kù)、分布式系統(tǒng)和函數(shù)式編程愛(ài)好者,F(xiàn)于Indeed東京擔(dān)任軟件工程師一職。你可以通過(guò) 我的個(gè)人主頁(yè)chasezhang.me了解更多信息。 前言 1 第一部分 存儲(chǔ)引擎 第1章 簡(jiǎn)介與概述 13 1.1 數(shù)據(jù)庫(kù)架構(gòu) 14 1.2 內(nèi)存數(shù)據(jù)庫(kù)與磁盤數(shù)據(jù)庫(kù) 16 1.3 面向列與面向行的數(shù)據(jù)庫(kù) 17 1.3.1 面向行的數(shù)據(jù)布局 18 1.3.2 面向列的數(shù)據(jù)布局 19 1.3.3 區(qū)別與優(yōu)化 20 1.3.4 寬列式存儲(chǔ) 20 1.4 數(shù)據(jù)文件和索引文件 21 1.4.1 數(shù)據(jù)文件 22 1.4.2 索引文件 23 1.4.3 間接的主索引 24 1.5 緩沖、不可變性和有序性 25 1.6 本章小結(jié) 26 第2章 B樹基礎(chǔ)知識(shí) 28 2.1 二分搜索樹 28 2.1.1 樹的平衡 29 2.1.2 基于磁盤存儲(chǔ)的樹 31 2.2 基于磁盤的結(jié)構(gòu) 32 2.2.1 機(jī)械硬盤 32 2.2.2 固態(tài)硬盤 32 2.2.3 磁盤存儲(chǔ)結(jié)構(gòu) 34 2.3 無(wú)處不在的B樹 35 2.3.1 B樹的層次結(jié)構(gòu) 36 2.3.2 分隔鍵 38 2.3.3 B樹查找復(fù)雜度 39 2.3.4 B樹查找算法 39 2.3.5 鍵的數(shù)目 40 2.3.6 B樹的節(jié)點(diǎn)分裂 40 2.3.7 B樹的節(jié)點(diǎn)合并 42 2.4 本章小結(jié) 43 第3章 文件格式 45 3.1 動(dòng)機(jī) 45 3.2 二進(jìn)制編碼 46 3.2.1 原始類型 46 3.2.2 字符串和變長(zhǎng)數(shù)據(jù) 48 3.2.3 按位打包的數(shù)據(jù):布爾值、枚舉值和標(biāo)志 48 3.3 通用原理 49 3.4 頁(yè)的結(jié)構(gòu) 51 3.5 分槽頁(yè) 51 3.6 單元格布局 53 3.7 將單元格放進(jìn)分槽頁(yè) 54 3.8 管理變長(zhǎng)數(shù)據(jù) 55 3.9 版本 56 3.10 校驗(yàn)和 57 3.11 本章小結(jié) 58 第4章 B樹的實(shí)現(xiàn) 59 4.1 頁(yè)頭 59 4.1.1 魔數(shù) 59 4.1.2 同級(jí)指針 60 4.1.3 最右指針 60 4.1.4 節(jié)點(diǎn)的高鍵 61 4.1.5 溢出頁(yè) 62 4.2 二分搜索 64 4.3 傳播分裂與合并 65 4.4 再平衡 67 4.5 僅在右側(cè)追加 68 4.6 壓縮 69 4.7 清掃與維護(hù) 70 4.7.1 更新和刪除導(dǎo)致的碎片 70 4.7.2 頁(yè)的碎片整理 71 4.8 本章小結(jié) 72 第5章 事務(wù)處理與恢復(fù) 74 5.1 緩沖區(qū)管理 75 5.1.1 緩存語(yǔ)義 77 5.1.2 緩存回收 77 5.1.3 在緩存中鎖定頁(yè) 78 5.1.4 頁(yè)置換 79 5.2 恢復(fù) 82 5.2.1 日志語(yǔ)義 83 5.2.2 操作日志與數(shù)據(jù)日志 84 5.2.3 steal和force策略 84 5.2.4 ARIES 85 5.3 并發(fā)控制 86 5.3.1 可串行化 86 5.3.2 事務(wù)隔離 87 5.3.3 讀異常和寫異常 88 5.3.4 隔離級(jí)別 88 5.3.5 樂(lè)觀并發(fā)控制 90 5.3.6 多版本并發(fā)控制 91 5.3.7 悲觀并發(fā)控制 91 5.3.8 基于鎖的并發(fā)控制 91 5.4 本章小結(jié) 98 第6章 B樹的變體 101 6.1 寫時(shí)復(fù)制 101 6.2 抽象節(jié)點(diǎn)更新 103 6.3 惰性B樹 103 6.3.1 WiredTiger 104 6.3.2 惰性自適應(yīng)樹 105 6.4 FD樹 106 6.4.1 分段級(jí)聯(lián) 106 6.4.2 對(duì)數(shù)級(jí)的有序段 108 6.5 Bw樹 108 6.5.1 更新鏈 109 6.5.2 用CAS控制并發(fā) 109 6.5.3 結(jié)構(gòu)修改操作 110 6.5.4 合并和垃圾收集 111 6.6 緩存無(wú)關(guān)B樹 112 6.7 本章小結(jié) 114 第7章 日志結(jié)構(gòu)存儲(chǔ) 116 7.1 LSM樹 117 7.1.1 LSM樹的結(jié)構(gòu) 118 7.1.2 更新與刪除 122 7.1.3 LSM樹的查找 123 7.1.4 合并迭代 124 7.1.5 協(xié)調(diào) 126 7.1.6 LSM樹的維護(hù) 126 7.2 讀寫放大與空間放大 129 7.3 實(shí)現(xiàn)細(xì)節(jié) 130 7.3.1 有序字符串表 130 7.3.2 布隆過(guò)濾器 132 7.3.3 跳表 133 7.3.4 磁盤訪問(wèn) 135 7.3.5 壓縮 136 7.4 無(wú)序LSM存儲(chǔ) 136 7.4.1 Bitcask 137 7.4.2 WiscKey 138 7.5 LSM樹中的并發(fā) 139 7.6 日志堆疊 140 7.6.1 閃存轉(zhuǎn)換層 141 7.6.2 文件系統(tǒng)日志記錄 142 7.7 LLAMA與精心堆疊 144 7.8 本章小結(jié) 145 第一部分總結(jié) 147 第二部分 分布式系統(tǒng) 第8章 簡(jiǎn)介與概述 151 8.1 并發(fā)執(zhí)行 151 8.2 分布式計(jì)算的誤區(qū) 153 8.2.1 處理 154 8.2.2 時(shí)鐘和時(shí)間 155 8.2.3 狀態(tài)一致性 156 8.2.4 本地和遠(yuǎn)程執(zhí)行 157 8.2.5 處理故障的需要 157 8.2.6 網(wǎng)絡(luò)分區(qū)和部分故障 157 8.2.7 級(jí)聯(lián)故障 158 8.3 分布式系統(tǒng)抽象 160 8.4 兩將軍問(wèn)題 165 8.5 FLP不可能定理 166 8.6 系統(tǒng)同步性 167 8.7 故障模型 167 8.7.1 崩潰故障 168 8.7.2 遺漏故障 168 8.7.3 任意故障 169 8.7.4 故障處理 169 8.8 本章小結(jié) 169 第9章 故障檢測(cè) 171 9.1 心跳和ping 172 9.1.1 無(wú)超時(shí)的故障檢測(cè)器 173 9.1.2 外包心跳 174 9.2 phi增量故障檢測(cè)器 175 9.3 Gossip和故障檢測(cè) 175 9.4 反向故障檢測(cè) 176 9.5 本章小結(jié) 177 第10章 領(lǐng)導(dǎo)者選舉 179 10.1 霸道選舉算法 180 10.2 依次故障轉(zhuǎn)移 181 10.3 候選節(jié)點(diǎn)/普通節(jié)點(diǎn)優(yōu)化 182 10.4 邀請(qǐng)算法 183 10.5 環(huán)算法 184 10.6 本章小結(jié) 185 第11章 復(fù)制和一致性 187 11.1 實(shí)現(xiàn)可用性 188 11.2 臭名昭著的CAP理論 188 11.2.1 小心使用CAP 189 11.2.2 收成與產(chǎn)量 190 11.3 共享內(nèi)存 191 11.4 順序 192 11.5 一致性模型 193 11.5.1 嚴(yán)格一致性 194 11.5.2 可線性化 194 11.5.3 順序一致性 198 11.5.4 因果一致性 199 11.6 會(huì)話模型 202 11.7 最終一致性 204 11.8 可調(diào)一致性 204 11.9 見證者副本 206 11.10 強(qiáng)最終一致性和CRDT 207 11.11 本章小結(jié) 209 第12章 反熵和傳播 212 12.1 讀修復(fù) 213 12.2 摘要讀 214 12.3 提示移交 215 12.4 Merkle樹 215 12.5 位圖版本向量 216 12.6 Gossip傳播 218 12.6.1 Gossip技術(shù)細(xì)節(jié) 219 12.6.2 覆蓋網(wǎng)絡(luò) 219 12.6.3 混合Gossip 220 12.6.4 局部視圖 221 12.7 本章小結(jié) 222 第13章 分布式事務(wù) 224 13.1 多個(gè)操作的原子性 225 13.2 兩階段提交 226 13.2.1 2PC中的參與者故障 227 13.2.2 2PC中的協(xié)調(diào)者故障 228 13.3 三階段提交 229 13.4 Calvin分布式事務(wù) 231 13.5 Spanner分布式事務(wù) 233 13.6 數(shù)據(jù)庫(kù)分區(qū) 235 13.7 Percolator分布式事務(wù) 236 13.8 協(xié)調(diào)避免 238 13.9 本章小結(jié) 240 第14章 共識(shí) 243 14.1 廣播 244 14.2 原子廣播 245 14.2.1 虛同步 245 14.2.2 Zookeeper原子廣播 246 14.3 Paxos 248 14.3.1 Paxos算法 249 14.3.2 Paxos的Quorum 250 14.3.3 故障場(chǎng)景 251 14.3.4 Multi-Paxos 253 14.3.5 快速Paxos 254 14.3.6 平等Paxos 255 14.3.7 柔性Paxos 257 14.3.8 共識(shí)的推廣解法 259 14.4 Raft 261 14.4.1 Raft中的領(lǐng)導(dǎo)者角色 263 14.4.2 故障場(chǎng)景 264 14.5 拜占庭共識(shí) 266 14.5.1 PBFT算法 266 14.5.2 恢復(fù)和檢查點(diǎn) 268 14.6 本章小結(jié) 269 第二部分總結(jié) 272 參考文獻(xiàn) 275
你還可能感興趣
我要評(píng)論
|