WAL (журнал опережающей записи) журнал опережающей записи

MySQL

Что такое ВАЛ

WAL (Write Ahead Log) — это распространенный метод в системах баз данных для обеспечения атомарности и надежности операций с данными.

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

Файл журнала обычно содержит информацию о повторении и отмене. Смысл этого можно проиллюстрировать на примере. Предположим, программа теряет питание в середине какой-то операции. При перезапуске программе может потребоваться узнать, была ли операция, выполненная в это время, успешной, частично успешной или неудачной. Если используется WAL, программа может изучить лог-файл и сравнить то, что было запланировано для выполнения, с тем, что было фактически выполнено в случае внезапного отключения питания. На основе этого сравнения программа может решить, следует ли отменить то, что было сделано, продолжить то, что было сделано, или оставить все как есть.

WAL позволяет обновлять базу данных на месте. Еще один способ добиться атомарных обновлений — это теневое пейджинговое пейджинг, который не является методом на месте. Основное преимущество выполнения обновлений на месте заключается в уменьшении количества модификаций индексов и черных списков. ARIES — это алгоритм, обычно используемый в семействе технологий WAL. В файловых системах WAL часто называют журналированием. PostgreSQL также использует WAL для обеспечения функций восстановления на определенный момент времени и репликации базы данных.

резервный

Давайте подумаем об этом, если мы хотим убедиться, что операции с данными могут быть возобновлены. Что может быть сделано? Вам не нужно думать о том, как реализована база данных, и вам не нужно думать слишком глубоко. На самом деле это очень простая проблема, и мы часто сталкиваемся с такого рода проблемами. Самый простой способ — сделать резервную копию части данных: когда мне нужно обновить часть данных, я сначала делаю резервную копию этой части данных в одном месте, а затем обновляю ее. резервные данные. Таким образом, можно гарантировать откат транзакции и атомарность операции с данными. Фактически, до того, как SQLite представил WAL, атомарные транзакции были реализованы таким образом, который называется журналом отката.Принцип механизма журнала отката заключается в следующем: перед изменением данных в файле базы данных необходимо сделать резервную копию данных в измененной странице. в другом месте. , а затем запишите модификацию в файл базы данных; если транзакция не удалась, скопируйте данные резервной копии обратно и отмените модификацию; если транзакция прошла успешно, удалите данные резервной копии и зафиксируйте модификацию.

WAL

Продолжить вопрос выше? Как сделать данные восстанавливаемыми (атомарность) и успешно отправленные данные для сохранения на диск (постоянство)? Другой механизм — WAL, и принцип работы механизма WAL тоже очень прост:Изменения записываются не непосредственно в файл базы данных, а в другой файл с именем WAL; если транзакция завершается неудачно, записи в WAL игнорируются и модификация отменяется; если транзакция завершается успешно, она записывается обратно в файл базы данных. , фиксируя изменения.

Преимущества ВАЛА

  1. Чтение и запись могут выполняться полностью одновременно, не блокируя друг друга (но запись по-прежнему не может быть параллельной).
  2. WAL в большинстве случаев имеет лучшую производительность (поскольку нет необходимости записывать два файла для каждой записи).
  3. Поведение дискового ввода-вывода легче предсказать.
  4. Используйте меньше операций fsync(), чтобы уменьшить уязвимость системы.

Повысить производительность

Все мы знаем, что самой большой проблемой производительности базы данных является чтение и запись на диск.Многие предки ломали голову над обеспечением производительности хранения данных, предлагали и экспериментировали с набором методов. На самом деле все решения окончательно суммируются тремя способами:Произвольное чтение и запись изменить последовательное чтение и запись,Буферизация одиночного чтения и записи для пакетного чтения и записи,Однопотоковое чтение и запись для одновременного чтения и записи. По сути, WAL также является реализацией этих двух идей: с одной стороны, WAL записывает обновленное содержимое транзакций и записывает случайные грязные страницы в последовательную очистку журнала через WAL, а с другой стороны, WAL изменяет одну запись через буфер Очистка диска — это пакетная очистка буфера, и параллельная синхронизация может использоваться в процессе синхронизации от данных WAL до окончательных данных. Это значительно повышает производительность записи в базу данных, поэтому возможности записи WAL определяют верхний предел общей производительности базы данных, особенно при высокой степени параллелизма.

checkpoint

Как упоминалось выше, система базы данных, использующая WAL, не будет сбрасывать его в файл базы данных каждый раз, когда добавляется новый журнал WAL, обычно накапливает определенную сумму, а затем записывает в пакетах, обычно используяСтраницаединица, которая является единицей записи диска. Действие синхронизации файла WAL и файла базы данных называется контрольной точкой (контрольной точкой), как правило, когда в файле WAL накапливается определенное количество страниц для изменения; конечно, некоторые системы также могут выполнять контрольную точку вручную. После выполнения контрольной точки файл WAL можно очистить, что гарантирует, что файл WAL не будет слишком большим и производительность не ухудшится.

Некоторые запросы на чтение системы базы данных также могут использовать WAL, и последний статус данных можно получить, прочитав последний журнал WAL.

Реализация

Обычные базы данных обычно используют механизм WAL, но разные системные описания и реализации могут различаться. MySQL, sqlite, postgresql, etcd, hbase, zookeeper, elasticsearch и т. д. имеют свои собственные реализации.

mysql

Возможно, вы знакомы с WAL mysql. MySQL реализует WAL через журналы повторов и отмен. Журнал повторов называется журналом повторов.Всякий раз, когда выполняется операция, операция записывается в журнал повторов до того, как данные будут изменены, чтобы система могла продолжать работу после перезапуска в случае сбоя питания и т.п. Журнал отмен называется журналом отмен.Если некоторые изменения не могут быть завершены на полпути выполнения, их можно восстановить до состояния между изменениями согласно журналу отмен. В MySQL журнал повторов используется для восстановления данных (устойчивости транзакций) при сбое и перезапуске системы, а журнал отмен используется для обеспечения атомарности транзакций.

zookeeper

Как и большинство распределенных систем, ZooKeeper также имеет WAL (Write-Ahead-Log).Для каждой операции обновления ZooKeeper сначала записывает WAL, затем обновляет данные в памяти, а затем уведомляет клиента о результате обновления. Кроме того, ZooKeeper периодически делает снимок дерева каталогов в памяти и размещает его на диске. Основная цель этого конечно же сохранение данных, а вторая это ускорение скорости восстановления после перезапуска.Если все восстановление делать в виде Replay WAL то оно будет медленнее.

elasticsearch

если это не работаетfsyncСбрасывая данные из кеша файловой системы на жесткий диск, elasticsearch не может гарантировать, что данные все еще будут существовать после сбоя питания или даже нормального выхода из программы. Чтобы обеспечить надежность, необходимо убедиться, что изменения данных сохраняются на диск.

При динамическом обновлении индекса elasticsearch говорит, что полная фиксация сбрасывает сегменты на диск и записывает точку фиксации, содержащую список всех сегментов. Elasticsearch использует эту точку фиксации при запуске или повторном открытии индекса, чтобы определить, какие сегменты принадлежат текущему сегменту.

Даже при включенном поиске почти в реальном времени с обновлением каждую секунду, elasticsearch по-прежнему требует частых полных коммитов для обеспечения восстановления после сбоев. Но как насчет документов, которые изменились между коммитами?

Elasticsearch добавляетtranslog, или журнал транзакций, регистрируется каждый раз, когда операция выполняется в Elasticsearch.

etcd

Студенты, которые использовали etcd, могут обнаружить, что в каталоге данных etcd есть два подкаталога.walа такжеsnap. Их роль заключается в реализации механизма WAL.

wal: Храните журнал упреждающей записи, самая большая роль - записывать всю историю всех изменений данных. В etcd все изменения данных должны быть записаны в WAL перед фиксацией.

snap: Храните данные моментальных снимков и т. д., чтобы предотвратить слишком много файлов WAL, и настройте моментальные снимки для хранения состояния данных etcd.

Механизм WAL позволяет etcd выполнять следующие две функции:

  • Быстрое восстановление после сбоя: когда ваши данные повреждены, вы можете быстро восстановить исходные данные до состояния до повреждения данных, выполнив все операции модификации, записанные в WAL.
  • Откат данных (отмена)/повтор (повтор): поскольку все операции модификации записываются в WAL, их необходимо откатить или повторить, и только операции в журнале должны выполняться в направлении или в прямом направлении.

hbase

Способ, которым hbase реализует WAL, будет HLog, а RegionServer hbase будет сохранять данные в памяти (MemStore) и сбрасывать их на диск до тех пор, пока не будут выполнены определенные условия. Это позволяет избежать создания множества мелких файлов. Хранилище в памяти нестабильно, и HBase также использует WAL для решения этой проблемы: каждая операция обновления будет писать журнал, а запись журнала и операция обновления находятся в транзакции.

Рекомендуемая серия

Проблемы с большими таблицами Mysql и решения
Проблема с первичным ключом MySQL
столбчатое хранилище
Начальные знания и выбор базы данных временных рядов (TSDB)
Узнайте об Apache Druid за 10 минут
Базовый дизайн хранилища Apache Druid
Проектирование кластера и рабочий процесс для Apache Druid

Чтобы узнать больше о хранении данных, подпишитесь на мой официальный аккаунт.

MageByte