Merhaba,
Yeni yılın ilk yazısınında ETCD Compaction Defrag işlemlerini inceleyeceğiz. ETCD veritabanlarında yaşanan “etcdserver: mvcc: database space exceeded” ve “alarm:NOSPACE” hatalarının hızlı çözümü için neler yapılması gerektiğine bakacağız. Ayrıca etcd veritabanının boyutunun kontrol altında tutulabilmesi için compact ve defrag işlemlerinden de bahsedeceğiz.
Bildiğiniz üzere etcd, patroni HA veya kubernetes HA yapılarında leader seçimlerinde kullanılan key-value bir veritabanıdır ve HA yapılarında en kritik katmandır. Eğer etcd veritabanı boyutu dolduğu için servis çalışamaz hale gelirse tüm HA yapısı çalışmasını durduracak ve kesinti yaşanacaktır.
Alınan hata aşağıdaki gibidir:
Error: etcdserver: mvcc: database space exceeded {"level":"warn","ts":"2023-01-01T18:00:05.218+0300","logger":"etcd-client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc00039e700/127.0.0.1:2379","attempt":0,"error":"rpc error: code = ResourceExhausted desc = etcdserver: mvcc: database space exceeded"} Error: etcdserver: mvcc: database space exceeded
ETCD compaction defrag adımlarına geçecek olursak. Öncelikle sağlıklı çalışan bir etcd cluster ortamında aşağıdaki gibi ERRORS alanında herhangi bir kayıt olmaması gerekir.
NOT: Siz de etcd veritabanında testler yapmak isterseniz aşağıdaki örnekle veri basıp gerekli testlerinizi yapabilirsiniz:
[root@forenda-etcd1 ~]# for ((i=0; i<100000; i++)); do etcdctl --user root: put foo$i bar; done
Yük bastıktan sonra etcd cluster bilgisinde “ERRORS” alanında ve alarm list komut çıktısında hataları görebiliriz.
[root@forenda-etcd1 ~]# ETCDCTL_API=3 etcdctl --endpoints=$ETCDENDPOINTS alarm list memberID:14701692329170355828 alarm:NOSPACE
Yukarıdaki hataları aldıktan sonra hızlı çözüm için ilk önce leader üzerinden etcd backup alınmalıdır:
[root@forenda-etcd1]# etcdctl snapshot save backup.db
Yedek alındıktan sonra son revision değeri bulunarak bu değere kadar compaction işlemi yapılmalıdır:
[root@forenda-etcd1 ~]# etcdctl endpoint status --write-out="json" | jq -r .[].Status.header.revision
25012
[root@forenda-etcd1 ~]# ETCDCTL_API=3 etcdctl --endpoints=$ETCDENDPOINTS compact 25012
compacted revision 25012
[root@forenda-etcd1 ~]# ETCDCTL_API=3 etcdctl --endpoints=$ETCDENDPOINTS defrag
Finished defragmenting etcd member[IP1:2379]
Finished defragmenting etcd member[IP2:2379]
Finished defragmenting etcd member[IP2:2379]
[root@forenda-etcd1 ~]# ETCDCTL_API=3 etcdctl --endpoints=$ETCDENDPOINTS alarm disarm
memberID:14701692329170355828 alarm:NOSPACE
[root@forenda-etcd1 ~]# etcdctl endpoint status --cluster -w table
Gördüğünüz üzere hem veritabanı boyutu küçülmüş oldu hem de ERRORS alanındaki hatalar giderilerek etcd cluster yapısı sağlıklı bir şekilde çalışmaya devam edecektir.
Compaction işlemlerinin otomatik olarak yapılması için aşağıdaki parametreler etcd.conf dosyasına eklenmelidir:
ETCD_AUTO_COMPACTION_RETENTION="24h"
ETCD_AUTO_COMPACTION_MODE="periodic"
Örneğin etcd_auto_compaction_retention süresini 1 dk yaparsanız aşağıdaki loglarda çalışma detaylarını görebilirsiniz.
Dec 31 23:55:43 forenda-etcd1 etcd[2667693]: {"level":"info","ts":"2022-12-31T23:55:43.058+0300","caller":"v3compactor/periodic.go:142","msg":"completed auto p eriodic compaction","revision":9507,"compact-period":"1m0s","took":"3.103314ms"}
Dec 31 23:56:43 forenda-etcd1 etcd[2667693]: {"level":"info","ts":"2022-12-31T23:56:43.064+0300","caller":"v3compactor/periodic.go:134","msg":"starting auto pe riodic compaction","revision":9507,"compact-period":"1m0s"}
Dec 31 23:56:43 forenda-etcd1 etcd[2667693]: {"level":"info","ts":"2022-12-31T23:56:43.067+0300","caller":"v3compactor/periodic.go:142","msg":"completed auto p eriodic compaction","revision":9507,"compact-period":"1m0s","took":"2.697555ms"}
Bu sayede ETCD compaction defrag adımlarını tamamlamış oluyoruz.
Not1: Compaction işlemi sonrası düzenli olarak defrag işlemi yapılması gerekir, cluster ortamlarda kesinlikle aynı anda yapılmamalıdır ve en sonra leader sunucuda defrag çalışmalıdır. Bu işlemi cronjob tanımlayarak yapabilirsiniz.
Not2: defrag işlemi sırasında tüm etcd servis bloklanacağı için kesinti yaşayabilirsiniz, en az kullanılan yoğunlukta ve command_timeout parametresiyle çalıştırılmalıdır.
Bu makalemizde ETCD compaction defrag işlemlerini incelemiş olduk. Başka bir yazıda ise etcd quota,metric gibi monitoring işlemlerinden bahsedeceğiz.
Faydalı olması dileğiyle.
Forenda DBA