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 ответов

19 просмотров

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

А вот тут я не уверен кстати. То, что адрес пода 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'ов из сервиса не нужен (ну то есть если конечно под на совсем удалился, то окей)

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
4
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта