Надежность базы данных и производительность - PullRequest
2 голосов
/ 26 марта 2011

Я много изучал, как достигается долговечность в базах данных, и если я хорошо понимаю, это работает так (упрощенно):

Точка зрения Клента:

  1. начать транзакцию.
  2. вставить в таблицу значения ...
  3. совершить транзакцию

Точка зрения двигателя БД:

  1. записать индикатор начала транзакции в файл журнала
  2. записать изменения, сделанные клиентом, в файл журнала
  3. записать индикатор фиксации транзакции в файл журнала
  4. сброс файла журнала на жесткий диск (это обеспечивает долговечность данных)
  5. вернуть 'OK' клиенту

Что я заметил:

Клиентское приложение является однопоточным приложением (одно соединение с БД). Я могу выполнить 400 транзакций в секунду, в то время как простые тесты, которые записывают что-то в файл и затем синхронизируют этот файл с жестким диском, выполняют только 150 синхронизаций в секунду. Если бы клиент был многопоточным / многопоточным соединением, я бы предположил, что механизм БД группирует транзакции и выполняет один fsync на несколько транзакций, но это не так.

Мой вопрос заключается в том, действительно ли, например, MsSQL, действительно синхронизирует файл журнала (fsync, FlushFileBuffers и т. Д.) При каждой фиксации транзакции, или это какая-то другая магия позади?

1 Ответ

0 голосов
/ 26 марта 2011

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

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

Он видит, как конкретный dbms с открытым исходным кодом записывает в стабильное хранилище, вам нужно прочитать исходный код.Исходный код PostgreSQL онлайн .(Файл xlog.c). Не знаю об источнике MySQL.

...