Подтвердить что ты не робот

Почему базы данных SQL используют журнал записи на запись в журнале команд?

Я читал о файле voltdb журнала команд. Журнал команд записывает транзакционные вызовы вместо каждого изменения строки, как в журнале с записью. Записывая только вызов, журналы команд сохраняются на минимальном уровне, ограничивая влияние дискового ввода-вывода на производительность.

Может ли кто-нибудь объяснить теорию базы данных, почему Voltdb использует командный журнал и почему стандартные базы данных SQL, такие как Postgres, MySQL, SQLServer, Oracle, используют журнал записи на запись?

4b9b3361

Ответ 1

Я думаю, что лучше перефразировать:

Почему новый распределенный VoltDB использует журнал команд для журнала записи вперед?

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

Некоторая базовая терминология:

  • Состояние: сохраненная информация в данный момент времени
  • Команда: директива для хранилища изменить его состояние

Таким образом, ваша база данных может выглядеть следующим образом:

enter image description here

Следующий шаг - выполнить некоторую команду:

enter image description here

Обратите внимание на несколько важных аспектов:

  • Команда может влиять на многие сохраненные объекты, поэтому многие блоки станут грязными.
  • Следующее состояние - это функция текущего состояния и команды

Некоторые промежуточные состояния могут быть пропущены, потому что для этого достаточно иметь цепочку команд.

enter image description here

Наконец, вам необходимо гарантировать целостность данных.

  • Запись на запись вперед. Центральная концепция заключается в том, что изменения Состояние должны регистрироваться до любого тяжелого обновления в постоянном хранилище. Следуя нашей идее, мы можем регистрировать инкрементные изменения для каждого блока.
  • Журнал команд - центральная концепция заключается в том, чтобы регистрировать только Command, которая используется для создания состояния.

enter image description here

Существуют плюсы и минусы для обоих подходов. Журнал Write-Ahead содержит все измененные данные, командный журнал требует дополнительной обработки, но быстрый и легкий.

VoltDB: ведение журнала и восстановление команд

Ключом к ведению журнала команд является то, что он регистрирует вызовы, а не последствия, транзакций. Записывая только вызов, журналы команд сохраняются до минимума, ограничивая влияние дискового ввода-вывода на есть на производительность.

Дополнительные примечания

SQLite: запись в записи вперед

Традиционный журнал отката работает, написав копию исходный неизменный контент базы данных в отдельный журнал отката и затем записывать изменения непосредственно в файл базы данных.

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

PostgreSQL: запись на запись вперед (WAL)

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

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

Заключение

Ведение журнала команд:

  • быстрее
  • имеет более низкий размер
  • имеет более тяжелую процедуру "Повтор".
  • требуется частый снимок

Write Ahead Logging - это метод обеспечения атомарности. Лучшая производительность ведения журнала команд также должна улучшить обработку транзакций. Базы данных на 1 фут

enter image description here

Подтверждение

Блог VoltDB: введение в ведение журнала VoltDB

Одним из преимуществ ведения журнала команд по протоколу стиля ARIES является то, что транзакция может быть зарегистрирована до начала выполнения, а не выполнения транзакция и ожидание вывода данных журнала на диск. Другая Преимуществом является то, что пропускная способность ввода-вывода, необходимая для командного журнала, ограниченный сетью, используемой для передачи команд, и, в случае Gig-E, эта пропускная способность может быть удовлетворена дешевыми товарными дисками.

Важно помнить, что VoltDB распространяется по своей природе. Таким образом, транзакции немного сложны в управлении, и влияние производительности заметно.

Блог VoltDB: новая функция ведения журнала VoltDBs

Журнал команд в VoltDB состоит из хранимых процедур invocations и их параметров. Журнал создается на каждом node, и каждый журнал реплицируется, потому что вся работа реплицируется на несколько узлов. Эта приводит к реплицированному командному журналу, который можно обнулить при воспроизведении время. Поскольку транзакции VoltDB строго упорядочены, команда Журнал также содержит информацию о заказе. Таким образом, воспроизведение может произойти в том порядке, в котором выполнялись оригинальные транзакции, с полным транзакционная изоляция VoltDB. Поскольку сами вызовы часто меньше, чем измененные данные, и могут быть зарегистрированы до они привержены, этот подход оказывает очень скромное влияние на представление. Это означает, что пользователи VoltDB могут показатели стратосферы, с дополнительной долговечностью гарантии.

Ответ 2

Из описания Postgres 'write forward http://www.postgresql.org/docs/9.1/static/wal-intro.html и журнала команд VoltDB (на который вы ссылались), я не вижу большой разницы вообще. Кажется, это идентичная концепция с другим именем.

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

В разделе 10.4 VoltDB объясняется, что у их версии сообщества нет командного журнала, поэтому он не прошел бы тест ACID. Даже в корпоративной редакции я не вижу подробностей их изоляции транзакций (например, http://www.postgresql.org/docs/9.1/static/transaction-iso.html), чтобы мне было удобно, что VoltDB столь же серьезными, как и Postges.

Ответ 3

То, как я его читаю, выглядит следующим образом: (Мое собственное мнение)

Журнал команд, как описано здесь, регистрирует только транзакции по мере их возникновения, а не то, что происходит с ними или с ними. Итак, вот волшебная штука... Если вы хотите откат, вам нужно восстановить последний снимок, а затем вы можете воспроизвести все транзакции, которые были применены после этого (описано в ссылке выше). Таким образом, вы восстанавливаете резервную копию и повторно применяете все свои скрипты, только VoltDB теперь автоматизирует ее для вас.

Настоящая разница, которую я вижу в этом, заключается в том, что вы не можете откатиться к точке во времени логически, как в обычном журнале транзакций. Обычные журналы транзакций (MSSQL, MySQL и т.д.) Могут легко откат к моменту времени (в правильной настройке), поскольку транзакции могут быть "отменены".

Возникает вопросительный вопрос - ссылаясь на pos by pedz, всегда ли он проходит тест ACID даже с помощью Command Log? Будут делать еще немного чтения...

Добавить: больше читал, и я не думаю, что это хорошая идея для очень больших и загруженных транзакционных баз данных. Снимки DB автоматически создаются при заполнении журналов команд, чтобы сохранить вас из больших журналов транзакций и IO, используемых для этого? Вы будете получать большие суммы ввода-вывода, когда ваши снимки выполняются с регулярным интервалом, и вы также используете свою память на грани. Алос, на мой взгляд, вы теряете способность легко откатываться до момента времени до последнего автоматического моментального снимка - подумайте, что это будет очень сложно управлять.

Я скорее буду придерживаться журналов транзакций для транзакционных систем. Это доказано и работает.

Ответ 4

Это действительно вопрос детализации. Они регистрируют операции на уровне хранимых процедур, большинство журналов РСУБД на уровне отдельных операторов (и "ниже" ). Также их реклама о преимуществах - это небольшая красная селедка:

Одним из преимуществ ведения журнала команд по протоколу стиля ARIES является то, что транзакция может быть зарегистрирована до начала выполнения, а не выполнения транзакция и ожидание вывода данных журнала на диск.

Они должны ждать, пока команда будет занесена в журнал, ее просто намного меньше.

Если я не ошибаюсь, единица транзакции VoltDB является хранимой процедурой. Традиционная СУБД обычно должна поддерживать специальные транзакции, содержащие любое количество операторов, поэтому вопрос о регистрации на уровне процедур не может быть и речи. Кроме того, хранимые процедуры часто не являются действительно детерминированными в традиционной СУБД (то есть, если данные params + log + data всегда выдают тот же результат), которые они должны были бы для этого работать.

Тем не менее, улучшение производительности было бы существенным для этой ограниченной модели РСУБД.

Ответ 5

С WAL читатели читают со страниц из незапланированных журналов. В основной БД не производится никаких изменений. При ведении журнала команд у вас нет возможности читать из журнала команд.

Таким образом, ведение журнала команд значительно отличается. VoltDB использует ведение журнала команд для создания точек восстановления и уверенности в надежности, но он записывает в основное хранилище db (RAM) в реальном времени - со всеми проблемами сопутствующей блокировки и т.д.