Двойной буфер записи, вы никогда не слышали об этом?

задняя часть база данных MySQL

MySQL использует механизм буфера, чтобы избежать дискового ввода-вывода для каждого чтения и записи и повысить эффективность:

Размер одной страницы в буфере MySQL составляет 16 КБ, а размер одной страницы в файловой системе — 4 КБ, то есть MySQL сбрасывает одну страницу данных из буфера на диск, а в файл нужно записать 4 страницы. система.

Как показано на рисунке выше, страница со page=1 в MySQL физически соответствует четырем сеткам 1+2+3+4 на диске.

Итак, возникает вопрос,Эта операция не является атомарной. Будет ли проблема, если питание отключится на полпути выполнения?
Да, это называется "повреждение данных страницы".

Как показано на рисунке выше, страница со страницей = 1 в MySQL готова к сбросу на диск, а в файловой системе сброшено только 3 страницы, при отключении питания появится надпись: После перезагрузки , диску физически соответствует страница со page=1 1+2+3+4 четыре сетки, целостность данных нарушена.

_Голос за кадром: _Redo не может исправить такие исключения "повреждение данных страницы". Предпосылкой восстановления является "данные страницы верны" и журнал повторов в норме.

Как решить такую ​​проблему «порчи данных страницы»?

Легко придумать способ иметь «копию» для восстановления исходной страницы, и место, где хранится «копия», — это буфер двойной записи.

Двойной буфер записи, но он отличается от традиционного буфера, он разделен наОЗУа такжедискдвухуровневая архитектура.

_Озвучка:__Традиционный буфер, в основном память;_А данные в DWB нужно высадить.

Как показано на рисунке выше, когда необходимо обновить данные страницы:

первый шаг: Memcopy данные страницы сначала в память DWB;

второй шаг: В памяти DWB сначала прошивается на диск DWB;

третий шаг: в память DWB, а затем прошить на диск с данными;

_Голос за кадром: _DWB состоит из 128 страниц, а емкость всего 2M.

Шаги 2 и 3 требуют записи на диск 2 раза, что является источником «двойной записи».

Почему DWB может решить проблему «порчи данных страницы»?

Если предположить, что питание отключено на шаге 2, полные данные 1+2+3+4 все еще находятся на диске.

_Голос за кадром: _Пока данные страницы заполнены, данные можно восстановить с помощью повтора.

Если питание отключается на шаге 3, полные данные сохраняются в DWB.

Следовательно, не должно быть проблемы «порчи данных страницы».

_Голос за кадром: _Я написал это дважды, и всегда есть место, где данные в порядке.

Я сам пытался десятки раз, но я все еще не могу воспроизвести «повреждение данных страницы».Когда я обнаружил «повреждение данных страницы» в Интернете, процесс перезапуска MySQL использует DWB для восстановления данных страницы.

Как видите, при запуске:

(1) InnoDB в последний раз обнаружил аварийное завершение работы;

(2) Попытка восстановить данные ibd не удалась;

(3) Восстановление недописанных страниц из DWB;

Целостность данных страницы может быть гарантирована с помощью DWB, но, в конце концов, DWB долженПриведет ли двойная запись на диск к резкому падению производительности базы данных?

Анализ трех шагов, выполняемых DWB:

(1) Первым шагом является копирование данных страницы в память DWB, что очень быстро;

(2) На втором этапе fsync памяти DWB сбрасывается на диск DWB, что представляет собой последовательную запись с добавлением, и скорость также очень высока;

(3) Третий шаг, чистка диска и случайная запись, уже необходим и не является дополнительной операцией;

Кроме того, 128 страниц (16 КБ на страницу) 2M DWB будут сброшены на диск дважды, максимум 64 страницы каждый раз, то есть 1M данных, и выполнение также очень быстрое.

Подводя итог, производительность будет затронута, но влияние невелико.

Голос за кадром:

(1) Причина, по которой упреждающая запись имеет высокую производительность, заключается в последовательном добавлении;

(2) Существует сторонняя оценка, которая оценивает потерю производительности примерно в 10%;

В частности, в InnoDB есть две переменные, которые могут просматривать ситуацию, связанную с двойным буфером записи:

Innodb_dblwr_pages_written

Записывает количество страниц, записанных в DWB.

Innodb_dblwr_writes

Записывает количество операций записи DWB.

в состоянии пройти:

show global status like "%dblwr%"

чтобы узнать.

конец

MySQL имеет сильнуюмеханизм защиты данных:

(1) В случае ненормального сбоя, если нет «порчи данных страницы», данные можно восстановить с помощью повтора;

(2) Когда происходит «повреждение данных страницы», данные страницы могут быть восстановлены через буфер двойной записи;

double write buffer:

(1) Это не буфер памяти, а двухуровневая структура памяти/диска, которая является важной частью архитектуры On-Disk в InnoDB;

(2) Это механизм обеспечения целостности страниц за счет двойной записи;

Знай это, знай почему.

Идеи важнее выводов, я надеюсь, что у каждого есть что-то получить.

Путь архитектора- Делитесь техническими идеями

Статьи по Теме:

"буферный пул

"буфер записи (буфер изменения)

"буфер журнала