分散式存儲系統舉例剖析(elasticsearch,kafka,redis-cluster)

来源:https://www.cnblogs.com/darcy-yuan/archive/2023/08/18/17637123.html
-Advertisement-
Play Games

1. 概述 對於分散式系統,人們首先對現實中的分散式系統進行高層抽象,然後做出各種假設,發展了諸如CAP, FLP 等理論,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我們對分散式系統的時序,複製模式,一致性等基礎理論特別關註。 在共識演算法的基礎上衍生了選舉演算法,並且為分散式事務提供了部分 ...


1. 概述

對於分散式系統,人們首先對現實中的分散式系統進行高層抽象,然後做出各種假設,發展了諸如CAP, FLP 等理論,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我們對分散式系統的時序,複製模式,一致性等基礎理論特別關註。

在共識演算法的基礎上衍生了選舉演算法,並且為分散式事務提供了部分的支持。本文從常見的幾種分散式存儲系統看看實踐中的分散式系統設計細節。理論結合實際,能更好地幫助我們加深理解。

2.分片

先來看看分片的定義:

The word “Shard” means “a small part of a whole“. Hence Sharding means dividing a larger part into smaller parts. In DBMS, Sharding is a type of DataBase partitioning in which a large database is divided or partitioned into smaller data and different nodes

分片是分散式存儲系統繞不開的話題,分片提供了更大的數據容量,能夠提升讀寫效率,提升數據可用性。

分散式存儲系統 分片 備註
elasticsearch 每個index 進行分片,即 shard shard計算,shard = hash(routing) % number_of_primary_shards
kafka 每個topic分析分片,即 partition 根據key來選擇partition,也可以根據自定義partition演算法實現 同一的user發送到同一 的partition
redis-cluster 對所有數據進行分片,hash slot 16384(2^14) hash tags 確保數據分配到同一個slot:{123}:profile and user:{123}:account
  • 對redis-cluster 來講,redis client 需要緩存 key - slot 映射,因為redis 節點不會對 查詢請求進行代理,如果查詢數據不存在,則需要client重新查詢。
  • redis-cluster 的設計目標是在提供高性能的基礎上,讓redis數據能分佈在多達1000個節點的集群上。

3.複製

複製提升了數據的可靠性,複製分片還可以用來做read。在分散式系統重,有兩種複製模式:

  1. 同步複製,主節點在同步數據到slave,然後返迴響應給到client
  2. 非同步複製,主節點先返迴響應給到client,然後同步數據到slave

分散式存儲系統 複製 備註
elasticsearch  primary 複製數據到 in-sync copies,同步複製  
kafka 主分片複製數據到 ISR (in sync replica) producer 可以配置 acks 和 min.insync.replicas 來調整一致性
redis-cluster 採用redis 的複製機制,非同步複製 redis對性能非常敏感,所以採用的都是非同步複製
  • 以上三種系統均採用 primary-backup model (Google I/O 2009 - Transactions Across Datacenters), 具有低延遲,高吞吐,會有部分的數據丟失視窗
  • 舊的elasticsearch 版本中可以調整write conistency level : one(primary shard), all(all shard), quorum(default).
  • kafka 是典型的日誌消息系統,數據量特別大,在常見的quorum-based 系統中,為了能容忍n個節點失敗,往往需要2n + 1 個節點,這對kafka來講多餘的存儲成本非常的高,於是kafka採用了ISR機制,即只維護那些與主分片及時保持同步的分片,當主分片失敗時,從ISR 中選取一個作為最新的主分片即可。

4.一致性

不同的複製策略帶來了不同的一致性,常見的一致性有

  • 強一致性
  • 最終一致性
  • 弱一致性

根據Ryan Barrett在Google I/O 2009 - Transactions Across Datacenters中的定義,elasticsearch/kafka/redis-cluster 都採用了 primary-backup model,primary-backup model 的特點是最終一致性,但是具體細節有所不同。

分散式存儲系統 寫入一致性 NWR 模型 備註
elasticsearch 最終一致性 (較強) w(all write) , r(1) 需要refresh 到文件系統緩存才可見,flush操作到磁碟
kafka 最終一致性 (可調) w(ack writes) , r(1)  ack = 0 最弱,ack = all 最強
redis-cluster 最終一致性 (較弱) w(1) , r(1)  
  • 採用最終一致性,意味著在寫入過程中,會出現部分節點返回最新數據,部分節點返回過期數據的情況,由於這個時間視窗很小,往往可以接受。
  • 我們在這裡提到了NWR模型,參考 partial quorums,partial quorums 在基於衝突解決的複製模型中使用廣泛,比如Dynamo。當 r + w > n 時總有節點能返回最新的數據。

5.選舉演算法

選舉演算法的基礎是共識演算法,paxos是其中最璀璨的明珠,paxos在共識演算法中的地位可以用這樣表述:

Either Paxos, or Paxos with cruft, or broken

paxos 最早應用於google 的 Chubby (lock manager),zk是 Chubby的開源版本。

分散式存儲系統 選舉演算法 備註
elasticsearch bully/類raft bully演算法比較簡單,誰大就選誰
kafka zookeeper(zab)/kraft(raft)  
redis-cluster 類raft  
  • 可以看到很多分散式組件都有轉向raft的趨勢。
  • 由於paxos演算法晦澀難懂,並且如果要應用到實際過程中需要做很多調整,所以開發了一個易於理解的版本raft演算法,raft演算法分為 leader election, log replication, safety, and membership changes 等模塊,相比於paxos 所有節點都是平等的,raft 進行leader 選舉,並且通過log replication進行數據同步,safety 確立了raft演算法的完備性,membership changes 處理節點變更的情形。log replication 表示了raft底層的數據結構,對我們設計類似系統大有裨益。

6.事務支持

存儲系統中,事務是非常重要一部分,我們來看看各類組件是否支持分散式事務,以及他們是如何實現的:

分散式存儲系統 事務支持 備註
elasticsearch 不支持  
kafka 支持事務,基於2PC  
redis-cluster 不支持跨節點的事物,支持單節點的事物 使用multi/exec/watch 來實現
  • 2PC是一種強一致的模型,具有高延遲,低吞吐的特點。
  • 常見的分散式事務模型有,primary-backup model,multi-master model, 2PC, Paxos.  3PC 是2PC 的變體。個人認為TCC, 基於消息表的事務也是2PC 的變體。

7.總結

本文從分散式系統的幾個方面探討了elasticsearch,kafka,redis-cluster的細節,他們有很多共性,但是在許多方面也有很多不同。鑒於筆者對分散式系統的研究還不是很深入,如果錯誤,請指正。

8.參考

https://book.mixu.net/distsys/single-page.html

https://www.youtube.com/watch?v=srOgpXECblk

https://snarfed.org/transactions_across_datacenters_io.html

http://harry.me/blog/2014/12/27/neat-algorithms-paxos/

https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf


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

-Advertisement-
Play Games
更多相關文章
  • ##### 6 圖片標簽 在HTML中,圖像由標簽定義的,它可以用來載入圖片到html網頁中顯示。網頁開發過程中,有三種圖片格式被廣泛應用到web里,分別是 jpg、png、gif。 img標簽的屬性: ``` /* src屬性: 指定圖像的URL地址,是英文source的簡寫,表示引入資源。 sr ...
  • ##### 5 表單標簽 表單主要是用來收集客戶端提供的相關信息,提供了用戶數據錄入的方式,有多選、單選、單行文本、下拉列表等輸入框,便於網站管理員收集用戶的數據,是Web瀏覽器和Web伺服器之間實現信息交流和數據傳遞的橋梁. 表單被form標簽包含,內部使用不同的表單元素來呈現不同的方式來供用戶輸 ...
  • 說起數據載入的機制,有一個繞不開的話題就是前端性能,很多電商門戶的首頁其實都會做一些垂直的定製優化,比如讓請求在頁面最早載入,或者在前一個頁面就進行預載入等等。 ...
  • ##### 1 JavaScript的引入方式 JavaScript, 是一門能夠運行在瀏覽器上的腳本語言. 簡稱JS. 首先, Javascript這個名字的由來就很有意思, 不少人認為Javascript和Java貌似很像. 容易想象成Java的腳本. 但其實不然, 兩者之間沒有任何關係. 純粹 ...
  • ##### 4 表格標簽 表格標簽也是一種複合標簽。由:table,tr,td,th,thead,tbody組合,由行和列組合成,行和列交叉的地方就是單元格。在HTML中使用table來定義表格。網頁的表格和辦公軟體裡面的xls一樣,都是有行有列的。HTML使用tr標簽定義行,使用td標簽定義列。 ...
  • 隨著互聯網的發展,PDF 文件在信息交流和文檔分享中起著重要的作用。通過在 Vue 組件中實現 PDF 預覽功能,我們可以為用戶提供便捷的內容閱讀體驗。 通過閱讀本文,讀者將瞭解如何在 Vue 中實現強大的 PDF 預覽功能,為用戶提供方便的閱讀體驗。無論你是剛入門的 Vue 開發者,還是有一定經... ...
  • ##### 2 超鏈接標簽 超鏈接是瀏覽者和伺服器的交互的主要手段,也叫超級鏈接或a鏈接,是網頁中指向一個目標的連接關係,這個目標可以是網頁、網頁中的具體位置、圖片、郵件地址、文件、應用程式等。 超鏈接是網頁中最重要的元素之一。一個網站的各個網頁就是通過超鏈接關聯起來的,用戶通過點擊超鏈接可以從一個 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230816164601035-688425072.png) # 1. 變化就是軟體的特性 ## 1.1. 變化保證天天有,存活保障無處尋 ## 1.2. 非每一款軟體每天都需 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...