Когда отваливается шард базы данных
Что проверяют
Понимаете ли вы, что отказ шарда это частичная авария: страдает только часть ключей, и от архитектуры зависит, превратится ли она в падение всего сервиса. Следом обычно спрашивают, что увидит пользователь в эти секунды и не потеряются ли последние записи.
Как отвечать
Разложите ответ на слои: что происходит в базе, что делает приложение, что делаете вы.
- база: у каждого шарда должен быть свой набор реплик. В MongoDB реплика-сет сам выбирает новый primary, выборы начинаются, если primary молчит дольше
electionTimeoutMillis(по умолчанию 10 секунд). В PostgreSQL переключение делает внешний инструмент вроде Patroni. В Redis Cluster мастер подменяет его реплика, а если живой реплики нет, приcluster-require-full-coverage yes(значение по умолчанию) кластер перестаёт обслуживать запросы целиком, а не только потерянные слоты; - потеря данных: при асинхронной репликации новый primary может не получить последние транзакции. Это ваш RPO, и его стоит назвать честно, а не обещать ноль;
- приложение: короткие таймауты на подключение и запрос (в
asyncpgэтоtimeoutиcommand_timeout), повторы с экспоненциальной задержкой и джиттером только для идемпотентных операций, circuit breaker, чтобы не долбить мёртвый узел. Запросы, которые обходят все шарды, должны уметь вернуть частичный результат по таймауту, а не ждать упавший узел; - деградация: чтение можно временно отдавать из реплики или кэша с пометкой об устаревании, запись по ключам упавшего шарда складывать в очередь, если бизнес это допускает;
- наблюдаемость: алерты на отставание реплик и ошибки по каждому шарду отдельно, иначе средняя по кластеру скроет проблему.
Где спотыкаются
Отвечают «Kubernetes перезапустит под». Перезапуск не вернёт данные с умершего диска и не решит, кто теперь primary.
Называют бэкапы механизмом отказоустойчивости. Восстановление из копии занимает часы, это защита от потери данных, а не от простоя.
Ставят бесконечные повторы без задержки. Во время переключения они создают шторм запросов и мешают новому primary подняться.