Хранилище etcd превысило квоту и перешло в режим только чтения
«mvcc: database space exceeded» в etcd кластера PostgreSQL на Patroni (и в Kubernetes): хранилище превысило квоту quota-backend-bytes, etcd поднял тревогу NOSPACE и перестал принимать запись. Patroni не может обновлять состояние кластера. Как сжать, дефрагментировать и снять тревогу.
Что это значит
etcd хранит все версии ключей, пока их не сожмут, и ограничивает размер своей базы квотой --quota-backend-bytes (по умолчанию 2 ГБ). Когда база доходит до квоты, etcd включает тревогу NOSPACE и отклоняет любую запись с ошибкой mvcc: database space exceeded. Patroni в отказоустойчивом кластере PostgreSQL хранит в etcd состояние кластера и лидера: без записи он не может продлевать лидерство, и кластер может остаться без мастера. В Kubernetes то же самое останавливает изменение любых объектов.
Как проверить
ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out=table
ETCDCTL_API=3 etcdctl alarm list
Что сделать
По справке вендора на каждом узле etcd по очереди:
rev=$(ETCDCTL_API=3 etcdctl --endpoints=:2379 endpoint status --write-out=json | egrep -o '"revision":[0-9]*' | egrep -o '[0-9]+')
ETCDCTL_API=3 etcdctl compact $rev
ETCDCTL_API=3 etcdctl defrag
ETCDCTL_API=3 etcdctl alarm disarm
Чтобы не повторилось, включить автоматическое сжатие (--auto-compaction-retention) и при необходимости поднять квоту (--quota-backend-bytes) в параметрах службы etcd, затем перезапустить узлы по одному.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать