Что такое WAL (Write-Ahead Log), как он работает и для чего используется?

Ответ

WAL (Write-Ahead Log) — это стандартный механизм в базах данных и других системах хранения, обеспечивающий атомарность и долговечность (буквы 'A' и 'D' в ACID).

Суть в том, что любое изменение данных сначала записывается в специальный журнал (лог) и только после этого — в основное хранилище данных.

Как это работает?

  1. Запрос на изменение: Клиент отправляет операцию (например, UPDATE).
  2. Запись в лог: Система сначала дописывает запись об этой операции в конец WAL-файла на диске. Это очень быстрая последовательная операция.
  3. Подтверждение клиенту: Как только запись в WAL успешно сохранена, система может подтвердить клиенту успешное выполнение операции.
  4. Запись в основное хранилище: Позже, в фоновом режиме или по определенному триггеру (например, при заполнении буфера), система переносит изменения из лога в основное хранилище данных (что может включать медленные произвольные записи на диске).

Что хранится в WAL?

  • Записи об изменениях данных: Сериализованные операции INSERT, UPDATE, DELETE.
  • Записи о транзакциях: Маркеры начала (BEGIN), подтверждения (COMMIT) и отката (ROLLBACK) транзакций.
  • Контрольные точки (Checkpoints): Метки, указывающие, что все изменения до этой точки гарантированно сброшены из памяти на диск в основное хранилище.
  • Служебная информация: Например, LSN (Log Sequence Number) для отслеживания порядка записей.

Для чего это нужно?

  • Durability (Долговечность): Если сервер откажет после подтверждения операции, но до записи в основное хранилище, при перезапуске система сможет восстановить изменение из WAL.
  • Performance (Производительность): Быстрые последовательные записи в лог позволяют не ждать медленных произвольных записей в основные файлы данных, что значительно увеличивает пропускную способность на запись.
  • Recovery (Восстановление после сбоев): Лог можно «проиграть» заново, чтобы привести базу данных в последнее согласованное состояние.
  • Репликация (Replication): Поток записей из WAL часто используется для потоковой репликации на другие серверы (standby/replica).

Примеры систем, использующих WAL: PostgreSQL, Oracle, etcd, Kafka.