1. 程式人生 > 實用技巧 >ETCD資料空間壓縮清理

ETCD資料空間壓縮清理

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清理空間