1. 程式人生 > >更強、更穩、更高效:解讀 etcd 技術升級的三駕馬車

更強、更穩、更高效:解讀 etcd 技術升級的三駕馬車

點選下載《不一樣的 雙11 技術:阿里巴巴經濟體雲原生實踐》

本文節選自《不一樣的 雙11 技術:阿里巴巴經濟體雲原生實踐》一書,點選上方圖片即可下載!

作者 | 陳星宇(宇慕)阿里雲基礎技術中臺技術專家

導讀:etcd 是阿里巴巴內部容器雲平臺用於儲存關鍵元資訊的元件。阿里巴巴使用 etcd 已經有 3 年的歷史, 在今年 雙11 過程中它又一次承擔了關鍵角色,接受了 雙11 大壓力的檢驗。為了讓更多同學瞭解到 etcd 的最佳實踐和阿里巴巴內部的使用經驗,本文作者將和大家分享阿里巴巴是如何把 etcd 升級得更強、更穩、更高效的,希望通過這篇文章讓更多人瞭解 etcd, 享受雲原生技術帶來的紅利。

讓 etcd 變得更強

本節主要介紹 etcd 在效能方面的升級工作。首先我們來理解一下 etcd 的效能背景。

效能背景

這裡先庖丁解牛,將 etcd 分為如下幾個部分,如下圖所示:

每一部分都有各自的效能影響,讓我們逐層分解:

  1. raft 層:raft 是 etcd 節點之間同步資料的基本機制,它的效能受限於網路 IO、節點之間的 rtt 等, WAL 受到磁碟 IO 寫入延遲;

  2. 儲存層:負責持久化儲存底層 kv, 它的效能受限於磁碟 IO,例如:fdatasync 延遲、記憶體 treeIndex 索引層鎖的 block、boltdb Tx 鎖的 block 以及 boltdb 本身的效能;

  3. 其他還有諸如宿主機核心引數、grpc api 層等效能影響因子。

服務端優化

瞭解完背景後,這裡介紹一下效能優化手段,主要由服務端和客戶端兩個方面組成,這裡先介紹服務端優化的一些手段。

硬體部署

etcd 是一款對 cpu、記憶體、磁碟要求較高的軟體。隨著內部儲存資料量的增加和對併發訪問量的增大,我們需要使用不同規格的硬體裝置。這裡我們推薦 etcd 至少使用 4 核 cpu、8GB 記憶體、SSD 磁碟、高速低延遲網路、獨立宿主機部署等(具體硬體的配置資訊)。在阿里巴巴,由於有超大規模的容器叢集,因此我們執行 etcd 的硬體也較強。

軟體優化

etcd 是一款開源的軟體,集合了全世界優秀軟體開發者的智慧。最近一年在軟體上有很多貢獻者更新了很多效能優化,這裡分別從幾個方面來介紹這些優化,最後介紹一個由阿里巴巴貢獻的 etcd 儲存優化。

  1. 記憶體索引層。由於索引層大量使用鎖機制同步對效能影響較大,通過優化鎖使用,提升了讀寫效能,具體參考:github pr;
  2. lease 規模化使用。lease 是 etcd 支援 key 使用 ttl 過期的機制。在之前的版本中 scalability 較差,當有大量 lease 時效能下降的較為嚴重,通過優化 lease revoke 和過期失效的演算法,解決了 lease 規模性的問題,具體參考:github pr;
  3. 後端 boltdb 使用優化。etcd 使用 boltdb 作為底層資料庫儲存 kv, 它的使用優化對整體效能影響很大。

通過調節不同的 batch size 和 interval, 使我們可以根據不同硬體和工作負載優化效能,具體參考:github pr。

除此之外,新的完全併發讀特性也優化了 boltdb tx 讀寫鎖效能,大幅度地提升了讀寫效能,具體參考:github pr。

最後介紹一個由阿里巴巴自主研發並貢獻開源社群的優化:基於 segregated hashmap 的 etcd 內部儲存 freelist 分配回收演算法。

下圖是一個 etcd 節點的架構,etcd 使用 boltdb 持久化儲存所有 kv,它的效能好壞對 etcd 效能起著非常重要的作用。

在阿里巴巴內部大規模使用 etcd 用於儲存元資料,在使用中我們發現了 boltdb 的效能問題。這裡給大家分享一下:

上圖是 etcd 內部儲存分配回收的核心演算法。etcd 內部預設以 4kB 為一個頁面大小儲存資料。圖中的數字表示頁面 id, 紅色表示該頁面正在使用, 白色表示沒有。當用戶刪除資料時 etcd 不會把儲存空間還給系統,而是內部先留存起來維護一個頁面池,以提升再次使用的效能,這個頁面池專業術語叫 freelist。當 etcd 需要儲存新資料時,普通 etcd 會線性掃描內部 freelist,時間複雜度 o(n),當資料量超大或是內部碎片嚴重的情況下,效能會急劇下降。

因此我們重新設計並實現了基於 segregated hashmap 的 etcd 內部儲存 freelist 分配回收新演算法,該優化演算法將內部儲存分配演算法時間複雜度從 o(n) 降為 o(1), 回收從 o(nlgn) 也降為 o(1), 使 etcd 效能有了質的飛躍,極大地提高了 etcd 儲存資料的能力,使得 etcd 儲存容量提升 50 倍,從推薦的 2GB 提升到 100GB;讀寫效能提升 24 倍。CNCF 官方部落格收錄了此次更新,感興趣的讀者可以讀一下。

客戶端優化

效能優化除了服務端要做的事情外,還需要客戶端的幫助。保持客戶端使用最佳實踐將保證 etcd 叢集穩定高效地執行,這裡我們分享 3 個最佳實踐:

  1. put 資料時避免大的 value, 大的 value 會嚴重影響 etcd 效能,例如:需要注意 Kubernetes 下 crd 的使用;
  2. 避免建立頻繁變化的 key/value, 例如:Kubernetes 下 node 資料上傳更新;
  3. 避免建立大量 lease 物件,儘量選擇複用過期時間接近的 lease, 例如 Kubernetes 下 event 資料的管理。

讓 etcd 管理更高效

作為基於 raft 協議的分散式鍵值資料庫,etcd 是一個有狀態的應用。管理 etcd 叢集狀態、運維 etcd 節點、冷熱備份、故障恢復等過程均有一定複雜性,且需要具備 etcd 核心相關的專業知識,想高效地運維 etcd 有不小的挑戰。

目前在業界裡已經有一些 etcd 運維的工具,例如開源的 etcd-operator 等,但是這些工具往往比較零散,功能通用性不強,整合度比較差,學習這些工具的使用也需要一定的時間,關鍵是這些工具不是很穩定,存在穩定性風險等。

面對這些問題,我們根據阿里巴巴內部場景,基於開源 etcd-operator 進行了一系列修改和加強,開發了 etcd 運維管理平臺 Alpha。利用它,運維人員可以高效地運維管理 etcd,之前要前後操作多個工具完成的任務,現在只要操作它就可以完成,一個人就可以管理成百上千的 etcd 叢集。

下圖展示了 Alpha 的基礎功能:

如上圖所示,Alpha 分為 etcd 生命週期管理和資料管理兩大部分。

其中生命週期管理功能依託於 operator 中宣告式的 CustomResource 定義,將 etcd 的叢集建立、銷燬的過程流程化、透明化,使用者不再需要為每個 etcd 成員單獨制定繁瑣的配置,僅需要指定成員數量、成員版本、效能引數配置等幾個簡單欄位。除此之外,我們還提供了 etcd 版本升級、故障節點替換、叢集例項啟停等功能,將 etcd 常用的運維操作自動化,同時也在一定程度上保證了 etcd 變更的穩定性。

其次,資料作為 etcd 的核心內容,我們也開發了一系列功能進行重點保障。在備份上,資料管理工具支援定期冷備及實時熱備,且保持本地盤和雲上 OSS 兩類備份,同時也支援從備份上快速恢復出一個新的 etcd 叢集。此外,資料管理工具支援對 etcd 進行掃描分析,發現當前叢集的熱點資料鍵值數和儲存量,彌補了業界無法提供資料管理的空白,同時該拓展也是 etcd 支援多租戶的基礎。最後,資料管理工具還支援對 etcd 進行垃圾資料清理、跨叢集資料騰挪傳輸等功能。

這些豐富的功能為上層 Kubernetes 叢集的管理提供了很多靈活的幫助,例如使用者 A 原來在某雲廠商或自建 Kubernetes 叢集,我們可以通過遷移 etcd 內部的賬本資料的功能,將使用者的核心資料搬移至另外一個叢集,方便地實現使用者的 K8s 叢集跨雲遷移。

利用 Alpha,我們可以做到透明化、自動化、白屏化,減少人肉黑屏操作,讓 etcd 運維管理更高效。

讓 etcd 變得更穩

本節主要介紹一些 etcd 穩定建設的技巧。大家知道 etcd 是容器雲平臺的底層依賴核心,它的服務質量、穩定程度決定了整個容器雲的穩定程度,其重要性無需贅述。這裡先介紹一下 etcd 常見的問題和風險分析,如下圖所示,主要分三個方面:

  • etcd 自身:例如 OOM、程式碼 bug、panic 等;
  • 宿主機環境:例如宿主機故障、網路故障、同一臺宿主機其他程序干擾;
  • 客戶端:例如客戶端 bug、運維誤操作、客戶端濫用 ddos 等。

針對這些風險點,我們從以下幾方面入手:

  1. 建立完善的監控告警機制,覆蓋客戶端輸入,etcd 自身以及宿主機環境狀態;
  2. 客戶操作審計,高危操作如刪除資料做風控限流;
  3. 資料治理,分析客戶端濫用,引導最佳實踐;
  4. 定期資料冷備,通過熱備實現異地多活,保證資料安全;
  5. 常態化故障演練,做好故障恢復預案。

總結展望:讓 etcd 變得更智慧

本文分別從效能、穩定性、生態工具三個部分享了 etcd 變得更強、更快、更高效的技巧。在未來我們還將為讓 etcd 變得更智慧而努力。如何讓 etcd 變得更智慧是一個比較高階的話題,這裡簡單做一下展望。更智慧的意思是指可以使 etcd 的管理更加地聰明,更少的人為干預,例如遇到一些故障,系統可以自行修復等。

本書亮點

  • 雙11 超大規模 K8s 叢集實踐中,遇到的問題及解決方法詳述
  • 雲原生化最佳組合:Kubernetes+容器+神龍,實現核心系統 100% 上雲的技術細節
  • 雙 11 Service Mesh 超大規模落地解決方案

“阿里巴巴雲原生微信公眾號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術公眾號。”