diff --git a/content/tw/part-i.md b/content/tw/part-i.md index 6180dc5..4317929 100644 --- a/content/tw/part-i.md +++ b/content/tw/part-i.md @@ -10,33 +10,44 @@ breadcrumbs: false 本書前四章介紹了資料系統底層的基礎概念,無論是在單臺機器上執行的單點資料系統,還是分佈在多臺機器上的分散式資料系統都適用。 -1. [第一章](/tw/ch1) 將介紹本書使用的術語和方法。**可靠性,可伸縮性和可維護性** ,這些詞彙到底意味著什麼?如何實現這些目標? -2. [第二章](/tw/ch2) 將對幾種不同的 **資料模型和查詢語言** 進行比較。從程式設計師的角度看,這是資料庫之間最明顯的區別。不同的資料模型適用於不同的應用場景。 -3. [第三章](/tw/ch3) 將深入 **儲存引擎** 內部,研究資料庫如何在磁碟上擺放資料。不同的儲存引擎針對不同的負載進行最佳化,選擇合適的儲存引擎對系統性能有巨大影響。 -4. [第四章](/tw/ch4) 將對幾種不同的 **資料編碼** 進行比較。特別研究了這些格式在應用需求經常變化、模式需要隨時間演變的環境中表現如何。 +1. [第一章](/tw/ch1) 將介紹 **資料系統架構中的利弊權衡**。我們將討論不同型別的資料系統(例如,分析型與事務型),以及它們在雲環境中的執行方式。 +2. [第二章](/tw/ch2) 將介紹非功能性需求的定義。。**可靠性,可伸縮性和可維護性** ,這些詞彙到底意味著什麼?如何實現這些目標? +3. [第三章](/tw/ch3) 將對幾種不同的 **資料模型和查詢語言** 進行比較。從程式設計師的角度看,這是資料庫之間最明顯的區別。不同的資料模型適用於不同的應用場景。 +4. [第四章](/tw/ch4) 將深入 **儲存引擎** 內部,研究資料庫如何在磁碟上擺放資料。不同的儲存引擎針對不同的負載進行最佳化,選擇合適的儲存引擎對系統性能有巨大影響。 +5. [第五章](/tw/ch5) 將對幾種不同的 **資料編碼** 進行比較。特別研究了這些格式在應用需求經常變化、模式需要隨時間演變的環境中表現如何。 -第二部分將專門討論在 **分散式資料系統** 中特有的問題。 +[第二部分](/tw/part-ii) 將專門討論在 **分散式資料系統** 中特有的問題。 -## 索引 +## [1. 資料系統架構中的權衡](/tw/ch1) +- [分析型與事務型系統](/tw/ch1#sec_introduction_analytics) +- [雲服務與自託管](/tw/ch1#sec_introduction_cloud) +- [分散式與單節點系統](/tw/ch1#sec_introduction_distributed) +- [資料系統、法律與社會](/tw/ch1#sec_introduction_compliance) +- [總結](/tw/ch1#summary) -* [第一章:可靠性、可伸縮性和可維護性](/tw/ch1) - * [關於資料系統的思考](/tw/ch1#關於資料系統的思考) - * [可靠性](/tw/ch1#可靠性) - * [可伸縮性](/tw/ch1#可伸縮性) - * [可維護性](/tw/ch1#可維護性) - * [本章小結](/tw/ch1#本章小結) -* [第二章:資料模型與查詢語言](/tw/ch2) - * [關係模型與文件模型](/tw/ch2#關係模型與文件模型) - * [資料查詢語言](/tw/ch2#資料查詢語言) - * [圖資料模型](/tw/ch2#圖資料模型) - * [本章小結](/tw/ch2#本章小結) -* [第三章:儲存與檢索](/tw/ch3) - * [驅動資料庫的資料結構](/tw/ch3#驅動資料庫的資料結構) - * [事務處理還是分析?](/tw/ch3#事務處理還是分析) - * [列式儲存](/tw/ch3#列式儲存) - * [本章小結](/tw/ch3#本章小結) -* [第四章:編碼與演化](/tw/ch4) - * [編碼資料的格式](/tw/ch4#編碼資料的格式) - * [資料流的型別](/tw/ch4#資料流的型別) - * [本章小結](/tw/ch4#本章小結) \ No newline at end of file +## [2. 定義非功能性需求](/tw/ch2) +- [案例研究:社交網路首頁時間線](/tw/ch2#sec_introduction_twitter) +- [描述效能](/tw/ch2#sec_introduction_percentiles) +- [可靠性與容錯](/tw/ch2#sec_introduction_reliability) +- [可伸縮性](/tw/ch2#sec_introduction_scalability) +- [可運維性](/tw/ch2#sec_introduction_maintainability) +- [總結](/tw/ch2#summary) + +## [3. 資料模型與查詢語言](/tw/ch3) +- [關係模型與文件模型](/tw/ch3#sec_datamodels_history) +- [圖資料模型](/tw/ch3#sec_datamodels_graph) +- [事件溯源與 CQRS](/tw/ch3#sec_datamodels_events) +- [資料框、矩陣與陣列](/tw/ch3#sec_datamodels_dataframes) +- [總結](/tw/ch3#summary) + +## [4. 儲存與檢索](/tw/ch4) +- [OLTP 系統的儲存與索引](/tw/ch4#sec_storage_oltp) +- [分析型資料儲存](/tw/ch4#sec_storage_analytics) +- [多維索引與全文索引](/tw/ch4#sec_storage_multidimensional) +- [總結](/tw/ch4#summary) + +## [5. 編碼與演化](/tw/ch5) +- [編碼資料的格式](/tw/ch5#sec_encoding_formats) +- [資料流的模式](/tw/ch5#sec_encoding_dataflow) +- [總結](/tw/ch5#summary) \ No newline at end of file diff --git a/content/tw/part-ii.md b/content/tw/part-ii.md index e928ae6..7e67eb9 100644 --- a/content/tw/part-ii.md +++ b/content/tw/part-ii.md @@ -15,106 +15,111 @@ breadcrumbs: false ------- -在本書的 [第一部分](/tw/part-i) 中,我們討論了資料系統的各個方面,但僅限於資料儲存在單臺機器上的情況。現在我們到了 [第二部分](/tw/part-ii),進入更高的層次,並提出一個問題:如果 **多臺機器** 參與資料的儲存和檢索,會發生什麼? +在本書的 [第一部分](/tw/part-i) 中,我們討論了資料系統的各個方面,但僅限於資料儲存在單臺機器上的情況。 +現在我們到了 [第二部分](/tw/part-ii),進入更高的層次,並提出一個問題:如果 **多臺機器** 參與資料的儲存和檢索,會發生什麼? 你可能會出於各種各樣的原因,希望將資料庫分佈到多臺機器上: -* 可伸縮性 +可伸縮性 +: 如果你的資料量、讀取負載、寫入負載超出單臺機器的處理能力,可以將負載分散到多臺計算機上。 - 如果你的資料量、讀取負載、寫入負載超出單臺機器的處理能力,可以將負載分散到多臺計算機上。 +容錯 / 高可用性 +: 如果你的應用需要在單臺機器(或多臺機器,網路或整個資料中心)出現故障的情況下仍然能繼續工作,則可使用多臺機器,以提供冗餘。一臺故障時,另一臺可以接管。 -* 容錯 / 高可用性 +延遲 +: 如果在世界各地都有使用者,你也許會考慮在全球範圍部署多個伺服器,從而每個使用者可以從地理上最近的資料中心獲取服務,避免了等待網路資料包穿越半個世界。 - 如果你的應用需要在單臺機器(或多臺機器,網路或整個資料中心)出現故障的情況下仍然能繼續工作,則可使用多臺機器,以提供冗餘。一臺故障時,另一臺可以接管。 +## 伸縮至更高的負載 -* 延遲 +如果你需要的只是伸縮至更高的 **負載(load)**,最簡單的方法就是購買更強大的機器(有時稱為 **垂直伸縮**,即 vertical scaling,或 **向上伸縮**,即 scale up)。許多處理器,記憶體和磁碟可以在同一個作業系統下相互連線,快速的相互連線允許任意處理器訪問記憶體或磁碟的任意部分。在這種 **共享記憶體架構(shared-memory architecture)** 中,所有的元件都可以看作一臺單獨的機器。 - 如果在世界各地都有使用者,你也許會考慮在全球範圍部署多個伺服器,從而每個使用者可以從地理上最近的資料中心獲取服務,避免了等待網路資料包穿越半個世界。 - -## 伸縮至更高的載荷 - -如果你需要的只是伸縮至更高的 **載荷(load)**,最簡單的方法就是購買更強大的機器(有時稱為 **垂直伸縮**,即 vertical scaling,或 **向上伸縮**,即 scale up)。許多處理器,記憶體和磁碟可以在同一個作業系統下相互連線,快速的相互連線允許任意處理器訪問記憶體或磁碟的任意部分。在這種 **共享記憶體架構(shared-memory architecture)** 中,所有的元件都可以看作一臺單獨的機器 [^i]。 - -[^i]: 在大型機中,儘管任意處理器都可以訪問記憶體的任意部分,但總有一些記憶體區域與一些處理器更接近(稱為 **非均勻記憶體訪問(nonuniform memory access, NUMA)**【1】)。為了有效利用這種架構特性,需要對處理進行細分,以便每個處理器主要訪問臨近的記憶體,這意味著即使表面上看起來只有一臺機器在執行,**分割槽(partitioning)** 仍然是必要的。 +> [!NOTE] +> 在大型機中,儘管任意處理器都可以訪問記憶體的任意部分,但總有一些記憶體區域與一些處理器更接近(稱為 **非均勻記憶體訪問(nonuniform memory access, NUMA)** [^1])。為了有效利用這種架構特性,需要對處理進行細分,以便每個處理器主要訪問臨近的記憶體,這意味著即使表面上看起來只有一臺機器在執行,**分割槽(partitioning)** 仍然是必要的。 共享記憶體方法的問題在於,成本增長速度快於線性增長:一臺有著雙倍處理器數量,雙倍記憶體大小,雙倍磁碟容量的機器,通常成本會遠遠超過原來的兩倍。而且可能因為存在瓶頸,並不足以處理雙倍的載荷。 共享記憶體架構可以提供有限的容錯能力,高階機器可以使用熱插拔的元件(不關機更換磁碟,記憶體模組,甚至處理器)—— 但它必然囿於單個地理位置的桎梏。 -另一種方法是 **共享磁碟架構(shared-disk architecture)**,它使用多臺具有獨立處理器和記憶體的機器,但將資料儲存在機器之間共享的磁碟陣列上,這些磁碟透過快速網路連線 [^ii]。這種架構用於某些資料倉庫,但競爭和鎖定的開銷限制了共享磁碟方法的可伸縮性【2】。 +另一種方法是 **共享磁碟架構(shared-disk architecture)**,它使用多臺具有獨立處理器和記憶體的機器,但將資料儲存在機器之間共享的磁碟陣列上,這些磁碟透過快速網路連線。這種架構用於某些資料倉庫,但競爭和鎖定的開銷限制了共享磁碟方法的可伸縮性 [^2]。 -[^ii]: 網路附屬儲存(Network Attached Storage, NAS),或 **儲存區網路(Storage Area Network, SAN)** +> [!NOTE] +> 網路附屬儲存(Network Attached Storage, NAS),或 **儲存區網路(Storage Area Network, SAN)** ### 無共享架構 -相比之下,**無共享架構**【3】(shared-nothing architecture,有時被稱為 **水平伸縮**,即 horizontal scaling,或 **向外伸縮**,即 scaling out)已經相當普及。在這種架構中,執行資料庫軟體的每臺機器 / 虛擬機器都稱為 **節點(node)**。每個節點只使用各自的處理器,記憶體和磁碟。節點之間的任何協調,都是在軟體層面使用傳統網路實現的。 +相比之下,**無共享架構** [^3](shared-nothing architecture,有時被稱為 **水平伸縮**,即 horizontal scaling,或 **向外伸縮**,即 scaling out)已經相當普及。 +在這種架構中,執行資料庫軟體的每臺機器 / 虛擬機器都稱為 **節點(node)**。每個節點只使用各自的處理器,記憶體和磁碟。節點之間的任何協調,都是在軟體層面使用傳統網路實現的。 -無共享系統不需要使用特殊的硬體,所以你可以用任意機器 —— 比如價效比最好的機器。你也許可以跨多個地理區域分佈資料從而減少使用者延遲,或者在損失一整個資料中心的情況下倖免於難。隨著雲端虛擬機器部署的出現,即使是小公司,現在無需 Google 級別的運維,也可以實現異地分散式架構。 +無共享系統不需要使用特殊的硬體,所以你可以用任意機器 —— 比如價效比最好的機器。你也許可以跨多個地理區域分佈資料從而減少使用者延遲,或者在損失一整個資料中心的情況下倖免於難。 +隨著雲端虛擬機器部署的出現,即使是小公司,現在無需 Google 級別的運維,也可以實現異地分散式架構。 -在這一部分裡,我們將重點放在無共享架構上。它不見得是所有場景的最佳選擇,但它是最需要你謹慎從事的架構。如果你的資料分佈在多個節點上,你需要意識到這樣一個分散式系統中約束和權衡 —— 資料庫並不能魔術般地把這些東西隱藏起來。 +在這一部分裡,我們將重點放在無共享架構上。它不見得是所有場景的最佳選擇,但它是最需要你謹慎從事的架構。 +如果你的資料分佈在多個節點上,你需要意識到這樣一個分散式系統中約束和權衡 —— 資料庫並不能魔術般地把這些東西隱藏起來。 + +雖然分散式無共享架構有許多優點,但它通常也會給應用帶來額外的複雜度,有時也會限制你可用資料模型的表達力。 +在某些情況下,一個簡單的單執行緒程式可以比一個擁有超過 100 個 CPU 核的叢集表現得更好 [^4]。另一方面,無共享系統可以非常強大。接下來的幾章,將詳細討論分散式資料會帶來的問題。 -雖然分散式無共享架構有許多優點,但它通常也會給應用帶來額外的複雜度,有時也會限制你可用資料模型的表達力。在某些情況下,一個簡單的單執行緒程式可以比一個擁有超過 100 個 CPU 核的叢集表現得更好【4】。另一方面,無共享系統可以非常強大。接下來的幾章,將詳細討論分散式資料會帶來的問題。 ### 複製 vs 分割槽 資料分佈在多個節點上有兩種常見的方式: -* 複製(Replication) +複製(Replication) +: 在幾個不同的節點上儲存資料的相同副本,可能放在不同的位置。複製提供了冗餘:如果一些節點不可用,剩餘的節點仍然可以提供資料服務。複製也有助於改善效能。[第六章](/tw/ch6) 將討論複製。 - 在幾個不同的節點上儲存資料的相同副本,可能放在不同的位置。複製提供了冗餘:如果一些節點不可用,剩餘的節點仍然可以提供資料服務。複製也有助於改善效能。[第五章](/tw/ch5) 將討論複製。 +分割槽 (Partitioning) +: 將一個大型資料庫拆分成較小的子集(稱為 **分割槽**,即 partitions),從而不同的分割槽可以指派給不同的 **節點**(nodes,亦稱 **分片**,即 sharding)。[第七章](/tw/ch7) 將討論分割槽。 -* 分割槽 (Partitioning) +複製和分割槽是不同的機制,但它們經常同時使用。如 [圖 II-1](#fig_replication_partitioning) 所示。 - 將一個大型資料庫拆分成較小的子集(稱為 **分割槽**,即 partitions),從而不同的分割槽可以指派給不同的 **節點**(nodes,亦稱 **分片**,即 sharding)。[第六章](/tw/ch6) 將討論分割槽。 +{{< figure src="/fig/ddia_08.png" id="fig_replication_partitioning" caption="圖 II-1 一個數據庫切分為兩個分割槽,每個分割槽都有兩個副本" class="w-full my-4" >}} -複製和分割槽是不同的機制,但它們經常同時使用。如 [圖 II-1](/img/figii-1.png) 所示。 -![](/img/figii-1.png) - -**圖 II-1 一個數據庫切分為兩個分割槽,每個分割槽都有兩個副本** - -理解了這些概念,就可以開始討論在分散式系統中需要做出的困難抉擇。[第七章](/tw/ch7) 將討論 **事務(Transaction)**,這對於瞭解資料系統中可能出現的各種問題,以及我們可以做些什麼很有幫助。[第八章](/tw/ch8) 和 [第九章](/tw/ch9) 將討論分散式系統的根本侷限性。 +理解了這些概念,就可以開始討論在分散式系統中需要做出的困難抉擇。[第八章](/tw/ch8) 將討論 **事務(Transaction)**,這對於瞭解資料系統中可能出現的各種問題,以及我們可以做些什麼很有幫助。 +[第九章](/tw/ch9) 和 [第十章](/tw/ch10) 將討論分散式系統的根本侷限性。 在本書的 [第三部分](/tw/part-iii) 中,將討論如何將多個(可能是分散式的)資料儲存整合為一個更大的系統,以滿足複雜的應用需求。但首先,我們來聊聊分散式的資料。 -## 索引 +## [6. 複製](/tw/ch6) +- [單主複製](/tw/ch6#sec_replication_leader) +- [複製延遲的問題](/tw/ch6#sec_replication_lag) +- [多主複製](/tw/ch6#sec_replication_multi_leader) +- [無主複製](/tw/ch6#sec_replication_leaderless) +- [總結](/tw/ch6#summary) -* [第五章:複製](/tw/ch5) - * [領導者與追隨者](/tw/ch5#領導者與追隨者) - * [複製延遲問題](/tw/ch5#複製延遲問題) - * [多主複製](/tw/ch5#多主複製) - * [無主複製](/tw/ch5#無主複製) - * [本章小結](/tw/ch5#本章小結) -* [第六章:分割槽](/tw/ch6) - * [分割槽與複製](/tw/ch6#分割槽與複製) - * [鍵值資料的分割槽](/tw/ch6#鍵值資料的分割槽) - * [分割槽與次級索引](/tw/ch6#分割槽與次級索引) - * [分割槽再平衡](/tw/ch6#分割槽再平衡) - * [請求路由](/tw/ch6#請求路由) - * [本章小結](/tw/ch6#本章小結) -* [第七章:事務](/tw/ch7) - * [事務的棘手概念](/tw/ch7#事務的棘手概念) - * [弱隔離級別](/tw/ch7#弱隔離級別) - * [可序列化](/tw/ch7#可序列化) - * [本章小結](/tw/ch7#本章小結) -* [第八章:分散式系統的麻煩](/tw/ch8) - * [故障與部分失效](/tw/ch8#故障與部分失效) - * [不可靠的網路](/tw/ch8#不可靠的網路) - * [不可靠的時鐘](/tw/ch8#不可靠的時鐘) - * [知識、真相與謊言](/tw/ch8#知識真相與謊言) - * [本章小結](/tw/ch8#本章小結) -* [第九章:一致性與共識](/tw/ch9) - * [一致性保證](/tw/ch9#一致性保證) - * [線性一致性](/tw/ch9#線性一致性) - * [順序保證](/tw/ch9#順序保證) - * [分散式事務與共識](/tw/ch9#分散式事務與共識) - * [本章小結](/tw/ch9#本章小結) +## [7. 分片](/tw/ch7) +- [分片的利與弊](/tw/ch7#sec_sharding_reasons) +- [鍵值資料的分片](/tw/ch7#sec_sharding_key_value) +- [請求路由](/tw/ch7#sec_sharding_routing) +- [分片與二級索引](/tw/ch7#sec_sharding_secondary_indexes) +- [總結](/tw/ch7#summary) + +## [8. 事務](/tw/ch8) +- [事務到底是什麼?](/tw/ch8#sec_transactions_overview) +- [弱隔離級別](/tw/ch8#sec_transactions_isolation_levels) +- [可序列化](/tw/ch8#sec_transactions_serializability) +- [分散式事務](/tw/ch8#sec_transactions_distributed) +- [總結](/tw/ch8#summary) +- [參考](/tw/ch8#參考) + +## [9. 分散式系統的麻煩](/tw/ch9) +- [故障與部分失效](/tw/ch9#sec_distributed_partial_failure) +- [不可靠的網路](/tw/ch9#sec_distributed_networks) +- [不可靠的時鐘](/tw/ch9#sec_distributed_clocks) +- [知識、真相和謊言](/tw/ch9#sec_distributed_truth) +- [總結](/tw/ch9#summary) + +## [10. 一致性與共識](/tw/ch10) +- [線性一致性](/tw/ch10#sec_consistency_linearizability) +- [ID 生成器和邏輯時鐘](/tw/ch10#sec_consistency_logical) +- [共識](/tw/ch10#sec_consistency_consensus) +- [總結](/tw/ch10#summary) -## 參考文獻 +### 參考 -1. Ulrich Drepper: “[What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf),” akka‐dia.org, November 21, 2007. -1. Ben Stopford: “[Shared Nothing vs. Shared Disk Architectures: An Independent View](http://www.benstopford.com/2009/11/24/understanding-the-shared-nothing-architecture/),” benstopford.com, November 24, 2009. -1. Michael Stonebraker: “[The Case for Shared Nothing](http://db.cs.berkeley.edu/papers/hpts85-nothing.pdf),” IEEE Database EngineeringBulletin, volume 9, number 1, pages 4–9, March 1986. -1. Frank McSherry, Michael Isard, and Derek G. Murray: “[Scalability! But at What COST?](http://www.frankmcsherry.org/assets/COST.pdf),” at 15th USENIX Workshop on Hot Topics in Operating Systems (HotOS),May 2015. \ No newline at end of file +[^1]: Ulrich Drepper: “[What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf),” akka‐dia.org, November 21, 2007. +[^2]: Ben Stopford: “[Shared Nothing vs. Shared Disk Architectures: An Independent View](http://www.benstopford.com/2009/11/24/understanding-the-shared-nothing-architecture/),” benstopford.com, November 24, 2009. +[^3]: Michael Stonebraker: “[The Case for Shared Nothing](http://db.cs.berkeley.edu/papers/hpts85-nothing.pdf),” IEEE Database EngineeringBulletin, volume 9, number 1, pages 4–9, March 1986. +[^4]: Frank McSherry, Michael Isard, and Derek G. Murray: “[Scalability! But at What COST?](http://www.frankmcsherry.org/assets/COST.pdf),” at 15th USENIX Workshop on Hot Topics in Operating Systems (HotOS),May 2015. \ No newline at end of file diff --git a/content/tw/part-iii.md b/content/tw/part-iii.md index 6331cf3..063dd02 100644 --- a/content/tw/part-iii.md +++ b/content/tw/part-iii.md @@ -18,13 +18,13 @@ breadcrumbs: false 從高層次上看,儲存和處理資料的系統可以分為兩大類: -* 記錄系統(System of record) +權威記錄系統(System of record) +: **記錄系統**,也被稱為 **真相源(source of truth)**,持有資料的權威版本。當新的資料進入時(例如,使用者輸入)首先會記錄在這裡。 + 每個事實正正好好表示一次(表示通常是 **正規化的**,即 normalized)。如果其他系統和 **記錄系統** 之間存在任何差異,那麼記錄系統中的值是正確的(根據定義)。 - **記錄系統**,也被稱為 **真相源(source of truth)**,持有資料的權威版本。當新的資料進入時(例如,使用者輸入)首先會記錄在這裡。每個事實正正好好表示一次(表示通常是 **正規化的**,即 normalized)。如果其他系統和 **記錄系統** 之間存在任何差異,那麼記錄系統中的值是正確的(根據定義)。 - -* 派生資料系統(Derived data systems) - - **派生系統** 中的資料,通常是另一個系統中的現有資料以某種方式進行轉換或處理的結果。如果丟失派生資料,可以從原始來源重新建立。典型的例子是 **快取(cache)**:如果資料在快取中,就可以由快取提供服務;如果快取不包含所需資料,則降級由底層資料庫提供。非規範化的值,索引和物化檢視亦屬此類。在推薦系統中,預測彙總資料通常衍生自使用者日誌。 +派生資料系統(Derived data systems) +: **派生系統** 中的資料,通常是另一個系統中的現有資料以某種方式進行轉換或處理的結果。如果丟失派生資料,可以從原始來源重新建立。 + 典型的例子是 **快取(cache)**:如果資料在快取中,就可以由快取提供服務;如果快取不包含所需資料,則降級由底層資料庫提供。非規範化的值,索引和物化檢視亦屬此類。在推薦系統中,預測彙總資料通常衍生自使用者日誌。 從技術上講,派生資料是 **冗餘的(redundant)**,因為它重複了已有的資訊。但是派生資料對於獲得良好的只讀查詢效能通常是至關重要的。它通常是非規範化的。可以從單個源頭衍生出多個不同的資料集,使你能從不同的 “視角” 洞察資料。 @@ -39,21 +39,25 @@ breadcrumbs: false 我們將從 [第十一章](/tw/ch11) 開始,研究例如 MapReduce 這樣 **面向批處理(batch-oriented)** 的資料流系統。對於建設大規模資料系統,我們將看到,它們提供了優秀的工具和思想。 [第十二章](/tw/ch12) 將把這些思想應用到 **流式資料(data streams)** 中,使我們能用更低的延遲完成同樣的任務。[第十三章](/ch13) 將對本書進行總結,探討如何使用這些工具來構建可靠,可伸縮和可維護的應用。 -## 索引 -* [第十章:批處理](/tw/ch11) - * [使用Unix工具的批處理](/tw/ch11#使用Unix工具的批處理) - * [MapReduce和分散式檔案系統](/tw/ch11#MapReduce和分散式檔案系統) - * [MapReduce之後](/tw/ch11#MapReduce之後) - * [本章小結](/tw/ch11#本章小結) -* [第十一章:流處理](/tw/ch12) - * [傳遞事件流](/tw/ch12#傳遞事件流) - * [資料庫與流](/tw/ch12#資料庫與流) - * [流處理](/tw/ch12#流處理) - * [本章小結](/tw/ch12#本章小結) -* [第十三章:做正確的事](/ch13) - * [資料整合](/ch13#資料整合) - * [分拆資料庫](/ch13#分拆資料庫) - * [將事情做正確](/ch13#將事情做正確) - * [做正確的事情](/ch13#做正確的事情) - * [本章小結](/ch13#本章小結) \ No newline at end of file +## [第十一章:批處理](/tw/ch11) +- [使用Unix工具的批處理](/tw/ch11#使用unix工具的批處理) +- [MapReduce和分散式檔案系統](/tw/ch11#mapreduce和分散式檔案系統) +- [MapReduce之後](/tw/ch11#mapreduce之後) +- [本章小結](/tw/ch11#本章小結) +- [參考文獻](/tw/ch11#參考文獻) + +## [第十二章:流處理](/tw/ch12) +- [傳遞事件流](/tw/ch12#傳遞事件流) +- [資料庫與流](/tw/ch12#資料庫與流) +- [流處理](/tw/ch12#流處理) +- [本章小結](/tw/ch12#本章小結) +- [參考文獻](/tw/ch12#參考文獻) + +## [第十三章:資料系統的未來](/ch13) +- [資料整合](/ch13#資料整合) +- [分拆資料庫](/ch13#分拆資料庫) +- [將事情做正確](/ch13#將事情做正確) +- [做正確的事情](/ch13#做正確的事情) +- [本章小結](/ch13#本章小結) +- [參考文獻](/ch13#參考文獻) \ No newline at end of file diff --git a/content/tw/toc.md b/content/tw/toc.md index 3b22f86..65a1585 100644 --- a/content/tw/toc.md +++ b/content/tw/toc.md @@ -11,16 +11,25 @@ breadcrumbs: false ## [序言](/tw/preface) +- [本書的目標讀者](/tw/preface#本書的目標讀者) +- [本書涉及的領域](/tw/preface#本書涉及的領域) +- [本書綱要](/tw/preface#本書綱要) +- [參考文獻與延伸閱讀](/tw/preface#參考文獻與延伸閱讀) +- [O‘Reilly Safari](/tw/preface#oreilly-safari) +- [致謝](/tw/preface#致謝) ## [1. 資料系統架構中的權衡](/tw/ch1) - - [分析型與事務型系統](/tw/ch1#sec_introduction_analytics) - [事務處理與分析的特徵](/tw/ch1#sec_introduction_oltp) - [資料倉庫](/tw/ch1#sec_introduction_dwh) + - [從資料倉庫到資料湖](/tw/ch1#from-data-warehouse-to-data-lake) + - [超越資料湖](/tw/ch1#beyond-the-data-lake) - [權威資料來源與派生資料](/tw/ch1#sec_introduction_derived) - [雲服務與自託管](/tw/ch1#sec_introduction_cloud) - [雲服務的利弊](/tw/ch1#sec_introduction_cloud_tradeoffs) - [雲原生系統架構](/tw/ch1#sec_introduction_cloud_native) + - [雲服務的分層](/tw/ch1#layering-of-cloud-services) + - [儲存與計算的分離](/tw/ch1#sec_introduction_storage_compute) - [雲時代的運維](/tw/ch1#sec_introduction_operations) - [分散式與單節點系統](/tw/ch1#sec_introduction_distributed) - [分散式系統的問題](/tw/ch1#sec_introduction_dist_sys_problems) @@ -28,10 +37,9 @@ breadcrumbs: false - [雲計算與超級計算](/tw/ch1#id17) - [資料系統、法律與社會](/tw/ch1#sec_introduction_compliance) - [總結](/tw/ch1#summary) - + - [參考](/tw/ch1#參考) ## [2. 定義非功能性需求](/tw/ch2) - - [案例研究:社交網路首頁時間線](/tw/ch2#sec_introduction_twitter) - [表示使用者、帖子與關注關係](/tw/ch2#id20) - [時間線的物化與更新](/tw/ch2#sec_introduction_materializing) @@ -42,80 +50,123 @@ breadcrumbs: false - [可靠性與容錯](/tw/ch2#sec_introduction_reliability) - [容錯](/tw/ch2#id27) - [硬體與軟體故障](/tw/ch2#sec_introduction_hardware_faults) + - [透過冗餘容忍硬體故障](/tw/ch2#tolerating-hardware-faults-through-redundancy) + - [軟體故障](/tw/ch2#software-faults) - [人類與可靠性](/tw/ch2#id31) - [可伸縮性](/tw/ch2#sec_introduction_scalability) - [描述負載](/tw/ch2#id33) - [共享記憶體、共享磁碟與無共享架構](/tw/ch2#sec_introduction_shared_nothing) - [可伸縮性原則](/tw/ch2#id35) -- [可維護性](/tw/ch2#sec_introduction_maintainability) - - [可操作性:讓運維更輕鬆](/tw/ch2#id37) +- [可運維性](/tw/ch2#sec_introduction_maintainability) + - [可運維性:讓運維更輕鬆](/tw/ch2#id37) - [簡單性:管理複雜度](/tw/ch2#id38) - [可演化性:讓變化更容易](/tw/ch2#sec_introduction_evolvability) - [總結](/tw/ch2#summary) - + - [參考](/tw/ch2#參考) ## [3. 資料模型與查詢語言](/tw/ch3) - - [關係模型與文件模型](/tw/ch3#sec_datamodels_history) - [物件關係不匹配](/tw/ch3#sec_datamodels_document) + - [物件關係對映(ORM)](/tw/ch3#object-relational-mapping-orm) + - [用於一對多關係的文件資料模型](/tw/ch3#the-document-data-model-for-one-to-many-relationships) - [規範化、反規範化與連線](/tw/ch3#sec_datamodels_normalization) + - [規範化的權衡](/tw/ch3#trade-offs-of-normalization) + - [社交網路案例研究中的反規範化](/tw/ch3#denormalization-in-the-social-networking-case-study) - [多對一與多對多關係](/tw/ch3#sec_datamodels_many_to_many) - [星型與雪花型:分析模式](/tw/ch3#sec_datamodels_analytics) - [何時使用哪種模型](/tw/ch3#sec_datamodels_document_summary) + - [文件模型中的模式靈活性](/tw/ch3#sec_datamodels_schema_flexibility) + - [讀寫的資料區域性](/tw/ch3#sec_datamodels_document_locality) + - [文件的查詢語言](/tw/ch3#query-languages-for-documents) + - [文件和關係資料庫的融合](/tw/ch3#convergence-of-document-and-relational-databases) - [圖資料模型](/tw/ch3#sec_datamodels_graph) - [屬性圖](/tw/ch3#id56) - [Cypher 查詢語言](/tw/ch3#id57) - [SQL 中的圖查詢](/tw/ch3#id58) - [三元組儲存與 SPARQL](/tw/ch3#id59) + - [RDF 資料模型](/tw/ch3#the-rdf-data-model) + - [SPARQL 查詢語言](/tw/ch3#the-sparql-query-language) - [Datalog:遞迴關係查詢](/tw/ch3#id62) - [GraphQL](/tw/ch3#id63) - [事件溯源與 CQRS](/tw/ch3#sec_datamodels_events) - [資料框、矩陣與陣列](/tw/ch3#sec_datamodels_dataframes) - [總結](/tw/ch3#summary) - + - [參考](/tw/ch3#參考) ## [4. 儲存與檢索](/tw/ch4) - - [OLTP 系統的儲存與索引](/tw/ch4#sec_storage_oltp) - [日誌結構儲存](/tw/ch4#sec_storage_log_structured) + - [SSTable 檔案格式](/tw/ch4#the-sstable-file-format) + - [構建和合並 SSTable](/tw/ch4#constructing-and-merging-sstables) + - [布隆過濾器](/tw/ch4#bloom-filters) + - [壓實策略](/tw/ch4#sec_storage_lsm_compaction) - [B 樹](/tw/ch4#sec_storage_b_trees) + - [使 B 樹可靠](/tw/ch4#sec_storage_btree_wal) + - [B 樹變體](/tw/ch4#b-tree-variants) - [比較 B 樹與 LSM 樹](/tw/ch4#sec_storage_btree_lsm_comparison) + - [讀取效能](/tw/ch4#read-performance) + - [順序與隨機寫入](/tw/ch4#sidebar_sequential) + - [寫放大](/tw/ch4#write-amplification) + - [磁碟空間使用](/tw/ch4#disk-space-usage) - [多列索引與二級索引](/tw/ch4#sec_storage_index_multicolumn) + - [在索引中儲存值](/tw/ch4#sec_storage_index_heap) - [全記憶體儲存](/tw/ch4#sec_storage_inmemory) - [分析型資料儲存](/tw/ch4#sec_storage_analytics) - [雲資料倉庫](/tw/ch4#sec_cloud_data_warehouses) - [列式儲存](/tw/ch4#sec_storage_column) + - [列壓縮](/tw/ch4#sec_storage_column_compression) + - [列儲存中的排序順序](/tw/ch4#sort-order-in-column-storage) + - [寫入列式儲存](/tw/ch4#writing-to-column-oriented-storage) - [查詢執行:編譯與向量化](/tw/ch4#sec_storage_vectorized) - [物化檢視與多維資料集](/tw/ch4#sec_storage_materialized_views) - [多維索引與全文索引](/tw/ch4#sec_storage_multidimensional) - [全文檢索](/tw/ch4#sec_storage_full_text) - [向量嵌入](/tw/ch4#id92) - [總結](/tw/ch4#summary) - + - [參考](/tw/ch4#參考) ## [5. 編碼與演化](/tw/ch5) - - [編碼資料的格式](/tw/ch5#sec_encoding_formats) - [特定語言的格式](/tw/ch5#id96) - [JSON、XML 及其二進位制變體](/tw/ch5#sec_encoding_json) + - [JSON 模式](/tw/ch5#json-schema) + - [二進位制編碼](/tw/ch5#binary-encoding) - [Protocol Buffers](/tw/ch5#sec_encoding_protobuf) + - [欄位標籤與模式演化](/tw/ch5#field-tags-and-schema-evolution) - [Avro](/tw/ch5#sec_encoding_avro) + - [寫入者模式與讀取者模式](/tw/ch5#the-writers-schema-and-the-readers-schema) + - [模式演化規則](/tw/ch5#schema-evolution-rules) + - [但什麼是寫入者模式?](/tw/ch5#but-what-is-the-writers-schema) + - [動態生成的模式](/tw/ch5#dynamically-generated-schemas) - [模式的優點](/tw/ch5#sec_encoding_schemas) - [資料流的模式](/tw/ch5#sec_encoding_dataflow) - [流經資料庫的資料流](/tw/ch5#sec_encoding_dataflow_db) + - [不同時間寫入的不同值](/tw/ch5#different-values-written-at-different-times) + - [歸檔儲存](/tw/ch5#archival-storage) - [流經服務的資料流:REST 與 RPC](/tw/ch5#sec_encoding_dataflow_rpc) + - [Web 服務](/tw/ch5#sec_web_services) + - [遠端過程呼叫(RPC)的問題](/tw/ch5#sec_problems_with_rpc) + - [負載均衡器、服務發現和服務網格](/tw/ch5#sec_encoding_service_discovery) + - [RPC 的資料編碼與演化](/tw/ch5#data-encoding-and-evolution-for-rpc) - [持久化執行與工作流](/tw/ch5#sec_encoding_dataflow_workflows) + - [持久化執行](/tw/ch5#durable-execution) - [事件驅動的架構](/tw/ch5#sec_encoding_dataflow_msg) + - [訊息代理](/tw/ch5#message-brokers) + - [分散式 actor 框架](/tw/ch5#distributed-actor-frameworks) - [總結](/tw/ch5#summary) - + - [參考](/tw/ch5#參考) ## [6. 複製](/tw/ch6) - - [單主複製](/tw/ch6#sec_replication_leader) - [同步複製與非同步複製](/tw/ch6#sec_replication_sync_async) - [設定新的副本](/tw/ch6#sec_replication_new_replica) - [處理節點故障](/tw/ch6#sec_replication_failover) + - [從節點故障:追趕恢復](/tw/ch6#follower-failure-catch-up-recovery) + - [領導者故障:故障轉移](/tw/ch6#leader-failure-failover) - [複製日誌的實現](/tw/ch6#sec_replication_implementation) + - [基於語句的複製](/tw/ch6#statement-based-replication) + - [預寫日誌(WAL)傳輸](/tw/ch6#write-ahead-log-wal-shipping) + - [邏輯(基於行)日誌複製](/tw/ch6#logical-row-based-log-replication) - [複製延遲的問題](/tw/ch6#sec_replication_lag) - [讀己之寫](/tw/ch6#sec_replication_ryw) - [單調讀](/tw/ch6#sec_replication_monotonic_reads) @@ -123,24 +174,44 @@ breadcrumbs: false - [複製延遲的解決方案](/tw/ch6#id131) - [多主複製](/tw/ch6#sec_replication_multi_leader) - [跨地域執行](/tw/ch6#sec_replication_multi_dc) + - [多主複製拓撲](/tw/ch6#sec_replication_topologies) + - [不同拓撲的問題](/tw/ch6#problems-with-different-topologies) - [同步引擎與本地優先軟體](/tw/ch6#sec_replication_offline_clients) + - [即時協作、離線優先和本地優先應用](/tw/ch6#real-time-collaboration-offline-first-and-local-first-apps) + - [同步引擎的利弊](/tw/ch6#pros-and-cons-of-sync-engines) - [處理寫入衝突](/tw/ch6#sec_replication_write_conflicts) + - [衝突避免](/tw/ch6#conflict-avoidance) + - [最後寫入者勝(丟棄併發寫入)](/tw/ch6#sec_replication_lww) + - [手動衝突解決](/tw/ch6#manual-conflict-resolution) + - [自動衝突解決](/tw/ch6#automatic-conflict-resolution) - [CRDT 與操作變換](/tw/ch6#sec_replication_crdts) + - [什麼是衝突?](/tw/ch6#what-is-a-conflict) - [無主複製](/tw/ch6#sec_replication_leaderless) - [當節點故障時寫入資料庫](/tw/ch6#id287) + - [追趕錯過的寫入](/tw/ch6#sec_replication_read_repair) + - [讀寫仲裁](/tw/ch6#sec_replication_quorum_condition) - [仲裁一致性的侷限](/tw/ch6#sec_replication_quorum_limitations) + - [監控陳舊性](/tw/ch6#monitoring-staleness) - [單主與無主複製的效能](/tw/ch6#sec_replication_leaderless_perf) + - [多地區操作](/tw/ch6#multi-region-operation) - [檢測併發寫入](/tw/ch6#sec_replication_concurrent) + - ["先發生"關係與併發](/tw/ch6#sec_replication_happens_before) + - [捕獲先發生關係](/tw/ch6#capturing-the-happens-before-relationship) + - [版本向量](/tw/ch6#version-vectors) - [總結](/tw/ch6#summary) - + - [參考](/tw/ch6#參考) ## [7. 分片](/tw/ch7) - - [分片的利與弊](/tw/ch7#sec_sharding_reasons) - [面向多租戶的分片](/tw/ch7#sec_sharding_multitenancy) - [鍵值資料的分片](/tw/ch7#sec_sharding_key_value) - [按鍵的範圍分片](/tw/ch7#sec_sharding_key_range) + - [重新平衡鍵範圍分片資料](/tw/ch7#rebalancing-key-range-sharded-data) - [按鍵的雜湊分片](/tw/ch7#sec_sharding_hash) + - [雜湊取模節點數](/tw/ch7#hash-modulo-number-of-nodes) + - [固定數量的分片](/tw/ch7#fixed-number-of-shards) + - [按雜湊範圍分片](/tw/ch7#sharding-by-hash-range) + - [一致性雜湊](/tw/ch7#sec_sharding_consistent_hashing) - [傾斜的工作負載與緩解熱點](/tw/ch7#sec_sharding_skew) - [運維:自動/手動再均衡](/tw/ch7#sec_sharding_operations) - [請求路由](/tw/ch7#sec_sharding_routing) @@ -148,71 +219,321 @@ breadcrumbs: false - [本地二級索引](/tw/ch7#id166) - [全域性二級索引](/tw/ch7#id167) - [總結](/tw/ch7#summary) - + - [References](/tw/ch7#references) ## [8. 事務](/tw/ch8) - - [事務到底是什麼?](/tw/ch8#sec_transactions_overview) - [ACID 的含義](/tw/ch8#sec_transactions_acid) + - [原子性](/tw/ch8#sec_transactions_acid_atomicity) + - [一致性](/tw/ch8#sec_transactions_acid_consistency) + - [隔離性](/tw/ch8#sec_transactions_acid_isolation) + - [永續性](/tw/ch8#durability) - [單物件與多物件操作](/tw/ch8#sec_transactions_multi_object) + - [單物件寫入](/tw/ch8#sec_transactions_single_object) + - [多物件事務的需求](/tw/ch8#sec_transactions_need) + - [處理錯誤和中止](/tw/ch8#handling-errors-and-aborts) - [弱隔離級別](/tw/ch8#sec_transactions_isolation_levels) - [讀已提交](/tw/ch8#sec_transactions_read_committed) + - [沒有髒讀](/tw/ch8#no-dirty-reads) + - [沒有髒寫](/tw/ch8#sec_transactions_dirty_write) + - [實現讀已提交](/tw/ch8#sec_transactions_read_committed_impl) - [快照隔離與可重複讀](/tw/ch8#sec_transactions_snapshot_isolation) + - [多版本併發控制(MVCC)](/tw/ch8#sec_transactions_snapshot_impl) + - [觀察一致快照的可見性規則](/tw/ch8#sec_transactions_mvcc_visibility) + - [索引與快照隔離](/tw/ch8#indexes-and-snapshot-isolation) + - [快照隔離、可重複讀和命名混淆](/tw/ch8#snapshot-isolation-repeatable-read-and-naming-confusion) - [防止丟失更新](/tw/ch8#sec_transactions_lost_update) + - [原子寫操作](/tw/ch8#atomic-write-operations) + - [顯式鎖定](/tw/ch8#explicit-locking) + - [自動檢測丟失的更新](/tw/ch8#automatically-detecting-lost-updates) + - [條件寫入(比較並設定)](/tw/ch8#sec_transactions_compare_and_set) + - [衝突解決與複製](/tw/ch8#conflict-resolution-and-replication) - [寫偏斜與幻讀](/tw/ch8#sec_transactions_write_skew) + - [描述寫偏斜](/tw/ch8#characterizing-write-skew) + - [更多寫偏斜的例子](/tw/ch8#more-examples-of-write-skew) + - [導致寫偏斜的幻讀](/tw/ch8#sec_transactions_phantom) + - [物化衝突](/tw/ch8#materializing-conflicts) - [可序列化](/tw/ch8#sec_transactions_serializability) - [實際序列執行](/tw/ch8#sec_transactions_serial) + - [將事務封裝在儲存過程中](/tw/ch8#encapsulating-transactions-in-stored-procedures) + - [儲存過程的利弊](/tw/ch8#sec_transactions_stored_proc_tradeoffs) + - [分片](/tw/ch8#sharding) + - [序列執行總結](/tw/ch8#summary-of-serial-execution) - [兩階段鎖定(2PL)](/tw/ch8#sec_transactions_2pl) + - [兩階段鎖定的實現](/tw/ch8#implementation-of-two-phase-locking) + - [兩階段鎖定的效能](/tw/ch8#performance-of-two-phase-locking) + - [謂詞鎖](/tw/ch8#predicate-locks) + - [索引範圍鎖](/tw/ch8#sec_transactions_2pl_range) - [可序列化快照隔離(SSI)](/tw/ch8#sec_transactions_ssi) + - [悲觀併發控制與樂觀併發控制](/tw/ch8#pessimistic-versus-optimistic-concurrency-control) + - [基於過時前提的決策](/tw/ch8#decisions-based-on-an-outdated-premise) + - [檢測陳舊的 MVCC 讀取](/tw/ch8#detecting-stale-mvcc-reads) + - [檢測影響先前讀取的寫入](/tw/ch8#sec_detecting_writes_affect_reads) + - [可序列化快照隔離的效能](/tw/ch8#performance-of-serializable-snapshot-isolation) - [分散式事務](/tw/ch8#sec_transactions_distributed) - [兩階段提交(2PC)](/tw/ch8#sec_transactions_2pc) + - [系統性的承諾](/tw/ch8#a-system-of-promises) + - [協調器故障](/tw/ch8#coordinator-failure) + - [三階段提交](/tw/ch8#three-phase-commit) - [跨不同系統的分散式事務](/tw/ch8#sec_transactions_xa) + - [精確一次訊息處理](/tw/ch8#sec_transactions_exactly_once) + - [XA 事務](/tw/ch8#xa-transactions) + - [存疑時持有鎖](/tw/ch8#holding-locks-while-in-doubt) + - [從協調器故障中恢復](/tw/ch8#recovering-from-coordinator-failure) + - [XA 事務的問題](/tw/ch8#problems-with-xa-transactions) - [資料庫內部的分散式事務](/tw/ch8#sec_transactions_internal) + - [再談精確一次訊息處理](/tw/ch8#exactly-once-message-processing-revisited) - [總結](/tw/ch8#summary) - +- [參考](/tw/ch8#參考) ## [9. 分散式系統的麻煩](/tw/ch9) - - [故障與部分失效](/tw/ch9#sec_distributed_partial_failure) - [不可靠的網路](/tw/ch9#sec_distributed_networks) - [TCP 的侷限性](/tw/ch9#sec_distributed_tcp) - - [實踐中的網路故障](/tw/ch9#sec_distributed_network_faults) - - [故障檢測](/tw/ch9#id307) - - [超時與無界延遲](/tw/ch9#sec_distributed_queueing) - - [同步網路與非同步網路](/tw/ch9#sec_distributed_sync_networks) + - [網路故障的實踐](/tw/ch9#sec_distributed_network_faults) + - [檢測故障](/tw/ch9#id307) + - [超時和無界延遲](/tw/ch9#sec_distributed_queueing) + - [網路擁塞和排隊](/tw/ch9#network-congestion-and-queueing) + - [同步與非同步網路](/tw/ch9#sec_distributed_sync_networks) + - [我們不能簡單地使網路延遲可預測嗎?](/tw/ch9#can-we-not-simply-make-network-delays-predictable) - [不可靠的時鐘](/tw/ch9#sec_distributed_clocks) - [單調時鐘與日曆時鐘](/tw/ch9#sec_distributed_monotonic_timeofday) - - [時鐘同步與準確性](/tw/ch9#sec_distributed_clock_accuracy) + - [日曆時鐘](/tw/ch9#time-of-day-clocks) + - [單調時鐘](/tw/ch9#monotonic-clocks) + - [時鐘同步和準確性](/tw/ch9#sec_distributed_clock_accuracy) - [對同步時鐘的依賴](/tw/ch9#sec_distributed_clocks_relying) + - [用於事件排序的時間戳](/tw/ch9#sec_distributed_lww) + - [帶置信區間的時鐘讀數](/tw/ch9#clock-readings-with-a-confidence-interval) + - [用於全域性快照的同步時鐘](/tw/ch9#sec_distributed_spanner) - [程序暫停](/tw/ch9#sec_distributed_clocks_pauses) -- [知識、真相與謊言](/tw/ch9#sec_distributed_truth) + - [響應時間保證](/tw/ch9#sec_distributed_clocks_realtime) + - [限制垃圾回收的影響](/tw/ch9#sec_distributed_gc_impact) +- [知識、真相和謊言](/tw/ch9#sec_distributed_truth) - [多數派原則](/tw/ch9#sec_distributed_majority) - - [分散式鎖與租約](/tw/ch9#sec_distributed_lock_fencing) + - [分散式鎖和租約](/tw/ch9#sec_distributed_lock_fencing) + - [隔離殭屍程序和延遲請求](/tw/ch9#sec_distributed_fencing_tokens) + - [多副本隔離](/tw/ch9#fencing-with-multiple-replicas) - [拜占庭故障](/tw/ch9#sec_distributed_byzantine) + - [弱形式的謊言](/tw/ch9#weak-forms-of-lying) - [系統模型與現實](/tw/ch9#sec_distributed_system_model) - - [形式化方法與隨機測試](/tw/ch9#sec_distributed_formal) + - [定義演算法的正確性](/tw/ch9#defining-the-correctness-of-an-algorithm) + - [安全性與活性](/tw/ch9#sec_distributed_safety_liveness) + - [將系統模型對映到現實世界](/tw/ch9#mapping-system-models-to-the-real-world) + - [形式化方法和隨機測試](/tw/ch9#sec_distributed_formal) + - [模型檢查與規範語言](/tw/ch9#model-checking-and-specification-languages) + - [故障注入](/tw/ch9#sec_fault_injection) + - [確定性模擬測試](/tw/ch9#deterministic-simulation-testing) - [總結](/tw/ch9#summary) - + - [參考](/tw/ch9#參考) ## [10. 一致性與共識](/tw/ch10) - - [線性一致性](/tw/ch10#sec_consistency_linearizability) - [什麼使系統具有線性一致性?](/tw/ch10#sec_consistency_lin_definition) - [依賴線性一致性](/tw/ch10#sec_consistency_linearizability_usage) + - [鎖定與領導者選舉](/tw/ch10#locking-and-leader-election) + - [約束與唯一性保證](/tw/ch10#sec_consistency_uniqueness) + - [跨通道時序依賴](/tw/ch10#cross-channel-timing-dependencies) - [實現線性一致性系統](/tw/ch10#sec_consistency_implementing_linearizable) + - [線性一致性與仲裁](/tw/ch10#sec_consistency_quorum_linearizable) - [線性一致性的代價](/tw/ch10#sec_linearizability_cost) -- [ID 生成器與邏輯時鐘](/tw/ch10#sec_consistency_logical) + - [CAP 定理](/tw/ch10#the-cap-theorem) + - [線性一致性與網路延遲](/tw/ch10#linearizability-and-network-delays) +- [ID 生成器和邏輯時鐘](/tw/ch10#sec_consistency_logical) - [邏輯時鐘](/tw/ch10#sec_consistency_timestamps) + - [Lamport 時間戳](/tw/ch10#lamport-timestamps) + - [混合邏輯時鐘](/tw/ch10#hybrid-logical-clocks) + - [Lamport/混合邏輯時鐘 vs. 向量時鐘](/tw/ch10#lamporthybrid-logical-clocks-vs-vector-clocks) - [線性一致的 ID 生成器](/tw/ch10#sec_consistency_linearizable_id) + - [實現線性一致的 ID 生成器](/tw/ch10#implementing-a-linearizable-id-generator) + - [使用邏輯時鐘強制約束](/tw/ch10#enforcing-constraints-using-logical-clocks) - [共識](/tw/ch10#sec_consistency_consensus) - [共識的多面性](/tw/ch10#sec_consistency_faces) + - [單值共識](/tw/ch10#single-value-consensus) + - [比較並設定作為共識](/tw/ch10#compare-and-set-as-consensus) + - [共享日誌作為共識](/tw/ch10#sec_consistency_shared_logs) + - [獲取並增加作為共識](/tw/ch10#fetch-and-add-as-consensus) + - [原子提交作為共識](/tw/ch10#atomic-commitment-as-consensus) - [共識的實踐](/tw/ch10#sec_consistency_total_order) - - [協調服務](/tw/ch10#sec_consistency_coordination) + - [使用共享日誌](/tw/ch10#sec_consistency_smr) + - [從單主複製到共識](/tw/ch10#from-single-leader-replication-to-consensus) + - [共識的微妙之處](/tw/ch10#subtleties-of-consensus) + - [共識的利弊](/tw/ch10#pros-and-cons-of-consensus) - [總結](/tw/ch10#summary) + - [參考文獻](/tw/ch10#參考文獻) +## [第十一章:批處理](/tw/ch11) +- [使用Unix工具的批處理](/tw/ch11#使用unix工具的批處理) + - [簡單日誌分析](/tw/ch11#簡單日誌分析) + - [命令鏈與自定義程式](/tw/ch11#命令鏈與自定義程式) + - [排序 VS 記憶體中的聚合](/tw/ch11#排序-vs-記憶體中的聚合) + - [Unix哲學](/tw/ch11#unix哲學) + - [統一的介面](/tw/ch11#統一的介面) + - [邏輯與佈線相分離](/tw/ch11#邏輯與佈線相分離) + - [透明度和實驗](/tw/ch11#透明度和實驗) +- [MapReduce和分散式檔案系統](/tw/ch11#mapreduce和分散式檔案系統) + - [MapReduce作業執行](/tw/ch11#mapreduce作業執行) + - [分散式執行MapReduce](/tw/ch11#分散式執行mapreduce) + - [MapReduce工作流](/tw/ch11#mapreduce工作流) + - [Reduce側連線與分組](/tw/ch11#reduce側連線與分組) + - [示例:使用者活動事件分析](/tw/ch11#示例使用者活動事件分析) + - [排序合併連線](/tw/ch11#排序合併連線) + - [把相關資料放在一起](/tw/ch11#把相關資料放在一起) + - [分組](/tw/ch11#分組) + - [處理偏斜](/tw/ch11#處理偏斜) + - [Map側連線](/tw/ch11#map側連線) + - [廣播雜湊連線](/tw/ch11#廣播雜湊連線) + - [分割槽雜湊連線](/tw/ch11#分割槽雜湊連線) + - [Map側合併連線](/tw/ch11#map側合併連線) + - [MapReduce工作流與Map側連線](/tw/ch11#mapreduce工作流與map側連線) + - [批處理工作流的輸出](/tw/ch11#批處理工作流的輸出) + - [建立搜尋索引](/tw/ch11#建立搜尋索引) + - [鍵值儲存作為批處理輸出](/tw/ch11#鍵值儲存作為批處理輸出) + - [批處理輸出的哲學](/tw/ch11#批處理輸出的哲學) + - [Hadoop與分散式資料庫的對比](/tw/ch11#hadoop與分散式資料庫的對比) + - [儲存多樣性](/tw/ch11#儲存多樣性) + - [處理模型的多樣性](/tw/ch11#處理模型的多樣性) + - [針對頻繁故障設計](/tw/ch11#針對頻繁故障設計) +- [MapReduce之後](/tw/ch11#mapreduce之後) + - [物化中間狀態](/tw/ch11#物化中間狀態) + - [資料流引擎](/tw/ch11#資料流引擎) + - [容錯](/tw/ch11#容錯) + - [關於物化的討論](/tw/ch11#關於物化的討論) + - [圖與迭代處理](/tw/ch11#圖與迭代處理) + - [Pregel處理模型](/tw/ch11#pregel處理模型) + - [容錯](/tw/ch11#容錯) + - [並行執行](/tw/ch11#並行執行) + - [高階API和語言](/tw/ch11#高階api和語言) + - [向宣告式查詢語言的轉變](/tw/ch11#向宣告式查詢語言的轉變) + - [專業化的不同領域](/tw/ch11#專業化的不同領域) +- [本章小結](/tw/ch11#本章小結) +- [參考文獻](/tw/ch11#參考文獻) + +## [第十二章:流處理](/tw/ch12) +- [傳遞事件流](/tw/ch12#傳遞事件流) + - [訊息傳遞系統](/tw/ch12#訊息傳遞系統) + - [直接從生產者傳遞給消費者](/tw/ch12#直接從生產者傳遞給消費者) + - [訊息代理](/tw/ch12#訊息代理) + - [訊息代理與資料庫的對比](/tw/ch12#訊息代理與資料庫的對比) + - [多個消費者](/tw/ch12#多個消費者) + - [確認與重新傳遞](/tw/ch12#確認與重新傳遞) + - [分割槽日誌](/tw/ch12#分割槽日誌) + - [使用日誌進行訊息儲存](/tw/ch12#使用日誌進行訊息儲存) + - [日誌與傳統的訊息傳遞相比](/tw/ch12#日誌與傳統的訊息傳遞相比) + - [消費者偏移量](/tw/ch12#消費者偏移量) + - [磁碟空間使用](/tw/ch12#磁碟空間使用) + - [當消費者跟不上生產者時](/tw/ch12#當消費者跟不上生產者時) + - [重播舊訊息](/tw/ch12#重播舊訊息) +- [資料庫與流](/tw/ch12#資料庫與流) + - [保持系統同步](/tw/ch12#保持系統同步) + - [變更資料捕獲](/tw/ch12#變更資料捕獲) + - [變更資料捕獲的實現](/tw/ch12#變更資料捕獲的實現) + - [初始快照](/tw/ch12#初始快照) + - [日誌壓縮](/tw/ch12#日誌壓縮) + - [變更流的API支援](/tw/ch12#變更流的api支援) + - [事件溯源](/tw/ch12#事件溯源) + - [從事件日誌中派生出當前狀態](/tw/ch12#從事件日誌中派生出當前狀態) + - [命令和事件](/tw/ch12#命令和事件) + - [狀態、流和不變性](/tw/ch12#狀態流和不變性) + - [不可變事件的優點](/tw/ch12#不可變事件的優點) + - [從同一事件日誌中派生多個檢視](/tw/ch12#從同一事件日誌中派生多個檢視) + - [併發控制](/tw/ch12#併發控制) + - [不變性的侷限性](/tw/ch12#不變性的侷限性) +- [流處理](/tw/ch12#流處理) + - [流處理的應用](/tw/ch12#流處理的應用) + - [複合事件處理](/tw/ch12#複合事件處理) + - [流分析](/tw/ch12#流分析) + - [維護物化檢視](/tw/ch12#維護物化檢視) + - [在流上搜索](/tw/ch12#在流上搜索) + - [訊息傳遞和RPC](/tw/ch12#訊息傳遞和rpc) + - [時間推理](/tw/ch12#時間推理) + - [事件時間與處理時間](/tw/ch12#事件時間與處理時間) + - [知道什麼時候準備好了](/tw/ch12#知道什麼時候準備好了) + - [你用的是誰的時鐘?](/tw/ch12#你用的是誰的時鐘) + - [視窗的型別](/tw/ch12#視窗的型別) + - [流連線](/tw/ch12#流連線) + - [流流連線(視窗連線)](/tw/ch12#流流連線視窗連線) + - [流表連線(流擴充)](/tw/ch12#流表連線流擴充) + - [表表連線(維護物化檢視)](/tw/ch12#表表連線維護物化檢視) + - [連線的時間依賴性](/tw/ch12#連線的時間依賴性) + - [容錯](/tw/ch12#容錯) + - [微批次與存檔點](/tw/ch12#微批次與存檔點) + - [原子提交再現](/tw/ch12#原子提交再現) + - [冪等性](/tw/ch12#冪等性) + - [失敗後重建狀態](/tw/ch12#失敗後重建狀態) +- [本章小結](/tw/ch12#本章小結) +- [參考文獻](/tw/ch12#參考文獻) + +## [第十三章:資料系統的未來](/ch13) +- [資料整合](/ch13#資料整合) + - [組合使用派生資料的工具](/ch13#組合使用派生資料的工具) + - [理解資料流](/ch13#理解資料流) + - [派生資料與分散式事務](/ch13#派生資料與分散式事務) + - [全序的限制](/ch13#全序的限制) + - [排序事件以捕獲因果關係](/ch13#排序事件以捕獲因果關係) + - [批處理與流處理](/ch13#批處理與流處理) + - [維護衍生狀態](/ch13#維護衍生狀態) + - [應用演化後重新處理資料](/ch13#應用演化後重新處理資料) + - [Lambda架構](/ch13#lambda架構) + - [統一批處理和流處理](/ch13#統一批處理和流處理) +- [分拆資料庫](/ch13#分拆資料庫) + - [組合使用資料儲存技術](/ch13#組合使用資料儲存技術) + - [建立索引](/ch13#建立索引) + - [一切的元資料庫](/ch13#一切的元資料庫) + - [開展分拆工作](/ch13#開展分拆工作) + - [分拆系統vs整合系統](/ch13#分拆系統vs整合系統) + - [少了什麼?](/ch13#少了什麼) + - [圍繞資料流設計應用](/ch13#圍繞資料流設計應用) + - [應用程式碼作為衍生函式](/ch13#應用程式碼作為衍生函式) + - [應用程式碼和狀態的分離](/ch13#應用程式碼和狀態的分離) + - [資料流:應用程式碼與狀態變化的互動](/ch13#資料流應用程式碼與狀態變化的互動) + - [流處理器和服務](/ch13#流處理器和服務) + - [觀察派生資料狀態](/ch13#觀察派生資料狀態) + - [物化檢視和快取](/ch13#物化檢視和快取) + - [有狀態、可離線的客戶端](/ch13#有狀態可離線的客戶端) + - [將狀態變更推送給客戶端](/ch13#將狀態變更推送給客戶端) + - [端到端的事件流](/ch13#端到端的事件流) + - [讀也是事件](/ch13#讀也是事件) + - [多分割槽資料處理](/ch13#多分割槽資料處理) +- [將事情做正確](/ch13#將事情做正確) + - [資料庫的端到端原則](/ch13#資料庫的端到端原則) + - [正好執行一次操作](/ch13#正好執行一次操作) + - [抑制重複](/ch13#抑制重複) + - [操作識別符號](/ch13#操作識別符號) + - [端到端原則](/ch13#端到端原則) + - [在資料系統中應用端到端思考](/ch13#在資料系統中應用端到端思考) + - [強制約束](/ch13#強制約束) + - [唯一性約束需要達成共識](/ch13#唯一性約束需要達成共識) + - [基於日誌訊息傳遞中的唯一性](/ch13#基於日誌訊息傳遞中的唯一性) + - [多分割槽請求處理](/ch13#多分割槽請求處理) + - [及時性與完整性](/ch13#及時性與完整性) + - [資料流系統的正確性](/ch13#資料流系統的正確性) + - [寬鬆地解釋約束](/ch13#寬鬆地解釋約束) + - [無協調資料系統](/ch13#無協調資料系統) + - [信任但驗證](/ch13#信任但驗證) + - [維護完整性,儘管軟體有Bug](/ch13#維護完整性儘管軟體有bug) + - [不要盲目信任承諾](/ch13#不要盲目信任承諾) + - [驗證的文化](/ch13#驗證的文化) + - [為可審計性而設計](/ch13#為可審計性而設計) + - [端到端原則重現](/ch13#端到端原則重現) + - [用於可審計資料系統的工具](/ch13#用於可審計資料系統的工具) +- [做正確的事情](/ch13#做正確的事情) + - [預測性分析](/ch13#預測性分析) + - [偏見與歧視](/ch13#偏見與歧視) + - [責任與問責](/ch13#責任與問責) + - [反饋迴圈](/ch13#反饋迴圈) + - [隱私和追蹤](/ch13#隱私和追蹤) + - [監視](/ch13#監視) + - [同意與選擇的自由](/ch13#同意與選擇的自由) + - [隱私與資料使用](/ch13#隱私與資料使用) + - [資料資產與權力](/ch13#資料資產與權力) + - [回顧工業革命](/ch13#回顧工業革命) + - [立法與自律](/ch13#立法與自律) +- [本章小結](/ch13#本章小結) +- [參考文獻](/ch13#參考文獻) -## [11. 批處理](/tw/ch11)(未釋出) -## [12. 流處理](/tw/ch12)(未釋出) -## [13. 做正確的事](/ch13)(未釋出) ## [術語表](/tw/glossary) -## [後記](/tw/colophon) \ No newline at end of file + +## [後記](/tw/colophon) +- [關於作者](/tw/colophon#關於作者) +- [關於譯者](/tw/colophon#關於譯者) +- [後記](/tw/colophon#後記) \ No newline at end of file diff --git a/hugo.yaml b/hugo.yaml index 13aca49..e0fe5ba 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -29,12 +29,6 @@ languages: contentDir: content/zh weight: 1 title: 设计数据密集型应用(第二版) - v2: - languageName: 第二版 - languageCode: v2 - contentDir: content/v2 - weight: 2 - title: 设计数据密集型应用(第二版) tw: languageName: 繁体中文 languageCode: tw @@ -87,10 +81,6 @@ menu: name: "简体中文 ↗" url: "/" weight: 2 - - identifier: simplified-chinese2 - name: "第二版 ↗" - url: "/v2" - weight: 3 - identifier: traditional-chinese name: "繁體中文 ↗" url: "/tw"