
Prometheus-Prometheus-Opterator中添加監控etcd集群
PS 參考博文 :一文帶你快速入門etcd(萬字長文)
目錄
一、Etcd快速入門
1.1、 etcd 介紹
- 2013 年 6 月,CoreOS 發起了 etcd 項目。etcd 使用 Go 語言實現,是分布式系統中重要的基礎組件,目前最新版本為 V3.4.9。etcd 可以用來構建高可用的分布式鍵值數據庫,根據官網介紹,總結來說有如下的特點:
- 簡單:etcd 的安裝簡單,且為用戶提供了 HTTP API,用戶使用起來也很簡單
- 存儲:etcd 的基本功能,數據分層存儲在文件目錄中,類似於我們日常使用的文件系統
- Watch 機制:Watch 指定的鍵、前綴目錄的更改,並對更改時間進行通知
- 安全通信:SSL 證書驗證
- 高性能:etcd 單實例可以支持 2k/s 讀操作,官方也有提供基准測試腳本
- 一致可靠:基於 Raft 共識算法,實現分布式系統數據的高可用性、一致性
- etcd 是一個分布式鍵值存儲數據庫,支持跨平台,擁有強大的社區。etcd 的 Raft 算法,提供了可靠的方式存儲分布式集群涉及的數據。etcd 廣泛應用在微服務架構和 Kubernates 集群中,不僅可以作為服務注冊與發現,還可以作為鍵值對存儲的中間件。從業務系統 Web 到 Kubernetes 集群,都可以很方便地從 etcd 中讀取、寫入數據。
二、etcd 應用場景
- etcd 在穩定性、可靠性和可伸縮性表現極佳,同時也為雲原生應用系統提供了協調機制。etcd 經常用於服務注冊與發現的場景,此外還有鍵值對存儲、消息發布與訂閱、分布式鎖等場景。
2.1、 鍵值對存儲
- 如下是官方對 etcd 的描述:
A highly-available key value store for shared configuration and service discovery.
一個用於配置共享和服務發現的鍵值存儲系統。
- 從其定義來看,etcd 是一個「鍵值存儲」的組件,存儲是 etcd 最基本的功能,其他應用場景都是建立在 etcd 的可靠存儲上。etcd 的存儲有如下特點:
- 采用鍵值對數據存儲,讀寫性能一般高於關系型數據庫;
- etcd 集群分布式存儲,多節點集群更加可靠;
- etcd 的存儲采用類似文件目錄的結構:
- 葉子節點存儲數據,其他節點不存儲,這些數據相當於文件;
- 非葉節點一定是目錄,這些節點不能存儲數據。
- 比如 Kubernetes 將一些元數據存儲在 etcd 中,將存儲狀態數據的的復雜工作交給 etcd,Kubernetes 自身的功能和架構能夠更加專注。
2.2、服務注冊與發現
- 分布式環境中,業務服務多實例部署,這個時候涉及到服務之間調用,就不能簡單使用硬編碼的方式指定服務實例信息。服務注冊與發現就是解決如何找到分布式集群中的某一個服務(進程),並與之建立聯系。
- 服務注冊與發現涉及三個主要的角色:服務請求者、服務提供者和服務注冊中心。

- 服務提供者啟動的時候,在服務注冊中心進行注冊自己的服務名、主機地址、端口等信息;服務請求者需要調用對應的服務時,一般通過服務名請求服務注冊中心,服務注冊中心返回對應的實例地址和端口;服務請求者獲取到實例地址、端口之后,綁定對應的服務提供者,實現遠程調用。
- etcd 基於 Raft 算法,能夠有力地保證分布式場景中的一致性。各個服務啟動時注冊到 etcd 上,同時為這些服務配置鍵的 TTL 時間,定時保持服務的心跳以達到監控健康狀態的效果。通過在 etcd 指定的主題下注冊的服務也能在對應的主題下查找到。為了確保連接,我們可以在每個服務機器上都部署一個 Proxy 模式的 etcd,這樣就可以確保訪問 etcd 集群的服務都能夠互相連接。
2.3、消息發布與訂閱
- 在分布式系統中,服務之間還可以通過消息通信,即消息的發布與訂閱。通過構建一個消息中間件,服務提供者發布對應主題的消息,而消費者則訂閱他們關心的主題,一旦對應的主題有消息發布,即會產生訂閱事件,消息中間件就會通知該主題所有的訂閱者。

- 如微服務架構中的認證鑒權服務,Auth 服務的實例地址、端口和實例節點的狀態存放在 etcd 中,客戶端應用訂閱對應的主題,而 etcd 設置 key TTL 可以確保存儲的服務實例的健康狀態。
2.4、分布式鎖
- 分布式系統中涉及到多個服務實例,存在跨進程之間資源調用,對於資源的協調分配,單體架構中的鎖已經無法滿足需要,需要引入分布式鎖的概念。分布式鎖可以將資源標記存儲,這里的存儲不是單純屬於某個進程,而是公共存儲,諸如 Redis、Memcache、關系型數據庫、文件等。
- etcd 基於 Raft 算法,實現分布式集群的一致性,存儲到 etcd 集群中的值必然是全局一致的,因此基於 etcd 很容易實現分布式鎖。分布式鎖有兩種使用方式:保持獨占和控制時序。

- 保持獨占,從字面可以知道,所有獲取資源的請求,只有一個成功。etcd 通過分布式鎖原子操作 CAS 的 API,設置 prevExist 值,從而保證在多個節點同時去創建某個目錄時,最后只有一個成功,創建成功的請求獲取到鎖。
- 控制時序,有點類似於隊列緩沖,所有的請求都會被安排分配資源,但是獲得鎖的順序也是全局唯一的,執行按照先后的順序。etcd 提供了一套自動創建有序鍵的 API,對一個目錄的建值操作,這樣 etcd 會自動生成一個當前最大的值為鍵,並存儲該值。同時還可以使用 API 按順序列出當前目錄下的所有鍵值。
三、PromQL查詢etcd指標
3.1、etcd 節點可用性
運行節點的數
sum(up{job="etcd"})
檢查節點是否有leader,指標為1 ,表示正常
max(etcd_server_has_leader)
Etcd 的leader角色變化
- Leader也會變化,但是過於頻繁的變化可能影響etcd本身的性能。這可能是一個信號:由於連接問題leader變得不穩定,或者etcd 負載過重
changes(etcd_server_leader_changes_seen_total[1d])
3.2、請求情況
etcd gRPC 平均每分鍾調用失敗率
max(sum(rate(grpc_server_handled_total{grpc_type="unary",grpc_code!="OK"}[1m])) by (grpc_service) / sum(rate(grpc_server_started_total{grpc_type="unary"}[1m])) by (grpc_service) * 100.0)
raft協議的請求(提案):
- 指標有四個不同類型:committed、applied、pending和failed。以上四種可以提供etcd可能面臨的問題的信息,其中最重要的是failed這個狀態,如果是failed,則可能有兩個原因:或是leader選舉失敗,或者失去法定節點數。
rate(etcd_server_proposals_failed_total{job=~"etcd"}[15m])
etcd_server_proposals_committed_total :已落實共識提案的總數
etcd_server_proposals_applied_total :已應用的共識提案總數
(etcd_server_proposals_committed_total - etcd_server_proposals_applied_total) >= 1000
etcd_server_proposals_pending :前正在處理的請求(提交會議討論決定的建議) 數量
etcd_server_proposals_failed_total :失敗提案總數
3.3、API Server對etcd 的讀寫緩存
緩存中的元素數
etcd_helper_cache_entry_count
緩存命中計數
etcd_helper_cache_hit_count
緩存未命中計數
etcd_helper_cache_miss_count
3.4、網絡相關
grpc_server_started_total grpc :(高性能、開源的通用RPC(遠程過程調用)框架)服務器啟動總數
etcd_network_client_grpc_received_bytes_total :接收到grpc客戶端的字節總數
etcd_network_client_grpc_sent_bytes_total :發送給grpc客戶端的字節總數
etcd_network_peer_received_bytes_total etcd :網絡對等方接收的字節總數(對等網絡,即對等計算機網絡,是一種在對等者(Peer)之間分配任務和工作負載的分布式應用架構,是對等計算模型在應用層形成的一種組網或網絡形式)
etcd_network_peer_sent_bytes_total etcd :網絡對等方發送的字節總數
3.5、磁盤操作狀態
etcd_disk_backend_commit_duration_seconds_sum etcd :磁盤后端提交持續時間秒數總和
etcd_disk_backend_commit_duration_seconds_bucket etcd :磁盤后端提交持續時間
3.6、文件
process_open_fds{service="etcd-k8s"} :打開文件描述符的數量
process_max_fds{service="etcd-k8s"} :打開文件描述符的最大數量
etcd_disk_wal_fsync_duration_seconds_sum Wal :(預寫日志系統)調用的fsync(將文件數據同步到硬盤)的延遲分布
etcd_disk_wal_fsync_duration_seconds_bucket :后端調用的提交的延遲分布
3.7、快照
etcd快照保存用時
etcd_debugging_snap_save_total_duration_seconds_sum
