Что такое WAL и как он влияет на производительность и надежность базы данных?
Что проверяют
Понимаете ли вы, как достигается устойчивость записи, и знаете ли её цену. Для бэкендера на Go это не теория: журнал упреждающей записи встречается и в PostgreSQL, и во встраиваемых хранилищах, и в собственном коде сервиса.
Как отвечать
Идея: прежде чем менять страницы данных, изменение записывается в последовательный журнал, и журнал сбрасывается на диск. Транзакция считается зафиксированной, когда запись о её коммите гарантированно на носителе, а не когда обновлены страницы.
Почему это быстрее, а не медленнее: журнал пишется добавлением в конец, и на коммит приходится один сброс на диск вместо множества случайных записей по файлу данных. Страницы правятся в буферном пуле и вытесняются позже, при контрольной точке, крупными порциями.
Что обязательно назвать. Восстановление: после сбоя журнал проигрывается с последней контрольной точки, незавершённые транзакции откатываются. Групповой коммит: параллельные транзакции объединяют сброс на диск, поэтому пропускная способность растёт быстрее, чем задержка одной из них. Цена: данные пишутся дважды, журнал занимает место, а его объём между контрольными точками задаёт время восстановления. Репликация строится на том же потоке записей.
В Go это встречается предметно: SQLite в режиме журнала перестаёт блокировать читателей на время записи, LSM-хранилища пишут журнал перед таблицей в памяти. Пишете журнал сами, закладывайте контрольную сумму записи, нарезку на сегменты и отбрасывание обрезанного хвоста при проигрывании.
Где спотыкаются
Считают, что достаточно обычной записи в файл. Без сброса на диск данные лежат в страничном кеше и исчезают при потере питания, а ошибку сброса нельзя проглатывать: повторный вызов вправе вернуть успех, хотя страница уже потеряна.
Путают журнал с резервной копией. Он восстанавливает согласованность после сбоя, но без базового бэкапа бесполезен, а место под ним кончается внезапно, если репликация отстала и сегменты не удаляются.
Крутят настройки ради скорости, не проговаривая, чем платят. Отключение синхронного коммита ускоряет запись ценой потери последних транзакций при аварии: для журнала событий это осознанный выбор, для платежей недопустимый.