ETCD數據空間壓縮清理
場景:做etcd數據鏡像的時候出現如下錯誤 Error: etcdserver: mvcc: database space exceeded
通過查找官方文檔https://coreos.com/etcd/docs/latest/op-guide/maintenance.html 確定解決方案,通過執行命令壓縮etcd空間並且整理空間碎片即可
命令如下:
#使用API3 export ETCDCTL_API=3 # 查看告警信息,告警信息一般 memberID:8630161756594109333 alarm:NOSPACE etcdctl --endpoints=http://127.0.0.1:2379 alarm list # 獲取當前版本 rev=$(etcdctl --endpoints=http://127.0.0.1:2379 endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*') # 壓縮掉所有舊版本 etcdctl --endpoints=http://127.0.0.1:2379 compact $rev # 整理多余的空間 etcdctl --endpoints=http://127.0.0.1:2379 defrag # 取消告警信息 etcdctl --endpoints=http://127.0.0.1:2379 alarm disarm
數據壓縮完成之后數據大小和內存占用信息如下:
通過上圖可以看出,壓縮操作執行完之后數據庫大小和內存占用率下降了很多,整體的性能也會有所提升
說明:
壓縮ETCD空間也可以減少etcd程序的內存占用量,提高etcd性能,在沒有問題的時候提前進行壓縮也是明智的選擇
通過線上實踐發現還是設置自動壓縮更靠譜,官方同樣提供數據自動壓縮方式,歷史數據只保留一個小時的
詳細信息可以參考官方文檔: https://coreos.com/etcd/docs/latest/op-guide/maintenance.html#history-compaction
etcd can be set to automatically compact the keyspace with the --auto-compaction option with a period of hours: # keep one hour of history $ etcd --auto-compaction-retention=1
根據實踐發現只配置auto-compaction-retention只會做碎片整理,不會實際減少空間大小; 如果需要減少大小還是需要使用etcdctl compact 和 etcdctl defrag清理空間