主頁 > 資料庫 > 05、etcd 讀請求執行流程

05、etcd 讀請求執行流程

2023-07-06 09:17:26 資料庫

本篇內容主要來源于自己學習的視頻,如有侵權,請聯系洗掉,謝謝,

1、etcd讀請求概覽

etcd是典型的讀多寫少存盤,在我們實際業務場景中,讀一般占據2/3以上的請求,一個讀 請求從client通過Round-robin(輪詢)負載均衡演算法,選擇一個etcd server節點,發出 gRPC請 求,經過etcd server的 KVServer模塊、線性讀模塊、MVCC的treelndex和 boltdb模塊緊 密協作,完成了一個讀請求,

思考:通過etcdctl執行如下命令etcd是如何作業的?

etcdctl get hello ‐‐endpoints 192.168.65.210:2379,192.168.65.211:2379,19 2.168.65.212:2379

2、詳細步驟解讀

2.1 Client 層

主要是對應到步驟 1

1、首先,etcdctl 會對命令中的引數進行決議,

  • get 是請求的方法,它是 KVServer 模塊的 提供的API;
  • hello是 我們查詢的 key 名;
  • endpoints 是我們后端的 etcd 地址,通常,生產環境下中需要配置多個endpoints,這樣在 etcd 節點出現故障后,client 就可以自動重連到其它正常的節點,從而保證請求的正常執行,

2、在決議完請求中的引數后,etcdctl 會創建一個 clientv3 庫物件,使用 KVServer 模塊 的 API 來訪問 etcd server,
etcd clientv3 庫采用的負載均衡演算法為 Round-robin,針對每一個請求,Round-robin 演算法通過輪詢的方式依次從 endpoint 串列中選擇一個 endpoint 訪問 (長連接),使 etcd server 負載盡量均衡,

2.2 KVServer 與 攔截器

主要是對應到步驟 2

client 發送 Range RPC 請求到了 server 后就進入了 KVServer 模塊,
etcd 通過攔截器以非侵入式的方式實作了許多特性,例如:豐富的 metrics、日志、請求行為檢查、所有請求的執行耗時及錯誤碼、來源IP 等,攔截器提供了在執行一個請求前后 的 hook 能力,除了 debug 日志、metrics 統計、對 etcd Learner 節點請求介面和引數限制等能力,etcd 還基于它實作了以下特性:

  • 要求執行一個操作前集群必須有 Leader;

  • 請求延時超過指定閾值的,列印包含來源 IP 的慢查詢日志 (3.5 版本),

server 收到 client 的 Range RPC 請求后,根據 ServiceName 和 RPC Method 將請求轉 發到對應的 handler 實作,handler 首先會將上面描述的一系列攔截器串聯成一個攔截器再執行,在攔截器邏輯中,通過呼叫 KVServer 模塊的 Range 介面獲取資料,

2.3 串行讀與線性讀

流程三和四.

etcd 為了保證服務高可用,生產環境一般部署多個節點,多節點之間的資料由于延遲等關系可能會存在不一致的情況,

當 client 發起一個寫請求后分為以下幾個步驟:

1、Leader 收到寫請求,它會將此請求持久化到 WAL 日志,并廣播給各個節點;

只有 Leader 節點能處理寫請求,

2、若一半以上節點持久化成功,則該請求對應的日志條目被標識為已提交;

3、etcdserver 模塊異步從 Raft 模塊獲取已提交的日志條目,應用到狀態機 (boltdb 等),

此時若client 發起一個讀取 hello 的請求,假設此請求直接從狀態機中讀取,如果連接到的是C節點,若C節點磁盤I/O出現波動,可能導致它應用已提交的日志條目很慢,則會出現更新 hello 為 world 的寫命令,在client讀 hello 的時候還未被提交到狀態機,因此就可能讀取到舊資料,如上圖查詢hello流程所示,

所以在多節點etcd集群中,各個節點的狀態機資料一致性存在差異,而我們不同業務場景 的讀請求對資料是否最新的容忍度是不一樣的,有的場景它可以容忍資料落后幾秒甚至幾分 鐘,有的場景要求必須讀到反映集群共識的最新資料,根據業務場景對資料一致性差異的接受程度,

**etcd 中有兩種讀模式: **

1、串行 (Serializable) 讀:

直接讀狀態機資料回傳、無需通過 Raft 協議與集群進行互動, 它具有低延時、高吞吐量的特點,適合對資料一致性要求不高的場景,

2、線性讀:

etcd 默認讀模式是線性讀,需要經過 Raft 協議模塊,反應的是集群共識,因 此在延時和吞吐量上相比串行讀略差一點,適用于對資料一致性要求高的場景,

對資料敏感度較低的場景:

  • 直接讀狀態機資料回傳、無需通過 Raft 協議與集群進行互動的模式,在 etcd 里叫做串行 (Serializable) 讀,它具有低延時、高吞吐量的特點,適合對資料一致性要求不高的場景,

對資料敏感性高的場景:

  • 在 etcd 里面,提供了一種線性讀模式來解決對資料一致性要求高的場景,

什么是線性讀呢?

你可以理解一旦一個值更新成功,隨后任何通過線性讀的 client 都能及時訪問到,雖然集群中有多個節點,但 client 通過線性讀就如訪問一個節點一樣,etcd 默認讀模式是線性讀,因為它需要經過 Raft 協議模塊,反應的是集群共識,因此在延時和吞吐量上相比串行讀略差一點,適用于對資料一致性要求高的場景,

2.4 ReadIndex

在 etcd 3.1 引入了 ReadIndex 機制,保證在串行讀的時候,也能讀到最新的資料,

接下來看看線性讀的執行流程

具體流程如下:

  • 當收到一個線性讀請求時,它首先會從Leader獲取集群最新的已提交的日志索引(committed index),如上圖中的流程二所示,

  • Leader收到ReadIndex請求時,為防止腦裂等例外場景,會向Follower節點發送心跳確認,一半以上節點確認Leader身份后才能將已提交的索引(committed index)回傳給節點C(上圖中的流程三),

  • 節點則會等待,直到狀態機已應用索引 (applied index)大于等于Leader的已提交索引時(committed Index)(上圖中的流程四),然后去通知讀請求,資料已趕上 Leader,你可以去狀態機中訪問資料了(上圖中的流程五),

以上就是線性讀通過ReadIndex機制保證資料一致性原理,當然還有其它機制也能實作線性讀,如在早期etcd 3.0中讀請求通過走一遍Raft 協議保證一致性,這種Raft log read機制 依賴磁盤IO,性能相比 ReadIndex較差,

總體而言,KVServer模塊收到線性讀請求后,通過架構圖中流程三向Raft模塊發起 ReadIndex請求,Raft模塊將Leader最新的已提交日志索引封裝在流程四的ReadState結構體,通過channel層層回傳給線性讀模塊,線性讀模塊等待本節點狀態機追趕上Leader進度,追趕完成后,就通知KVServer模塊,進行架構圖中流程五,與狀態機中的 MVCC模塊進行進行互動了,

2.5 MVCC

流程五中的多版本并發控制(Multiversion concurrency control)模塊為了解決etcd v2不支持保存key的歷史版本、不支持多key事務等問題而產生的,它核心由記憶體樹形索引模塊 (treelndex)和嵌入式的KV持久化存盤庫 boltdb 組成,boltdb是個基于B+ tree實作的 key-value鍵值庫,支持事務,提供Get/Put等簡易API給etcd操作,

etcd MVCC 具體方案如下:

  • 每次修改操作,生成一個新的版本號 (revision),以版本號為 key, value 為用戶 key-value 等資訊組成的結構體存盤到 blotdb,
  • 讀取時·先從 treeIndex 中獲取 key 的版本號·,再以版本號作為 boltdb 的 key,從 boltdb 中獲取其 value 資訊,

2.6 treelndex

treelndex模塊是基于Google開源的記憶體版btree 庫實作的,treeIndex模塊只會保存用戶的key和相關版本號資訊,用戶 key 的value資料存盤在boltdb里面,相比ZooKeeper和 etcd v2全記憶體存盤,etcd v3對記憶體要求更低,

簡單介紹了etcd如何保存 key的歷史版本后,架構圖中流程六也就非常容易理解了,它需要從treelndex模塊中獲取 hello這個 key對應的版本號資訊,treeIndex模塊基于 B-tree快速查找此 key,回傳此 key對應的索引項keyIndex即可,索引項中包含版本號等資訊,

2.7 buffer

在獲取到版本號資訊后,就可從boltdb模塊中獲取用戶的key-value資料了,不過并不是所有請求都—定要從 boltdb 獲取資料,etcd出于資料一致性、性能等考慮,在訪問boltdb前,首先會從一個記憶體讀事務 buffer中,二分查找你要訪問key是否在 buffer里面,若命中則直接回傳,

2.8 boltdb

若buffer未命中,此時就真正需要向boltdb模塊查詢資料了,進入了流程七, 我們知道MySQL通過 table 實作不同資料邏輯隔離,那么在boltdb是如何隔離集群元資料 與用戶資料的呢?答案是bucket

boltdb 里每個 bucket 類似對應 MySQL 一個表,用戶的 key 資料存放的 bucket 名字的是 key,etcd MVCC 元資料存放的 bucket 是 meta,

我猜測這里的意思是每個key都當做一個 bucket,然后bucket的名字是 key,這里是猜測的,待驗證,若有知道的朋友,請不吝賜教,十分感謝,

因boltdb使用B+ tree來組織用戶的key-value資料,獲取 bucket key物件后,通過boltdb 的游標Cursor可快速在B+ tree找到 key hello對應的value資料,回傳給client, 到這里,一個讀請求之路執行完成,

文章來源:

etcd讀請求執行流程-視頻教程


etcd教程(七)---讀請求執行流程分析

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/556670.html

標籤:其他

上一篇:es筆記三之term,match,match_phrase 等查詢方法介紹

下一篇:返回列表

標籤雲
其他(162118) Python(38266) JavaScript(25524) Java(18290) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7288) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4611) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1989) .NET技术(1985) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 05、etcd 讀請求執行流程

    > 本篇內容主要來源于自己學習的視頻,如有侵權,請聯系洗掉,謝謝。 ### 1、etcd讀請求概覽 etcd是典型的`讀多寫少`存盤,在我們實際業務場景中,讀一般占據2/3以上的請求。一個讀 請求從client通過`Round-robin(輪詢)`負載均衡演算法,選擇一個etcd server節點,發 ......

    uj5u.com 2023-07-06 09:17:26 more
  • es筆記三之term,match,match_phrase 等查詢方法介紹

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記三之term,match,match_phrase 等查詢方法介紹](https://mp.weixin.qq.com/s/3tzD8dEr592WNJFH_1bKRw) 首先介紹一下在 es 里有兩種存盤字串的欄位型別,一個是 ke ......

    uj5u.com 2023-07-06 09:17:16 more
  • Spark的一些重要概念

    # Shuffle的深入理解 什么是Shuffle,本意為洗牌,在資料處理領域里面,意為將數打散。 問題:shuffle一定有網路傳輸嗎?有網路傳輸的一定是Shuffle嗎? ## Shuffle的概念 通過網路將資料傳輸到多臺機器,資料被打散,但是有網路傳輸,不一定就有shuffle,Shuffl ......

    uj5u.com 2023-07-06 09:16:59 more
  • 向量資料庫:新一代的資料處理工具

    向量資料庫是一種特殊型別的資料庫,它可以存盤和處理向量資料。向量資料通常用于表示多維度的資料點,例如在機器學習和人工智能中使用的資料。在向量資料庫中,資料被表示為向量,這些向量可以在多維空間中進行比較和搜索。 ......

    uj5u.com 2023-07-06 09:16:42 more
  • 基于袋鼠云實時開發平臺開發 FlinkSQL 任務的實踐探索

    隨著業務的發展,[實時場景](https://www.dtstack.com/dtinsight/streamworks?src=https://www.cnblogs.com/DTinsight/archive/2023/07/05/szsm)在各個?業中變得越來越重要。?論是?融、電商還是物流,實時資料處理都成為了其中的關鍵環節。Flink 憑借其強?的[流處理特性](https://www.dts ......

    uj5u.com 2023-07-06 09:16:26 more
  • Mysql進階篇(一)之存盤引擎

    # 一. MySQL體系結構 ![](https://tcs-devops.aliyuncs.com/storage/112v957e3962f4a8a6d4d8eb1a194d885fa0?Signature=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBcHB ......

    uj5u.com 2023-07-06 09:16:00 more
  • 從GaussDB(DWS)的技術演進,看資料倉庫的積淀與新生

    摘要:隨著云計算的興起和滲透,云數倉成為了數倉技術演進的新階段,并且逐漸成為了眾多企業的共同選擇。 本文分享自華為云社區《從GaussDB(DWS)的技術演進,看資料倉庫的積淀與新生》,作者: 華為云頭條。 資料驅動著現代商業的發展 今天,無論在制造、零售、物流 還是在互聯網、金融等行業 資料都變得 ......

    uj5u.com 2023-07-06 09:15:40 more
  • MySQL的match函式在sp中使用的BUG決議

    ## 一、問題發現 在一次開發中在sp中使用`MySQL PREPARE`以后,使用`match AGAINST`陳述句作為`prepare stmt`的引數后,發現執行第二遍call會導致資料庫crash,于是開始動手調查問題發生的原因。 > 注:本次使用的 MySQL 資料庫版本為最新的debug ......

    uj5u.com 2023-07-06 09:15:31 more
  • ElasticSearch - 批量更新bulk死鎖問題排查

    由于商品變更MQ訊息量巨大,為了提升更新ES的性能,防止出現MQ訊息積壓問題,所以本系統使用了BulkProcessor進行批量異步更新。 ......

    uj5u.com 2023-07-06 09:15:24 more
  • 分布式資料庫 Join 查詢設計與實作淺析

    相對于單例資料庫的查詢操作,分布式資料查詢會有很多技術難題。本文記錄 Mysql 分庫分表 和 Elasticsearch Join 查詢的實作思路,了解分布式場景資料處理的設計方案。

    文章從常用的關系型資料庫 MySQL 的分庫分表Join 分析,再到非關系型 ElasticSearch 來分析... ......

    uj5u.com 2023-07-06 09:15:17 more