當前位置:首頁 » 存儲配置 » etcd文件索引存儲

etcd文件索引存儲

發布時間: 2023-05-05 00:05:13

⑴ etcd工作原理和部署指南

​ etcd是由CoreOS團隊發的一個分布式一致性的KV存儲系統,可用於服務注冊發現和共享配置,隨著CoreOS和Kubernetes等項目在開源社區日益火熱,它們項目中都用斗老塌到的etcd組件作為一個高可用強一致性的服務發現存儲倉庫,漸漸為開發人員所關注。在雲計算時代,如何讓服務快速透明地接入到計算集群中,如何讓共享配置信息快速被集群中的所有機器發現,更為重要的是,如何構建這樣一套高可用、安全、易於部署以及響應快速的服務集群,已經成為了迫切需要解決的問題。etcd為解決這類問題帶來了福音,本文將從etcd的應用場景開含檔始,深入解讀etcd的實現方式,以供開發者們更為充分地享用etcd所帶來的便利。

​ etcd推薦使用奇數作為集群節點個數。因為奇數個節點和其配對的偶數個節點相比,容錯能力相同,卻可以少一個節點。綜合考慮性能和容錯能力,etcd官方文檔推薦的etcd集群大小是3,5,7。由於etcd使用是Raft演算法,每次寫入數據需要有2N+1個節點同意可以寫入數據,所以部分節點由於網路或者其他不可靠因素延遲收到數據更新,但是最終數據會保持一致,高度可靠。隨著節點數目的增加,每次的寫入延遲會相應的線性遞增,除了節點數量會影響寫入數據的延遲,如果節點跟接節點之間的網路延遲,也會導致數據的延遲寫入。
結論:
​ 1.節點數並非越多越好,過多的節點將會導致數據延遲寫入。
​ 2.節點跟節點之間的跨機房,專線之間網路延遲,也將會導致數據延遲寫入。
​ 3.受網路IO和磁碟IO的延遲
​ 4.為了提高吞吐量,etcd通常將多個請求一次批量處理並提交Raft,
​ 5.增加節點,讀性能會提升,寫性能會下降,減少節點,寫性能會提升。

參數說明:

這種方式就是 利用一個已有的 etcd 集群來提供 discovery 服務,從而搭建一個新的 etcd 集群。

假設已有的 etcd 集群的一個訪問地址是: myetcd.local ,那麼我們首先需要在已有 etcd 中創建一個特殊的 key,方法如下:

其中 value=3 表示本集群的大小,即: 有多少集群節點。而 就是用來做 discovery 的 token。

接下來你在 3 個節點上分別啟動 etcd 程序,並加上剛剛的 token。
加 token 的方式同樣也有 命令行參數 環境變數 兩種。

命令行參數:

環境變數

命令行參數 啟動方式為例:

可以使用etcd附帶的 基準 CLI工具完成基準測試etcd性能。

對於一些基準性能數字,我們考慮具有以下硬體配置的三個成員的etcd集群:

有了這個配置,etcd可以大致寫出:

示例命令是:

可線性讀取請求通過集群成員的法定人數達成一致以獲取最新數據。可序列化的讀取請求比線性讀取要便宜,因為它們由任何單個etcd成員提供,而不是成員法定人數,以換取可能的陳舊數據。etcd可以閱讀:

示例命令是:

我們鼓勵在新環境中首次安裝etcd集群時運行基準測試,以確保集群達到足夠的性能; 群集延遲和吞吐量可能會對較小的環境差異敏感。

以上測試部分翻譯空圓自官方文檔( https://coreos.com/etcd/docs/latest/op-guide/performance.html )

⑵ etcd簡要使用

etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines.
從定義可以看到,etcd是一個key-value型存儲,具有強一致性

etcd的客戶端有etcdctl、etcd-go、etcd-java,其中etcdctl是etcd自帶的命令行工具,其主要命令有

etcd的數據是按照B+樹的方式組織,並按照MVCC的思想存儲數據,也就衡早祥是數據按照多咐搏個版本存儲,每個版本都有一個版本號,當數據更新時,並非更新原有數據,而是再存儲一條新版本號數據。

在內存中,實際上有兩個B+樹,一個存儲key到revison的映射,一個存儲revison和value的映射。當進行get的時候,先到key-revison映射中查找revison,如果未制定版本號,就取最新的revison,然後睜祥用revison到revison-value的B+樹查找value。

為什麼要用B+樹,因為要支持范圍查找。

本文總結etcd的簡要使用,下篇再對底層原理進行解析。

⑶ Etcd 寫請求過程

etcdserver:mvcc:database space exceeded錯誤:

etcd server收到put/txn等寫請求的時候,會首先檢查當前etcd db大小加上請求的key-value大小隻是否超過了配額。
如果超過配額,會產生一個告警請求,告警類型為NO SPACE,並通過Raft日誌同步給其他節點,告知db無空間,並將告警持久化
到db中。

etcd設置建議配額不超過8G。APPLY模塊在執行每個命令的時候,都會去檢查當前是否存在NO SPACE告警,如果有則拒絕寫入。
在調大配額之後,需要發送一個取消告警的命令,以消世棚巧除所有告警。

檢查etcd的壓縮是否開啟、配置是否合理。在配置etcd db配額,就不要設置小於0的,這樣是禁用配額功能。

為了保證集群穩定性,避免雪崩,任何提交到raft模塊的請求,都會做一些簡單的限速判斷。

在經過檢查之後,會生成一個唯一的ID,將此請求關聯到一個對應的消息通知channel,然後raft模塊發起Propose一個提案,向raft模和遲塊發起的提案後,
KVServer模塊會等待此put請求,等待寫入結果通過消息通知channel返回或者超時。etcd默認超時時間是7秒,如果一個請求超時未返回結果,則可能會出現你熟悉的

Raft模塊收到提案後,如果當前節點是Follower,它會轉發給Leader,只有Leader才能搜鍵處理寫請求,Leader收到提案後,通過Raft模塊輸出待轉發給Follower
節點的消息和待持久化的日誌條目。
etcdserver 從Raft模塊獲取到以上消息和日誌條目後,作為Leader,它會將put提案消息廣播給集群各個節點,同時需要把集群Leader任期號、投票信息、
以提交索引、提案內容持久化到一個WAL日誌文件中,用於保證集群的一致性,可恢復性。

WAL記錄是按照順序追加寫入組成,每個記錄由類型(Type)、數據(Data)、循環冗餘校驗碼(CRC)組成。

WAL記錄類型目前支持5種,分別是文件元數據記錄、日誌條目記錄、狀態信息記錄、CRC記錄、快照記錄:

WAL模塊是如何持久化一個put提案的日誌條目記錄:

每個提案被提交前都會被持久化到WAL文件中,以保證集群的一致性和可恢復性。

etcd的冪等性是根據Raft日誌條目中的索引欄位。etcd通過引入consistent index欄位,來存儲系統當前已經執行過的日誌條目索引,實現冪等性。

Apply模塊基於consistent index和事務實現了冪等性。

MVCC主要是由兩部分組成,一個是內存索引模塊treeIndex,保存key的歷史版本信息,另一個是boltdb模塊,用來持久化存儲key-value數據。

版本號在etcd裡面發揮著重大作用,它是etcd的邏輯時鍾。etcd啟動的時候默認版本號是1,從最小值1開始枚舉到最大值,未讀到數據的數據則結束,最後讀出來的
版本號即時當前etcd的最大版本號currentRevision。

boltdb是一個基於B+tree實現的key-value嵌入式db,通過提供桶機制實現類似於Mysql表的邏輯隔離。
將修改的數據放入到一個名為key的桶里,在啟動etcd時自動創建。

boltdb value的值是將包含key名稱、key創建是時版本號、最後一次修改的版本號、修改菜蔬、value值、租賃信息序列化為二進制數據。

etcd使用合並再合並解決寫性能差的問題:

etcd在啟動時候通過mmap機制將etcd db文件映射到etcd進程地址空間,並設置mmap的MAP_POPULATE flag,它會告訴Linux內核預讀文件,Linux就會將文件內容
拷貝到物理內存中,此時會產生磁碟I/O。節點在內存足夠的請求下,後續處理讀請求過程中就不會產生磁碟I/O了。
如果etcd節點內存不足時,可能會導致db文件對應的內存頁被換出,當讀請求命中的文件未在內存中時,就會產生缺頁異常,導致讀過程中產生磁碟IO,
可以通過觀察etcd進程
可以通過觀察etcd進程的majflt欄位來判斷etcd是否產生了主缺頁中斷。

⑷ k8s etcd 與持久化存儲

1、是什麼

2、etcd架構及工作原理

(1) 數據流程

一個用戶的請求發送過來,會經過HTTP Server轉發給store進行具體事務處理,如果涉及到節點的修改,則需要交給raft模塊進行狀態的變更,日誌的記錄,然後再同步給別的etcd節點確認數據提交,最後進行數據提交,再次同步

(2)工作原理

Etcd使用 Raft協議 來維護集群內各個節點狀態的 一致性 。簡單說,ETCD集群是一個分布式系統,由多個節點相互通信構成整體對外服務, 每個節點都存顫鋒慎儲了完整的數據 ,並且通過Raft協議保證每個節點維護的數據是一致的

(3) 主要組成部分

(4)etcd集群中的術語

3、k8s中的etcd

(1)etcd在k8s中的作用: etcd在kubernetes集群是用來存放數據並通知變動的

(2)為什麼k8s選擇etcd:

PV 目前支持的類型包括:gcePersistentDisk 、AWSElasticBlockStore 、AzureFile 、AzureDisk 、FC ( Fibre Channel ) 、Flocker、NFS 、iSCSI 、RBD (Rados Block Device )、CephFS 、Cinder、GlusterFS 、V sphere Volume 、Quobyte Volumes 、VMware Photon 、Portwonc
Volumes 、ScaleIO Volumes 和HostPath (僅供單機測試)。

如果某茄敬個Pod 想申請某種類型的PY ,則首先基鄭需要定義一個PersistentVolurneClaim ( PVC )對象,然後,在Pod 的Volume 定義中引用上述PVC 即可:

上傳文件後綴名為etcd的文件

etcd是一個高可用的鍵值存儲系統,主要用於共享配置和服務發現。etcd是由CoreOS開發並維護的,靈感來自於 ZooKeeper 和 Doozer,它使用Go語言編寫,並通過Raft一致性演算法處理日誌復制以保證強一致性。Raft是一個來自Stanford的新仿畢的一致性演算法,適用於分布式系統的日誌復制,Raft通過選舉的方式來實現一致性,在Raft中,任何一個節點都可能成為Leader。Google的容器集群管理系統Kubernetes、開源PaaS平台Cloud Foundry和CoreOS的Fleet都廣泛使用了etcd。

etcd 集群的工作原理基於 raft 共識演算法 (The Raft Consensus Algorithm)。etcd 在 0.5.0 版本中重新實現了 raft 演算法,而非像之前那樣依賴於第三方庫 go-raft 。raft 共識演算法的優點在於可以在高效的解決分布式系統中各個節點日誌穗首內容一致性問題的同時,也使得集群具備一定的容錯能力。即使集群中出現部分節點故障、網路故障等問題,仍可保證備族芹其餘大多數節點正確的步進。甚至當更多的節點(一般來說超過集群節點總數的一半)出現故障而導致集群不可用時,依然可以保證節點中的數據不會出現錯誤的結果。

⑹ 筆記本etcd什麼意思

鍵值存儲倉庫,用於配置共享和服務發現。
擴展知識:etcd(橋山襲讀作 et-see-dee)是一種開源的分布式統一唯慧鍵值存儲,用於分布式系統或計算機集群的共享配置、服務發現和的調度協調。etcd 有助於促進更加安全的自動更新,協調向主機調度的工作,並幫助設置容器的覆蓋網路。

etcd 是許多其敏兄他項目的核心組件。最值得注意的是,它是 Kubernetes 的首要數據存儲,也是容器編排的實際標准系統。使用 etcd, 雲原生應用可以保持更為一致的運行時間,而且在個別伺服器發生故障時也能正常工作。應用從 etcd 讀取數據並寫入到其中;通過分散配置數據,為節點配置提供冗餘和彈性。

⑺ ETCD——基礎原理

一個ETCD集群一般由3個或者5個節點組成,兩個quorum一定存在交集,則

即:3個節點容忍1個節點故障,5個節點容忍2個節點故障,以此類推。

首先,所有的數據都保存在B+樹(灰色),當我們指定了版本信息之後,會直接到灰色B+樹中去獲取相關的數據;同時,還有另外一個B+樹,它維護了key和revions的映射關系,查詢key的數據時候,會根清凳頌據key查詢到revision,再通過revision查詢到相應的key。

etcd 使用 raft 協議來維護集群內各個節點狀態的一致性。簡單說,etcd 集群是一個分布式系統,由多個節點相互通信構成整體對外服務,每個節點都存儲了完整的數據,並且通過 Raft 協議保證每個節點維護的數據粗備是一致的。

每個 etcd 節點都維護了一個狀態機,並且,任意時刻至多存在一個有效的主節點。主節點處理所有來自客戶端寫操作,通過 Raft 協議保證寫操作對狀態機的改動會可靠的同步到其他節點。

etcd 的設計目標是用來存放非頻繁更新的數據,提供可靠的 Watch插件,它暴露了鍵值對的歷史版本,以支持低成本的快照、監控歷史事件。這些設計目標要求它使用一個持久化的、多版本的、支持並發的數據數據模型。

當 etcd 鍵值對的新版本保存後,先前的版本依然存在。從效果上來說,鍵值對是不可變的,etcd 不會對其進行 in-place 的更新操作,而總是生成一個新的數據結構。為了防止歷史版本無限增加,etcd 的存儲支持壓縮(Compact)以及刪除老舊版本。

邏輯視圖

從邏輯角度看,etcd 的存儲是一個扁平的二進制鍵空間,鍵空間有一個針對鍵(位元組字元串)的詞典序索引,因此范圍查詢的成本較低。

鍵空間維護了多個修訂版本(Revisions),每一個原子變動操作(一個事務可由多個子操作組成)都會產生一個新的修訂版本。在集群的整個生命周期中,修訂版都是單調遞增的。修訂版同樣支持索引,因此基於修訂版的范圍掃描也是高效的。壓縮操作需要指定一個修訂版本答鄭號,小於它的修訂版會被移除。

一個鍵的一次生命周期(從創建到刪除)叫做 「代 (Generation)」,每個鍵可以有多個代。創建一個鍵時會增加鍵的版本(version),如果在當前修訂版中鍵不存在則版本設置為1。刪除一個鍵會創建一個墓碑(Tombstone),將版本設置為0,結束當前代。每次對鍵的值進行修改都會增加其版本號 — 在同一代中版本號是單調遞增的。

當壓縮時,任何在壓縮修訂版之前結束的代,都會被移除。值在修訂版之前的修改記錄(僅僅保留最後一個)都會被移除。

物理視圖

etcd 將數據存放在一個持久化的 B+ 樹中,處於效率的考慮,每個修訂版僅僅存儲相對前一個修訂版的數據狀態變化(Delta)。單個修訂版中可能包含了 B+ 樹中的多個鍵。

鍵值對的鍵,是三元組(major,sub,type)

鍵值對的值,包含從上一個修訂版的 Delta。B+ 樹 —— 鍵的詞法位元組序排列,基於修訂版的范圍掃描速度快,可以方便的從一個修改版到另外一個的值變更情況查找。

etcd 同時在內存中維護了一個 B 樹索引,用於加速針對鍵的范圍掃描。索引的鍵是物理存儲的鍵面向用戶的映射,索引的值則是指向 B+ 樹修該點的指針。

元數據存儲——Kubernetes

Service Discovery(Name Service)

Distributed Coordination: Leader Election

⑻ kubernetes控制平面組件:etcd

--listen-peer-urls

--listen-client-urls

--initial-advertise-peer-urls

--initial-cluster

--initial-cluster-state

--advertise-client-urls



1.code

headless svc, 像DNS RR ClusterIP:None

kubectl -n stg1 get endpoints

client 怎麼訪問:


2.配置文件

3.apply


官方的code有兩個問題

本地訪問

擴容

利用反親和性 分布etcd pod到不同節點

~ ❯❯❯ etcdctl get / --prefix


從 etcd 的架構圖中我們可以看到,etcd 主要分為四個部分。


etcd 目前支持 V2 和 V3 兩個大版本,這兩個版本在實現上有比較大的不同,一方面是對外提供介面的方式,另一方面就是底層的存儲引擎,V2 版本的實例是一個純內存的實現,所有的數據都沒有存儲在磁碟上,而 V3 版本的實例就支持了數據的持久化。

v3默認boltdb

consortium etcd2+mysql

數據默認會存放在 /var/lib/etcd/default/ 目錄。我們會發現數據所在的目錄,會被分為兩個文件夾中,分別是 snap 和 wal目錄。

解決三個問題:節點選舉、拆仿日誌復制以及安全性

每一個 Raft 集群中都包含多個伺服器,在任意時刻,每一台伺服器只可能處於 Leader Follower 以及 Candidate 三種狀態;在處於正常的狀態時,集群中只會存在一個 Leader 狀態,其旅畝纖余耐中的伺服器都是 Follower 狀態。

所有的 Follower 節點都是被動的,它們不會主動發出任何的請求 ,只會響應 Leader 和 Candidate 發出的請求。對於每一個用戶的可變操作,都會被路由給 Leader 節點進行處理,除了 Leader 和 Follower 節點之外,Candidate 節點其實只是集群運行過程中的一個臨時狀態。

每一個伺服器都會存儲當前集群的最新任期,它就像是一個單調遞增的邏輯時鍾,能夠同步各個節點之間的狀態,當前節點持有的任期會隨著每一個請求被傳遞到其他的節點上。Raft 協議在每一個任期的開始時都會從一個集群中選出一個節點作為集群的 Leader 節點,這個節點會負責集群中的日誌的復制以及管理工作。

客戶端通過 監聽指定的key可以迅速感知key的變化並作出相應處理 ,watch機制的實現依賴於 資源版本號revision的設計 ,每一次key的更新都會使得revision原子遞增,因此根據不同的版本號revision的對比就可以感知新事件的發生。etcd watch機制有著廣泛的應用,比如利用etcd實現分布式鎖; k8s中監聽各種資源的變化 ,從而實現各種controller邏輯等。


watch機制的實現主要可分為三個部分

client使用 watchClient 的watch介面發起watch請求,與server端建立一個 gRPCStream 連接。

server端會為每個client生成唯一一個watch id,並記錄每個client也就是watcher監聽的key或者key range,通過recvLoop接收client請求,通過sendLoop發送請求,server端只負責收發請求和響應。

主要的實現都放在了watchalbStore層,watchalbStore會監聽key的變化,然後通過syncWatchersLoop和syncVictimsLoop兩個處理流程將key的更新變化包裝成event,通過channel發送給gRPC server。

MVCC(Multiversion Concurrency Control)多版本並發控制機制


場景1:

這就是悲觀鎖

悲觀鎖:悲觀得認為並發事務會沖突,所以要先拿鎖,拿到鎖的作修改操作

場景2

資料庫:寫回磁碟,A寫好了。哎,B和C都是version 13,我咋寫?算了,報錯吧。。

就是樂觀鎖,默認不加鎖,你盡管寫,沖突我認慫!樂觀鎖其實不是鎖,只是相對悲觀鎖來定義,適合讀多寫少。

樂觀鎖:樂觀得認為數據不會沖突,但發生沖突時要能檢測到。


場景3


這就是MVCC,在 MVCC 資料庫中,你更新一個 key-value 數據的時候,它並不會直接覆蓋原數據,而是 新增一個版本來存儲新的數據,每個數據都有一個版本號 ,版本號是一個邏輯時鍾,不會因為伺服器時間的差異而受影響。

MVCC不等於樂觀鎖!

--rev 查的是main

在底層boltdb里,實際分布是這樣的:

底層的key是revision,/奧特曼是用戶key,「他很帥」就是用戶value

刪除

之前有delete動作,但是依然有版本記錄。為什麼?

刪除這個動作,其實etcd是在blotdb里寫了一條,「刪除用戶/奧特曼」

此時有個問題:用戶說我的確刪除了啊,真的不要了!請把空間還給我啊!

回收 compact(壓縮)

etcdctl compact {version}

compact 需要一個版本號。這個版本號就是寫事務遞增的那個版本號,compact 12345,就是說把版本12345以前的 標記刪除了的數據 釋放掉,用戶沒刪除的數據肯定不能回收。

如何壓縮:


注意修改go.mod

Watch

服務發現要解決的也是分布式系統中最常見的問題之一,即在同一個分布式集群中的進程或服務,要如何才能找到對方並建立連接。本質上來說,服務發現就是想要了解集群中是否有進程在監聽 udp 或 tcp 埠,並且通過名字就可以查找和連接。

需要實現的功能;

discover.go


eBay payment

ebay kubernetes 控制面架構

問題

熱點內容
h板電影種子ftp 發布:2025-02-11 09:06:10 瀏覽:738
c語言數據類型定義 發布:2025-02-11 09:00:38 瀏覽:237
一個小時如何選擇伺服器 發布:2025-02-11 08:58:14 瀏覽:442
網易我的世界伺服器推薦國服 發布:2025-02-11 08:56:34 瀏覽:241
電視父母鎖屏密碼應該會是什麼 發布:2025-02-11 08:36:42 瀏覽:892
梅花適合用哪些植物進行配置 發布:2025-02-11 08:30:54 瀏覽:252
安卓手機如何像蘋果一樣彈窗 發布:2025-02-11 08:26:33 瀏覽:912
壓縮文件掃碼 發布:2025-02-11 08:20:55 瀏覽:258
小米5安卓70怎麼分屏 發布:2025-02-11 08:00:58 瀏覽:140
訪問二維碼 發布:2025-02-11 08:00:11 瀏覽:883