172 похожих чатов

#Базывкубеболь #mongodb Такой вопрос, вот есть statefulSet c mongodb в конфигурации

replicaSet (PRIMARY + SECONDARY + SECONDARY)
Допустим мы обновляем в нем request/лимиты или меняем еще что-то в спеке pod'а что-то.

допустим на данный момент
mongo-0 - PRIMARY
mongo-1 - SECONDARY
mongo-2 - SECONDARY

Ну и конечно есть headles сервис для этого дела

У клиентов указаны все поды в качестве uri подключения, то есть: mongodb://mongo-0.headles-service:27017,mongo-1.headles-service:27017,mongo-2.headles-service:27017/db-name

Что делают контроллер statefulset и всякие preStop хуки
1) грохает mongo-2
2) когда mongo-2 перезапустился, грохает mongo-1. (тут стоит lifecycle.preStop, который ожидает когда mongo-2 будет отставать от мастера не больше чем на 10 секунд)
3) когда mongo-1 перезапустился. (Мы точно уверены что mongo-2 нормауль поднялся и не сильно отстает от PRIMARY). Контроллер грохает mongo-0 с PRIMARY
И тут нюанс, когда pod грохается, он сразу помечается как terminating и следовательно выкидывается из endpoint сервиса, а следовательно DNS адрес вида mongo-0.headles-service перестает резолвится. Все эти вещи происходят НЕ дожидаясь выполнения lifecycle.preStop

Другими словами, если мы быстро не назначим перевыборы PRIMARY в момент когда mongo-0 начинает грохатся, то у клиентов новые коннекты с запросами на запись перестанут проходить, поскольку DNS mongo-0.headles-service (который до сих пор считается PRIMARY) перестает резолвится и к нему не подключитьтся.

То есть на 3 этапе, лучше не ждать когда mongo-1 догонит PRIMARY, а сразу делать rs.stepDown() для принудительных перевыборов PRIMARY.
А так как мы не дождались и не знаем что там с mongo-1, то у нас на момент убийства mongo-0 и команды rs.setDown(), скорее всего будет жить и нормально работать только mongo-2, что по идее довольно рисковання ситуация (жива только одна реплика из трех)

юзать readinessProbe для того чтобы ждать когда репликация догонит, тоже нерабочая идея, поскольку пока мы не прошли readinessProbe, мы не появимся в качестве endpoint'ов в headles сервиса, а значит остальной replicaSet монги просто не увидет перезапущенную реплику и она никогда не подключится в replicaSet.

как с таким живете?

Я в качестве решения, вижу только тут возможность разруливать это со стороны оператора. Причем чтобы нормально рулить перезапусками, надо свой контроллер реализовывать, а не statefulSet, ну либо создавать по одному sts на каждый pod для replicaSet mongodb.

8 ответов

23 просмотра

да, нужен оператор

А вот тут я не уверен кстати. То, что адрес пода mongo-0 перестанет ресолвится. Мне помнится, там другой механизм и адреса не готовых подов выкидываются только из headles.ns.svc

Lucky SB
А вот тут я не уверен кстати. То, что адрес пода m...

это если флажок соответствующий стоит

Dmitry-Sergeev 🇺🇦 Автор вопроса
Lucky SB
А вот тут я не уверен кстати. То, что адрес пода m...

> То, что адрес пода mongo-0 перестанет ресолвится. инфа сотка, у меня в кластере перестает резолвится примерно через 7-10 секунд как только под переходит в terminating и запускается preStop хук

Dmitry-Sergeev 🇺🇦 Автор вопроса
George Gaál
в сервисе блин

пойду смотреть флаги. Поскольку в mongodb вообще этот функционал по выкидываю endpoint'ов из сервиса не нужен (ну то есть если конечно под на совсем удалился, то окей)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта