Посмертный анализ: неожиданная ошибка 500 возникла во время входа пользователя
Отчет о происшествии по поводу неожиданной ошибки 500, возвращенной службами аутентификации 18 июля 2024 года.
Резюме
18 июля 2024 года в Logto Cloud произошел сбой службы с ошибкой 500 Внутренняя ошибка сервера от служб аутентификации.
- Затронутые пользователи: Все пользователи Cloud, пытающиеся аутентифицироваться
- Затронутые регионы: Европа и США
- Серьезность: Критическая, нарушающая процесс входа пользователей
Корневая причина
Во время недавнего развертывания Cloud изменение структуры базы данных привело к сбою API процесса входа между тестовой и основной средами.
Хронология
- 2024-07-18 08:57 (UTC): Обновления развернуты в Logto Cloud
- 2024-07-18 09:28 (UTC): Первый пользователь сообщил о возникшей ошибке 500
- 2024-07-18 09:31 (UTC): Команда разработчиков признала проблему и начала расследование
- 2024-07-18 09:32 (UTC): Проблема была автоматически решена
- 2024-07-18 09:40 (UTC): Установлена корневая причина
Анализ инцидента
Что такое критическое изменение базы данных и почему оно произошло?
Мы разрабатываем новую функцию под названием "Покажи свой UI", которая позволяет пользователям кастомизировать интерфейс входа в Logto с помощью своих веб-страниц. Эта функция требует добавления нового столбца в таблицу sign-in-exp
для хранения настроек пользовательского интерфейса.
Из-за изменений в требованиях во время разработки выпуск функции был отложен, но первая часть изменений в структуре базы данных была развернута в основной среде несколько недель назад, хотя она еще не использовалась. Обновление столбца базы данных было представлено в этом PR.
К сожалению, это изменение было несовместимо с предыдущими версиями, что привело к ошибкам API запросов от старого кода при взаимодействии с новой базой данных.
Как мы развертываем новую версию Logto Cloud?
При развертывании новой версии Logto Cloud мы сначала развертываем её в тестовой среде, а затем меняем местами тестовую и основную среды. Процесс выглядит следующим образом:
- Запустить скрипт изменения базы данных и обновить базу данных.
- Развернуть новый исходный код на тестовом сервере.
- Запустить тестовый сервер и выполнить тесты.
- Поменять тестовый и основной сервера местами, чтобы "тестовая" среда стала "основной", позволяя пользователям переходить на новую версию без простоя.
Тем не менее, обе среды используют одну и ту же базу данных, и весь процесс занимает время. Следовательно, в промежуток времени между обновлением базы данных и сменой сред, онлайн-пользователи оставались в основной среде с использованием старого кода, но пытались взаимодействовать с новой базой данных.
Это и стало корневой причиной инцидента, а также причиной того, почему проблема была автоматически решена через 35 минут.