<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Distributed Systems on Intellectual Guides</title><link>https://ckw19810413.github.io/tags/distributed-systems/</link><description>Recent content in Distributed Systems on Intellectual Guides</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><lastBuildDate>Sun, 04 Oct 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://ckw19810413.github.io/tags/distributed-systems/index.xml" rel="self" type="application/rss+xml"/><item><title>每日研究生知識寓言故事：亞歷山大圖書館的快筆書記官與夜巡學徒</title><link>https://ckw19810413.github.io/blog/2026-10-04-lsm-tree-fable/</link><pubDate>Sun, 04 Oct 2026 08:00:00 +0800</pubDate><guid>https://ckw19810413.github.io/blog/2026-10-04-lsm-tree-fable/</guid><description>&lt;p&gt;在古老的知識之都，有一座號稱要收納世間所有智慧的「無盡圖書館」。每天，來自世界各地的旅人、學者和商隊，都會湧入圖書館，帶來成千上萬條新的見聞、歷史與卷宗。&lt;/p&gt;
&lt;p&gt;最初，圖書館採用的是「完美書架法則」。每當有人帶來一份新卷宗，老館長就必須提著燈籠，穿過宛如迷宮般的幽暗長廊，找到與該卷宗字母排序完全對應的書架。有時候為了塞進這份新卷宗，老館長還得把書架上後面的幾百卷書全部往右挪動一個位置。
如果一天只有十幾份卷宗，這套法則還行得通。但隨著帝國版圖擴張，每天都有數萬份卷宗如雪片般飛來，老館長在書架間來回狂奔，累得氣喘吁吁，甚至在門口排起了長達數公里的等待隊伍。圖書館面臨了崩潰的危機。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="快筆書記官的誕生"&gt;快筆書記官的誕生
&lt;/h3&gt;&lt;p&gt;為了解決這個問題，新任的大書記官「埃爾斯」發明了一套全新的《雙層流動法則》。&lt;/p&gt;
&lt;p&gt;埃爾斯在圖書館的大門口擺了一張靈巧的&lt;strong&gt;紅木書桌&lt;/strong&gt;。現在，當新的卷宗送達時，他不再跑進深邃的書庫，而是直接將內容快速地抄寫在紅木書桌上的一本**《當日記事本》**裡。因為只是按順序抄寫，速度快若閃電，門口的隊伍瞬間消失了。&lt;/p&gt;
&lt;p&gt;然而，《當日記事本》的容量是有限的。一旦寫滿，埃爾斯就會用蜂蠟將這本記事本封死，貼上「不可修改」的封條，然後隨手往身後的**「昨日書堆」**一扔，接著再拿出一本新的空白記事本繼續抄寫。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="尋書人的困境與夜巡學徒"&gt;尋書人的困境與夜巡學徒
&lt;/h3&gt;&lt;p&gt;這個方法讓「寫入」的速度達到了極致，但卻苦了那些來「尋書」的人。
當有學者來查詢某段歷史時，尋書人必須先看門口的《當日記事本》有沒有記錄；如果沒有，就得到後方雜亂無章的數十個「昨日書堆」中，一個一個去翻找。有時候為了找一條記錄，要翻遍幾十個書堆，找書的速度變得異常緩慢。&lt;/p&gt;
&lt;p&gt;為了解決找書慢的問題，埃爾斯招募了一群&lt;strong&gt;夜巡學徒&lt;/strong&gt;。
每當夜深人靜，這群學徒就會在後方默默工作。他們會把好幾個小型的「昨日書堆」搬出來，將裡面的卷宗重新按照字母順序排列、合併，然後整齊地裝訂成一本厚厚的**《月度大典》**，放進更深處的書架上。&lt;/p&gt;
&lt;p&gt;如果學徒在合併的過程中，發現了兩份關於同一個事件的記錄（例如：早上有人記錄「國王生病了」，下午又有人記錄「國王康復了」），學徒只會保留&lt;strong&gt;時間最新&lt;/strong&gt;的那一份。如果有人特別交代「把某份卷宗銷毀」，這份指令就像一塊&lt;strong&gt;黑色墓碑&lt;/strong&gt;，當學徒在合併時看到這塊墓碑，就會順手把對應的舊卷宗丟進火爐裡燒掉。&lt;/p&gt;
&lt;p&gt;就這樣，小書堆合併成大書堆，大書堆再合併成巨大的書架。前端的抄寫員始終保持著閃電般的速度，而後端的夜巡學徒則透過不斷地合併與整理，讓尋書人在深處也能快速找到想要的知識。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="揭曉時刻這到底是什麼"&gt;揭曉時刻：這到底是什麼？
&lt;/h3&gt;&lt;p&gt;這個故事所描述的，正是現代高效能資料庫背後的核心資料結構：&lt;strong&gt;LSM-Tree (Log-Structured Merge-Tree，日誌結構合併樹)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你用過 Cassandra、RocksDB、LevelDB，或者是 Kafka 的底層存儲，它們都深受 LSM-Tree 思想的影響。&lt;/p&gt;
&lt;p&gt;在傳統的 B-Tree 或 B+Tree 資料庫中，每次寫入一筆新資料，都需要在磁碟中尋找特定的位置並更新，這會產生大量的「隨機寫入 (Random Write)」。傳統硬碟最怕隨機寫入，這成了效能的巨大瓶頸。&lt;/p&gt;
&lt;p&gt;LSM-Tree 則反其道而行：它將所有的「隨機寫入」轉化為了「循序寫入 (Sequential Write)」。這極大地提升了資料庫的寫入吞吐量，特別適合寫入極其頻繁的現代應用場景。&lt;/p&gt;
&lt;h3 id="故事中的隱喻對應"&gt;故事中的隱喻對應：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;完美書架法則&lt;/strong&gt;：傳統的 B-Tree/B+Tree 結構。每次插入資料都可能需要拆分節點、移動資料，雖然讀取很快，但寫入時會產生大量的隨機 I/O。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;紅木書桌上的《當日記事本》&lt;/strong&gt;：LSM-Tree 的 &lt;strong&gt;MemTable&lt;/strong&gt;（通常位於記憶體中）。所有的新增、修改、刪除操作，都會先快速寫入記憶體中的這棵小樹裡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不可修改的「昨日書堆」&lt;/strong&gt;：&lt;strong&gt;SSTable (Sorted String Table)&lt;/strong&gt;。當記憶體中的 MemTable 滿了，就會被「凍結」並 Flush 到磁碟上，成為一個不可變的檔案。因為是直接循序寫入磁碟，速度極快。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尋書人的困境 (找書慢)&lt;/strong&gt;：LSM-Tree 的 &lt;strong&gt;Read Amplification (讀取放大)&lt;/strong&gt; 效應。讀取資料時，如果在 MemTable 找不到，就必須依序去磁碟上的多個 SSTable 中查詢，導致讀取效能下降。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;夜巡學徒的整理工作&lt;/strong&gt;：&lt;strong&gt;Compaction (合併壓縮)&lt;/strong&gt; 機制。背景程式會定期將多個小型的 SSTable 合併成一個較大的 SSTable，以此減少檔案數量，提升未來的讀取速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黑色墓碑&lt;/strong&gt;：&lt;strong&gt;Tombstone (墓碑標記)&lt;/strong&gt;。在 LSM-Tree 中，刪除資料並不會立刻去磁碟裡把舊資料抹除（因為那又變成了隨機寫入）。相反地，它會寫入一筆帶有「墓碑」標記的刪除記錄。直到夜間 Compaction 合併時，系統才會真正把舊資料與墓碑一起清理掉。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;LSM-Tree 用「犧牲一部分讀取效能，並依賴背景合併」的代價，換取了極致的寫入速度。這就是電腦科學中經典的 Trade-off（權衡）藝術，也是大數據時代能支撐海量資料寫入的幕後英雄。&lt;/p&gt;</description></item><item><title>每日研究生知識寓言故事：雙子島的神秘魔法帳本</title><link>https://ckw19810413.github.io/blog/cap-theorem-fable/</link><pubDate>Thu, 17 Sep 2026 08:00:00 +0800</pubDate><guid>https://ckw19810413.github.io/blog/cap-theorem-fable/</guid><description>&lt;p&gt;在蔚藍之海中，有兩座繁華的島嶼——「日出島」與「月落島」。兩座島嶼的商會會長決定共同開設一家名為「雙子星」的跨島錢莊。&lt;/p&gt;
&lt;p&gt;為了讓商人們在兩座島上都能隨時存取金幣，錢莊在兩島各設了一個分部，並對外宣告了一個極高的服務標準：
第一：客人無論在哪一座島查詢餘額，看到的數字必須完全一致（這叫「帳目一致」）。
第二：只要錢莊開門營業，客人隨時來辦理存取款，櫃檯都必須立刻受理，不能拒絕或讓客人無盡地等待（這叫「絕對服務」）。&lt;/p&gt;
&lt;p&gt;為了達成這兩個標準，兩座島的錢莊經理雇用了世界上飛得最快的傳信鴿。每當日出島有客人存入一筆錢，經理就會立刻飛鴿傳書給月落島；直到月落島回信說「帳本已同步修改」，這筆交易才算完成。反之亦然。在平靜的日子裡，這個系統運作得非常完美。&lt;/p&gt;
&lt;p&gt;然而，到了狂風暴雨的颱風季，問題發生了。
一場可怕的風暴席捲了兩島之間的海域，所有的傳信鴿都無法穿越風暴，兩島之間徹底失去了聯繫（這稱為「通訊斷裂」）。&lt;/p&gt;
&lt;p&gt;這時候，日出島的錢莊走進了一位客人，要求存入一千枚金幣。
日出島的經理陷入了前所未有的兩難。他發現自己面臨一個無法破解的死局。&lt;/p&gt;
&lt;p&gt;如果他選擇&lt;strong&gt;收下金幣&lt;/strong&gt;（遵守「絕對服務」），他的帳本餘額就會增加，但他無法通知月落島。結果就是，兩座島的帳本數字變得不一樣了，他違背了「帳目一致」的承諾。
如果他選擇&lt;strong&gt;維持帳目一致&lt;/strong&gt;，他就必須對客人說：「抱歉，因為我們無法聯絡另一座島，所以現在暫停所有交易。」這樣一來，雖然兩邊帳本還是相同的（都沒有變動），但他違背了「絕對服務」的承諾。&lt;/p&gt;
&lt;p&gt;風暴期間，錢莊無法同時做到「帳目一致」和「絕對服務」。經理最終明白了一個殘酷的真理：在兩地通訊可能中斷的現實世界裡，錢莊的兩大完美承諾，註定只能選擇其中一個。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="揭曉與解釋"&gt;揭曉與解釋
&lt;/h3&gt;&lt;p&gt;這則寓言講述的是分散式系統（Distributed Systems）中著名的 &lt;strong&gt;CAP定理（CAP Theorem）&lt;/strong&gt;，也稱為布魯爾定理（Brewer&amp;rsquo;s Theorem）。&lt;/p&gt;
&lt;p&gt;CAP定理指出，在一個分散式計算系統中，最多只能同時滿足以下三項特性中的兩項：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一致性（Consistency）&lt;/strong&gt;：在分散式系統中的所有資料節點，在同一時間具有相同的資料。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可用性（Availability）&lt;/strong&gt;：每個請求都能收到一個（非錯誤的）回應，無論成功或失敗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分區容錯性（Partition tolerance）&lt;/strong&gt;：系統在節點之間的網路通訊丟失或延遲（即產生了網路分區）時，仍能繼續運作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;寓言中的隱喻對應如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;雙子星錢莊的兩座島嶼分部&lt;/strong&gt;：分散式系統中的多個資料節點（Nodes）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;帳目一致&lt;/strong&gt;：對應 &lt;strong&gt;一致性 (Consistency, C)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;絕對服務&lt;/strong&gt;：對應 &lt;strong&gt;可用性 (Availability, A)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;風暴阻斷飛鴿傳書&lt;/strong&gt;：對應 &lt;strong&gt;分區容錯性 (Partition Tolerance, P)&lt;/strong&gt; 中的網路分區（通訊斷裂）情況。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CAP定理的核心洞見在於：在現實的網路環境中，網路故障（風暴）是無可避免的，因此系統必須具備「分區容錯性 (P)」。既然 P 是必備的，當網路斷裂發生時，系統設計師就只能在 C 和 A 之間做出取捨：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;選擇 CP (一致性 + 分區容錯)&lt;/strong&gt;：暫停服務直到網路恢復（拒絕客人的存款），確保資料絕不出錯。這常見於銀行或金融交易系統，因為帳目錯誤的代價極高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;選擇 AP (可用性 + 分區容錯)&lt;/strong&gt;：繼續提供服務，接受資料可能暫時不一致（收下客人的存款，事後再同步）。這常見於社群網站的按讚數或大型電商的購物車，確保使用者體驗不中斷。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;世上沒有完美的雲端錢莊，所有的架構設計，都是在風暴來臨前，先決定好你要犧牲哪一個承諾。&lt;/p&gt;</description></item><item><title>每日研究生知識寓言故事：環礁群島的寶箱守衛</title><link>https://ckw19810413.github.io/blog/consistent-hashing-fable/</link><pubDate>Tue, 15 Sep 2026 08:00:00 +0800</pubDate><guid>https://ckw19810413.github.io/blog/consistent-hashing-fable/</guid><description>&lt;p&gt;在一個名為「環礁群島」的繁榮海上王國，國王擁有無數的奇珍異寶。為了安全起見，他將寶物分別存放在成千上萬個小保險箱中，並給每個保險箱都編了專屬號碼。&lt;/p&gt;
&lt;p&gt;為了保管這些保險箱，國王雇用了幾位菁英守衛，並將保險箱平均分給他們看管。&lt;/p&gt;
&lt;p&gt;起初，負責後勤的大臣使用了一個簡單的規則：&lt;strong&gt;將保險箱編號除以守衛的總人數，餘數是多少，就交給對應編號的守衛。&lt;/strong&gt;
例如，王國有 3 個守衛（編號 0, 1, 2），編號 10 的箱子，10 除以 3 餘 1，就交給 1 號守衛保管。&lt;/p&gt;
&lt;p&gt;這個方法運作得非常順暢，國王想要找某個寶箱時，只要算一下除法，就能立刻知道該去問哪個守衛。&lt;/p&gt;
&lt;p&gt;直到有一天，噩夢降臨了。1 號守衛因為吃了不新鮮的海鮮，請了一個月的病假。
守衛人數從 3 人變成了 2 人。&lt;/p&gt;
&lt;p&gt;國王驚恐地發現，幾乎所有保險箱的「餘數」全都改變了！
原本 10 號箱子（10 ÷ 3 餘 1）是給 1 號的，現在（10 ÷ 2 餘 0）變成了 0 號的；
原本 11 號箱子（11 ÷ 3 餘 2）是給 2 號的，現在（11 ÷ 2 餘 1）變成了 1 號的。&lt;/p&gt;
&lt;p&gt;因為這小小的變動，王國必須耗費巨大的人力，將成千上萬個保險箱在剩下的守衛之間重新搬運、重新登記。整個王國為此陷入了長達一個月的混亂。更糟的是，幾個月後國王想增加一名新守衛來分擔工作，人數從 2 變成 3，結果又引發了一次驚天動地的大搬風！&lt;/p&gt;
&lt;p&gt;「我們不能再這樣下去了，只要人員一有變動，整個國家的寶物都要跟著大搬家！」國王崩潰地喊道。&lt;/p&gt;
&lt;p&gt;這時，王國裡最聰明的首席星象師站了出來，提出了一個名為「星環分配法」的絕妙點子。&lt;/p&gt;
&lt;p&gt;星象師在巨大的航海圖上畫了一個完美的圓環，代表群島封閉的環形海岸線。他將這個圓環的刻度從 0 標示到了 9999。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：&lt;/strong&gt; 根據每一位守衛名字的筆畫與出生時辰，經過星象計算後，將他們指派到圓環上的一個特定刻度駐守。
&lt;strong&gt;第二步：&lt;/strong&gt; 當一個新的保險箱送來時，同樣根據它的編號進行星象計算，找出它在圓環上對應的刻度位置。
&lt;strong&gt;第三步：&lt;/strong&gt; 保險箱該由誰保管？星象師笑著說：「從保險箱落在圓環的刻度開始，&lt;strong&gt;順時針沿著海岸線走，遇到的『第一位守衛』&lt;/strong&gt;，就是負責保管它的人！」&lt;/p&gt;
&lt;p&gt;國王一開始不明白這有什麼了不起，星象師耐心地解釋：&lt;/p&gt;
&lt;p&gt;「陛下，假設現在有一位守衛離職了。那麼，原本由他保管的那些保險箱，只要順時針交給下一位守衛接管就好。&lt;strong&gt;其他所有守衛手上的保險箱，完全不需要移動！&lt;/strong&gt;」&lt;/p&gt;
&lt;p&gt;「那如果我們增加了一名新守衛呢？」國王眼睛一亮。&lt;/p&gt;
&lt;p&gt;「新守衛會被安插在圓環的某個新刻度上。他只需要從他順時針方向的『下一位守衛』那裡，接管原本位置落在他和上一位守衛之間的那一小部分保險箱。其他人同樣完全不受影響！」&lt;/p&gt;
&lt;p&gt;國王聽了連連點頭，但隨即皺起眉頭：「可是，如果守衛在圓環上的位置分布不均勻怎麼辦？要是兩個人靠得很近，另一個人卻隔得很遠，那個負責長距離海岸線的守衛不就被寶箱壓垮了？」&lt;/p&gt;
&lt;p&gt;星象師微微一笑：「這我也想到了。我會賜予每位守衛『分身術』。每位守衛在圓環上不會只有一個駐點，而是會產生幾十個虛擬分身，隨機散佈在圓環各處。這樣一來，海岸線就被切得非常細碎，保險箱就能極度均勻地分配給所有人了！」&lt;/p&gt;
&lt;p&gt;國王聽完龍心大悅，立刻實施了星環分配法。從此，環礁群島的寶物管理再也沒有因為人員變動而陷入混亂，王國迎來了長久的安寧。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="概念揭曉與解析"&gt;概念揭曉與解析
&lt;/h3&gt;&lt;p&gt;這則寓言故事，講述的是計算機科學與分散式系統中非常著名的核心概念：&lt;strong&gt;一致性雜湊（Consistent Hashing）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在現代網路服務中，我們經常需要將大量的數據（保險箱）分散儲存在多台快取伺服器或資料庫（守衛）上。傳統的哈希演算法，通常使用 &lt;code&gt;hash(key) % N&lt;/code&gt;（N 為伺服器數量）的方式來分配數據。這在伺服器數量固定時運作良好，但只要伺服器擴容（增加節點）或縮容/當機（減少節點），&lt;code&gt;N&lt;/code&gt; 的改變會導致幾乎所有數據的哈希值重新洗牌，引發大規模的數據遷移（Data Migration），這在大型系統中會造成可怕的「雪崩效應」。&lt;/p&gt;
&lt;p&gt;一致性雜湊完美地解決了這個問題，故事中的隱喻對應如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;圓環海岸線（Hash Ring）&lt;/strong&gt;：
一致性雜湊將哈希值空間組織成一個虛擬的閉合圓環（通常範圍是 $0$ 到 $2^{32} - 1$）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;守衛在圓環上的位置（Node Hashing）&lt;/strong&gt;：
將伺服器（節點）的 IP 或名稱進行哈希計算，映射到這個圓環的特定位置上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;順時針尋找第一位守衛（Data Routing / 數據路由）&lt;/strong&gt;：
將數據的 Key（例如用戶 ID 或檔名）進行哈希計算，映射到同一個圓環上。然後從該位置開始順時針尋找，將數據存儲在遇到的第一個伺服器節點上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;只有局部受到影響的搬風（容錯性與擴展性）&lt;/strong&gt;：
當增加或刪除伺服器節點時，&lt;strong&gt;只有該節點逆時針方向到前一個節點之間的數據會受到影響&lt;/strong&gt;。系統中絕大多數的數據都不需要遷移，這大大降低了節點變動帶來的成本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;守衛的分身術（Virtual Nodes / 虛擬節點）&lt;/strong&gt;：
在實際應用中，如果節點太少，可能會導致在圓環上分佈不均，造成某些伺服器負載過重（數據傾斜）。引入「虛擬節點」機制，讓一個實體伺服器在圓環上對應多個虛擬位置，可以使數據分佈更加平衡、均勻。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一致性雜湊是現代雲端架構的基石之一，廣泛應用於分散式快取（如 Memcached 叢集、Redis Cluster 的某些變體）、負載平衡、以及分散式儲存系統（如 Amazon Dynamo、Apache Cassandra）中，讓我們的網路服務能夠平滑地進行擴展與升級。&lt;/p&gt;</description></item></channel></rss>