Недоступность сервисов Яндекс.Облака 17 июня 2019 года
17 июня с 7:35 до 12:05 пользователи Яндекс.Облака испытывали сложности с доступом к сервисам Яндекс.Облака через консоль и API. Хотим рассказать подробнее о случившемся.
Что произошло?
В 7:35 в рамках регулярных работ по диагностике сети был перезагружен коммутатор в одной из стоек зоны доступности ru-central1-a. В 7:43 наши дежурные зафиксировали на внутренних мониторингах отсутствие доступа к сервисам через консоль или API. При этом data plane сервиса виртуальных машин Yandex Compute Cloud, сервисов управляемых баз данных и остальных сервисов работал в штатном режиме.
Дежурные инженеры определили, что причина недоступности в одном из вспомогательных компонентов внутри системы хранения метаданных Яндекс.Облака. Ошибка была локализована в 10:18, и в 11:37 сборка с исправленной ошибкой была выкачена.
В 12:05 все сервисы Яндекс.Облака вернулись в рабочее состояние.
Причины
Сервисы Яндекс.Облака хранят метаданные в высокодоступном сервисе с кодовым названием Yandex Database (YDB), который состоит из полностью независимых баз данных (по одной на каждый сервис), каждая из которых распределена между тремя зонами доступности и переживает выход любой из них из строя без потерь. Единственный компонент внутри YDB, общий для всех баз данных, — это база для хранения метаданных самой YDB и компиляции запросов к другим базам.
Несмотря на то, что этот компонент способен выдерживать большую нагрузку, в обычном режиме он обслуживает небольшое количество запросов, так как схемы баз данных сервисов меняются нечасто. В тестовых целях на базу метаданных длительное время создавалась дополнительная нагрузка в виде создания и удаления объектов схем, не приводившая к каким-либо проблемам.
При вышеупомянутых диагностических работах с сетью база метаданных кратковременно потеряла связность. Из-за программной ошибки, которая была обнаружена еще до этого, но не была еще устранена на продуктовом кластере Облака, база выслала все накопленные за время своей работы (uptime) команды на удаление объектов. Из-за существенного uptime очередь команд на удаление выросла до значительных размеров, и при фиксации на диске полученных ответов об удаленных объектах было превышено допустимое ограничение по памяти, что привело в свою очередь к рестарту базы метаданных.
База метаданных спроектирована таким образом, что после сбоя штатным образом поднимается заново на любой доступной ноде и восстанавливает свое состояние с дисков из лога изменений. Обычно рестарт базы занимает незначительное время (<1c), а time-to-live (TTL) пре-компилированных запросов был установлен в несколько минут. Но из-за программной ошибки, которая бы не проявилась без вышеописанного стечения обстоятельств, база не смогла корректно восстановить свое состояние в сроки установленного TTL.
Меры для предотвращения повторения подобной ситуации в будущем:
- Как мы уже упомянули, программная ошибка в базе метаданных была исправлена во время устранения инцидента.
- Мы уже увеличили TTL пре-компилированных запросов до 6 часов во всех сервисах Яндекс.Облака.
- Мы увеличиваем долговременную тестовую нагрузку на базу метаданных. В pre-production кластерах Яндекс.Облака база метаданных будет работать с принудительными сбоями.
- Мы реализуем шардирование базы метаданных между другими базами данных.