本文節選自《不一樣的 雙11 技術:阿裡巴巴經濟體雲原生實踐》一書
作者 | 陳星宇(宇慕)阿裡雲基礎技術中台技術專家
導讀:etcd 是阿裡巴巴内部容器雲平台用于存儲關鍵元資訊的元件。阿裡巴巴使用 etcd 已經有 3 年的曆史, 在今年 雙11 過程中它又一次承擔了關鍵角色,接受了 雙11 大壓力的檢驗。為了讓更多同學了解到 etcd 的最佳實踐和阿裡巴巴内部的使用經驗,本文作者将和大家分享阿裡巴巴是如何把 etcd 更新得更強、更穩、更高效的,希望通過這篇文章讓更多人了解 etcd, 享受雲原生技術帶來的紅利。
讓 etcd 變得更強
本節主要介紹 etcd 在性能方面的更新工作。首先我們來了解一下 etcd 的性能背景。
性能背景
這裡先庖丁解牛,将 etcd 分為如下幾個部分,如下圖所示:

每一部分都有各自的性能影響,讓我們逐層分解:
- raft 層:raft 是 etcd 節點之間同步資料的基本機制,它的性能受限于網絡 IO、節點之間的 rtt 等, WAL 受到磁盤 IO 寫入延遲;
- 存儲層:負責持久化存儲底層 kv, 它的性能受限于磁盤 IO,例如:fdatasync 延遲、記憶體 treeIndex 索引層鎖的 block、boltdb Tx 鎖的 block 以及 boltdb 本身的性能;
- 其他還有諸如主控端核心參數、grpc api 層等性能影響因子。
服務端優化
了解完背景後,這裡介紹一下性能優化手段,主要由服務端和用戶端兩個方面組成,這裡先介紹服務端優化的一些手段。
硬體部署
etcd 是一款對 cpu、記憶體、磁盤要求較高的軟體。随着内部存儲資料量的增加和對并發通路量的增大,我們需要使用不同規格的硬體裝置。這裡我們推薦 etcd 至少使用 4 核 cpu、8GB 記憶體、SSD 磁盤、高速低延遲網絡、獨立主控端部署等(具體硬體的
配置資訊)。在阿裡巴巴,由于有超大規模的容器叢集,是以我們運作 etcd 的硬體也較強。
軟體優化
etcd 是一款開源的軟體,集合了全世界優秀軟體開發者的智慧。最近一年在軟體上有很多貢獻者更新了很多性能優化,這裡分别從幾個方面來介紹這些優化,最後介紹一個由阿裡巴巴貢獻的 etcd 存儲優化。
- 記憶體索引層。由于索引層大量使用鎖機制同步對性能影響較大,通過優化鎖使用,提升了讀寫性能,具體參考: github pr ;
- lease 規模化使用。lease 是 etcd 支援 key 使用 ttl 過期的機制。在之前的版本中 scalability 較差,當有大量 lease 時性能下降的較為嚴重,通過優化 lease revoke 和過期失效的算法,解決了 lease 規模性的問題,具體參考:
- 後端 boltdb 使用優化。etcd 使用 boltdb 作為底層資料庫存儲 kv, 它的使用優化對整體性能影響很大。
通過調節不同的 batch size 和 interval, 使我們可以根據不同硬體和工作負載優化性能,具體參考:
。
除此之外,新的完全并發讀特性也優化了 boltdb tx 讀寫鎖性能,大幅度地提升了讀寫性能,具體參考:
最後介紹一個由阿裡巴巴自主研發并貢獻開源社群的優化:基于 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 個最佳實踐:
- put 資料時避免大的 value, 大的 value 會嚴重影響 etcd 性能,例如:需要注意 Kubernetes 下 crd 的使用;
- 避免建立頻繁變化的 key/value, 例如:Kubernetes 下 node 資料上傳更新;
- 避免建立大量 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 等。
針對這些風險點,我們從以下幾方面入手:
- 建立完善的監控告警機制,覆寫用戶端輸入,etcd 自身以及主控端環境狀态;
- 客戶操作審計,高危操作如删除資料做風控限流;
- 資料治理,分析用戶端濫用,引導最佳實踐;
- 定期資料冷備,通過熱備實作異地多活,保證資料安全;
- 常态化故障演練,做好故障恢複預案。
總結展望:讓 etcd 變得更智能
本文分别從性能、穩定性、生态工具三個部分享了 etcd 變得更強、更快、更高效的技巧。在未來我們還将為讓 etcd 變得更智能而努力。如何讓 etcd 變得更智能是一個比較進階的話題,這裡簡單做一下展望。更智能的意思是指可以使 etcd 的管理更加地聰明,更少的人為幹預,例如遇到一些故障,系統可以自行修複等。
本書亮點
- 雙11 超大規模 K8s 叢集實踐中,遇到的問題及解決方法詳述
- 雲原生化最佳組合:Kubernetes+容器+神龍,實作核心系統 100% 上雲的技術細節
- 雙 11 Service Mesh 超大規模落地解決方案
“ 阿裡巴巴雲原生 微信公衆号(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術公衆号。”