Ответ
WAL (Write-Ahead Log) — это стандартный механизм в базах данных и других системах хранения, обеспечивающий атомарность и долговечность (буквы 'A' и 'D' в ACID).
Суть в том, что любое изменение данных сначала записывается в специальный журнал (лог) и только после этого — в основное хранилище данных.
Как это работает?
- Запрос на изменение: Клиент отправляет операцию (например,
UPDATE
). - Запись в лог: Система сначала дописывает запись об этой операции в конец WAL-файла на диске. Это очень быстрая последовательная операция.
- Подтверждение клиенту: Как только запись в WAL успешно сохранена, система может подтвердить клиенту успешное выполнение операции.
- Запись в основное хранилище: Позже, в фоновом режиме или по определенному триггеру (например, при заполнении буфера), система переносит изменения из лога в основное хранилище данных (что может включать медленные произвольные записи на диске).
Что хранится в 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.