關於分散式系統中雷同集群技術及原理,你知道多少?

来源:https://www.cnblogs.com/heyue0117/archive/2020/01/07/12164076.html
-Advertisement-
Play Games

寫在前面 在當今信息爆炸的時代,單台電腦已經無法負載日益增長的業務發展,雖然也有性能強大的超級電腦,但是這種高端機不僅費用高昂,也不靈活,一般的企業是負擔不起的,而且也損失不起,那麼將一群廉價的普通電腦組合起來,讓它們協同工作就像一臺超級電腦一樣地對外提供服務,就成了順其自然的設想,但是這又 ...


 

 

寫在前面

在當今信息爆炸的時代,單台電腦已經無法負載日益增長的業務發展,雖然也有性能強大的超級電腦,但是這種高端機不僅費用高昂,也不靈活,一般的企業是負擔不起的,而且也損失不起,那麼將一群廉價的普通電腦組合起來,讓它們協同工作就像一臺超級電腦一樣地對外提供服務,就成了順其自然的設想,但是這又增加了軟體的複雜度,要求開發的軟體需要具備橫向擴展能力,比如:Kafka、Elasticsearch、Zookeeper等就屬於這一類軟體,它們天生都是"分散式的",即可以通過添加機器節點來共同地分攤數據存儲和負載壓力。

 

為什麼需要集群?

分佈在不同區域的電腦,彼此之間通過網路建立通信,相互協作作為一個整體對外提供服務,這就是集群,如果我們開發的系統具備這樣的能力,那麼理論上就具備無限橫向擴容的能力,系統的吞吐量就會隨著機器數增加而增長,那麼未來當系統出現高負載的時候,就可以很好地應對這種情況。

 

為什麼CAP不能同時滿足?

通過上面分析,我們知道實現集群,其實就是採用多台電腦來共同承擔和負載系統壓力,那麼就涉及到多台電腦需要參與一起處理數據,為了保證可用性,一般都會在每台電腦上備份一份數據,這樣只要有一個節點保持同步狀態,那麼數據就不會丟失,比如kafka分區多副本、Elasticsearch的副本分片,由於同一數據塊及其副本位於不用的機器,隨著時間的推移,再加上不可靠的網路通信,所有機器上的數據必然會不完全一致,這個時候假如發生一種極端情況,所有的機器宕機了,又如何保證數據不丟失呢(其實只有兩種方法)?

 

  • 保證可用性:選擇第一臺恢復正常服務的機器(不一定擁有全部數據)作為可信的數據來源,快速恢復集群,即停機時間優於同步。

  • 保證數據一致性:等待第一臺擁有全部數據的機器恢復正常,再恢復集群,即同步優於停機時間,比如禁用kafka的unclean leader選舉機制就是這種策略。

 

其實當大多數機器不可用時,就需要在可用性和一致性之間進行妥協了,所以另一個更符合分散式系統的Base理論又被創造出來了。

 

如何解決分散式存儲問題?

當由多台電腦組成的集群對外提供服務時,其實就是對外提供讀、寫的能力。

 

1.數據塊技術(data block)

為了將數據合理、均勻地寫到各個機器上,提高集群寫能力;為了將讀請求負載均衡到不同的節點,提高集群的讀能力;為瞭解耦數據存儲和物理節點,提高分散式讀寫並行處理的能力,聰明的工程師引入了一個邏輯數據存儲單位,統稱為數據塊,比如Kafka的分區(partion)、Elasticsearch的分片(shard),這樣的虛擬化大大提高了集群讀寫的靈活性。

 

2.協調節點(coordination node)

實際上當集群作為一個整體處理數據時,可能每一個節點都會收到讀寫請求,但是數據又是分散在不同的節點上,所以就需要每個節點都清楚地知道集群中任意一個數據塊的位置,然後再將請求轉發到相應的節點,這就是“協調節點”的工作。比如:Elasticsearch的master節點管理集群範圍內的所有變更,主分片管理數據塊範圍內的所有變更。

 

3.大多數投票機制(quorum)

百度百科:quorum,翻譯法定人數,指舉行會議、通過議案、進行選舉或組織某種專門機構時,法律所規定的必要人數,未達法定人數無效。

 

由於網路分區的存在,這個機制被廣泛地應用於分散式系統中,比如集群節點之間選舉Master;數據塊之間選舉Header等;在分散式存儲中,也被稱為Quorum讀寫機制,即寫入的時候,保證大多數節點都寫入成功(一般的做法會選舉一個主數據塊(header),保證它寫成功,然後再同步到冗餘的副本數據塊);讀取的時候保證讀取大多數節點的數據(一般的做法是由協調節點分發請求到不同的節點,然後將所有檢索到的數據進行全局彙總排序後再返回);由於讀寫都是大多數,那麼中間肯定存在最新的重疊數據,這樣就能保證一定能讀到最新的數據。

 

從上面分析可以得出,只要大多數節點處於活躍可用狀態,那麼整個集群的可用性就不會受到影響;只要大多數據塊處於活躍可用的狀態,那麼就能持續地提供讀寫服務;只要有一個數據塊完成了同步狀態,那麼數據就不會丟失;這其實就是通過一種冗餘機制來嘗試處理fail/recover模式的故障,通俗點講就是容忍單點故障,至少需要部署3個節點;容忍2點故障,至少需要部署5個節點,機器節點越多分區容忍性就越強,即通過增加機器數來降低由於機器故障影響服務的概率,頓悟了吧,嘿嘿,所以保證集群可用的前提就是有奇數個節點、奇數個數據塊保持活躍可用狀態,不然就無法選舉出master或header。

 

大多數投票機制運用起來也非常靈活,當分散式系統追求強一致性時,需要等待所有的數據快及其副本全部寫入成功才算完成一次寫操作,即寫全部(write all),可以理解一種事務保證,要麼全部寫入,要麼一個都不寫入,比如:kafka從0.11.0.0 版本開始, 當producer發送消息到多個topic partion時,就運用了這種機制,來保證消息交付的exactly-once語義,是不是很帥,而且這種情況下,從任意一個節點都能讀到最新的數據,讀性能最高;當分散式系統追求最終一致性時,只需等待主數據塊(leader)寫入成功即可,再由主數據塊通過消息可達的方式同步到副本數據塊。

 

為了能夠滿足不同場景下對數據可靠性和系統吞吐量的要求,最大化數據持久性和系統可用性,很多組件都提供了配置項,允許用戶定義這個大多數的法定數量,下麵我們就來談談一些常用組件的配置:

 

Elasticsearch

 

 

由上圖可以看到,整個集群由三個運行了Elasticsearch實例的節點組成,有兩個主分片,每個分片又有兩個副分片,總共有6個分片拷貝,Elasticsearch內部自動將相同的分片放到了不同的節點,非常合理和理想。

當我們新建一個文檔時:

 

  • 客戶端向 Node 1 發送新建文檔的寫請求。

  • 節點使用文檔的 _id 確定文檔屬於分片 0 。請求會被轉發到 Node 3,因為分片 0 的主分片目前被分配在 Node 3 上。

  • Node 3 在主分片上面執行請求。如果成功了,它將請求並行轉發到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都報告成功, Node 3 將向協調節點報告成功,協調節點向客戶端報告成功。

 

這就是Elasticsearch處理寫請求的典型步驟順序,同時每種業務場景對數據可靠性的要求和系統性能也不一樣,所以Elasticsearch提供了Consistence配置項:

 

  • one:主分片處於活躍可用狀態就可以處理寫請求。

    系統吞吐量最高,但數據可能會丟失,對數據可靠性要求不是很高的場景非常適合,比如實時的時序數據處理(日誌)。

  • all:主分片和所有副本分片處於活躍可用狀態才允許處理寫請求。

    系統吞吐量最低,但數據不會丟失。處理關鍵的業務數據非常合適。

  • quorum:必須有大多數的分片拷貝處於活躍可用狀態才允許處理寫請求。

    平衡系統吞吐量和數據可靠性,一般業務系統都使用這個配置。

 

Kafka

當向Kafka 寫數據時,producers可以通過設置ack來自定義數據可靠性的級別:

 

  • 0:不等待broker返回確認消息。

  • 1: leader保存成功返回。

  • -1(all): 所有備份都保存成功返回。

 

備註:預設情況下,為了保證分區的最大可用性,當acks=all時,只要ISR集合中的副本分區寫入成功,kafka就會返回消息寫入成功。如果要真正地保證寫全部(write all),那麼我們需要更改配置transaction.state.log.min.isr來指定topic最小的ISR集合大小,即設置ISR集合長度等於topic的分區數。

 

如果所有的節點都掛掉,還有Unclean leader選舉機制的保證,建議大家下去閱讀kafka《官方指南》設計部分,深入理解kafka是如何通過引入ISR集合來變通大多數投票機制,從而更好地保證消息交付的不同語義。

 

什麼是集群腦裂?

對於分散式系統,自動處理故障的關鍵就是能夠精準地知道節點的存活狀態(alive)。有時候,節點不可用,不一定就是其本身掛掉了,極有可能是暫時的網路故障;在這種情況下,如果馬上選舉一個master節點,那麼等到網路通信恢復正常的時候,豈不是同時存在兩個master,這種現象被形象地稱為“集群腦裂”,先留給大家下去思考吧。呵呵,明天要早起,碎覺了,大家晚安。

 

備註:設計一個正在高可用的分散式系統,需要考慮的故障情況往往會很複雜,大多數組件都只是處理了fail/recover模式的故障,即容忍一部分節點不可用,然後等待恢復;並沒有處理拜占庭故障(Byzantine),即節點間的信任問題,也許區塊鏈可以解決吧,大家可以下去多多研究,然後我們一起討論,共同學習,一起進步。

 

 

補充:大多數投票機制的優缺點

 

優點

大多數投票機制延遲取決於最快的伺服器,即等待數據備份完成的等待時間取決於最快的follower,比如副本因數是3,header占據1位,再有1位最快的follower同步完成,就滿足大多數了。

 

缺點

大多數(n+1)的節點掛掉就無法選舉leader,從而整個集群徹底失去可用性,比如:為了冗餘單點故障,通常需要三個節點備份數據,但是當其中兩台掛掉時,整個集群就掛了。僅僅靠冗餘數據來避免單點故障是不夠,通常對磁碟空間需求量為2n+1倍,相應地也會導致寫吞吐量下降2n+1倍,這種高昂的存儲方式並不適合存儲原始數據,這就是為什麼quorum演算法更適合共用集群配置數據,如zookeeper,這也是kafka為什麼要引入一個同步狀態備份集合(ISR),通過降低所需的備份數據而帶來額外的吞吐量和磁碟空間,從而提高kafka處理海量實時數據的能力。

 

有需要學習交流的友人請加入交流群的咱們一起,群內都是1-7年的開發者,希望可以一起交流,探討PHP,swoole這塊的技術 或者有其他問題 也可以問,獲取swoole或者php進階相關資料私聊管理即可
點此加入該群​jq.qq.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是沉默王二,今天在逛 programcreek 的時候,我發現了一些專註細節但價值連城的主題。比如說:Java 的 Comparable 和 Comparator 是兄弟倆嗎?像這類靈魂拷問的主題,非常值得深入地研究一下。 Comparable 和 Comparator 是 Java 的兩 ...
  • 題目: 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,你不能重覆利用這個數組中同樣的元素。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 ...
  • 有2個實體:用戶、會員卡,一個用戶只能辦理一張會員卡,即一對一。 user_tb : 引入card_tb的主鍵card_no作為外鍵。 card_tb: 方式一:使用擴展類實現一對一 (1)在pojo包下新建User類: package com.chy.pojo; public class User ...
  • 一、編寫一個酒店管理系統 1.直接上代碼 package com.bjpowernode.java_learning; ​ public class D69_1_ { //編寫一個程式模擬酒店的管理系統:預定房間、退房....... public static void main(String[] ...
  • IOC容器 工廠只負責創建對象,而Spring當然不僅僅是一個對象工廠;其核心是一個對象容器,由於具備控制反轉的能力,所以也叫它IOC容器; 容器可以理解為存放對象的地方,當然不僅僅是存儲,還有對象的管理,包括 創建 銷毀 裝配; 這樣原本程式要做的事情交給了Spring,所以這屬於IOC,稱之為I ...
  • 有人說,我的人生會一帆風順,今天突然感覺到,是啊,我挺安分的。 1 大學畢業,面試拿到一個Offer就停止求職了。公司是一家國企,剛進來感覺用的技術挺新的,不像銀行等公司還在用老舊的技術,自己也沒心思去學那些,反而對比較新的技術更有興趣。一開始還想著,公司還是比較新鮮有活力的,可以待一待,但是慢慢的 ...
  • 問題描述 求1+2+3+...+n的值。 輸入格式 輸入包括一個整數n。 輸出格式 輸出一行,包括一個整數,表示1+2+3+...+n的值。 樣例輸入 4 樣例輸出 10 樣例輸入 100 說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的做題。 一般在提交之前所有這些樣例都需要測試通過才行,但這 ...
  • 一、為什麼會使用比較 在Java中經常會涉及到對象數組的排序問題,那麼就涉及到對象之間的比較問題, 說明:Java中的對象,正常情況下,只能進行比較:== 或 != 。不能使用 > 或 < 的 但是在開發場景中,我們需要對多個對象進行排序,言外之意,就需要比較對象的大小。 如何實現?使用兩個介面中的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...