Модуль записи данных на диск
(26.02.2021)
0. Введение
Для того чтобы справиться с такими особыми ситуациями, как отключение электроэнергии или сбой системы, механизм памяти периодически копирует данные в дисковую систему. Добавлен модуль записи данных на диск, который управляет операциями записи на диск всех блоков памяти механизма памяти, а также функциями создания, записи, удаления и восстановления файлов на диске.
На основе дизайна предыдущего модуля управления памятью каждый блок памяти механизма памяти будет соответствовать файлу на диске, что ускорит восстановление базы данных.
1. Структура данных
- Класс FlushManager отвечает за управление всем модулем записи данных на диск.
- Очередь записи на диск используется для поддержания структуры данных блоков памяти, которые необходимо записать на диск, и отвечает за упорядоченную организацию узлов записи на диск. Очередь записи на диск управляется FlushManager для выполнения упорядоченной обработки (например, обработка записи на диск, удаление обработки и т. д.).
- Узел записи на диск (node) сохраняет блок памяти, соответствующий файл на диске блока памяти и связанную с записью на диск информацию блока памяти (размер последнего записанного на диск блока памяти, смещение окончания последней записи на диск блока памяти, время последней записи на диск и т.д.).
2. Процесс выполнения
Логика записи блоков памяти на диск выполняется отдельным фоновым потоком для обработки, последовательно обрабатывая операции записи на диск блоков памяти. Фоновый поток записи на диск выполняет работу по записи данных каждые MEM_FLUSH_MAX_INTERVAL времени. Фоновый поток записи на диск постоянно опрашивает узлы очереди записи на диск до тех пор, пока все узлы не будут обработаны в этом процессе записи на диск. Опросный процесс выглядит следующим образом:
- Если в очереди нет узлов записи на диск, поток записи на диск находится в состоянии ожидания. Когда в очереди записи на диск нет узлов, фоновый поток засыпает на определённое время, ожидая появления новых блоков памяти.
- При появлении нового блока памяти новый узел записи на диск создаётся с использованием нового блока памяти и помещается в конец очереди (следующий узел, который нужно обработать).
- Определяется состояние блока памяти. Если состояние блока памяти является особым состоянием, то фоновый поток засыпает на некоторое время, ожидая, когда текущее состояние блока памяти станет нормальным или ожидая добавления новых узлов записи на диск в очередь.
- После успешного перестроения блока памяти старый блок памяти находится в состоянии удаления. Старый узел записи на диск должен быть удалён из очереди. FlushManager отвечает за освобождение блока памяти и удаление соответствующего файла на диске, а также добавление информации об удалении в manifest.
- Когда узел записи на диск в конце очереди находится в нормальном состоянии, будет выполнена операция записи на диск узла. Каждый раз поток получает последний узел, требующий обработки, из конца очереди, считывает информацию о последней записи на диск и сравнивает её с текущей информацией блока памяти, чтобы определить, требуется ли запись на диск данных блока памяти. Если нет, узел помещается в начало очереди. Если да, узел извлекается из конца очереди, информация о последней записи на диск считывается, определяется начальная точка записи на диск; открывается соответствующий файл на диске узла, данные блока памяти считываются последовательно с начальной точки записи на диск и добавляются в файл, после записи на диск файл узел помещается в начало очереди. Затем продолжается обработка последнего узла в очереди.
Файлы на диске выбираются в формате log-файла. Поскольку формат организации log-файлов прост и может поддерживать пакетное хранение данных и пакетное восстановление данных, использование log-файлов может значительно ускорить скорость восстановления базы данных.
3. Ведение manifest
- Файлы на диске блоков памяти используют формат SST для обеспечения совместимости с rocksdb. Файлы блоков памяти записываются на уровень L0 и не участвуют в уплотнении.
- Когда появляется новый блок памяти, создаётся новый файл SST, данные блока памяти записываются в файл SST, а информация файла SST записывается в файл manifest. Когда блок памяти снова выполняет операцию записи на диск, если есть новые данные, создаётся ещё один файл SST, новые данные блока памяти записываются в новый файл SST, и информация нового файла SST записывается в manifest.
- Когда блок памяти удаляется, все соответствующие файлы SST также удаляются, и информация об удалении записывается в manifest.
4. Восстановление данных
Функция восстановления данных реализуется через WAL-файл + SST-файл. Во время восстановления сначала создаётся соответствующий блок памяти в соответствии с файлом manifest, затем данные WAL и SST загружаются в блок памяти.
Конкретный процесс:
- Узел базы данных запускается, вызывая функцию Open() DB, создавая экземпляр memtable и экземпляр FlushManager.
- В соответствии с файлом manifest создаётся соответствующий блок памяти и выполняется восстановление WAL.
- После восстановления WAL, в соответствии со значением ключа WAL, предпочтительно восстанавливается соответствующий блок памяти, то есть предпочтительно считывается файл SST соответствующего блока памяти, и содержимое файла SST загружается в блок памяти.
- После завершения восстановления блока памяти WAL, если всё ещё существуют блоки памяти, соответствующие SST и требующие восстановления, восстановление продолжается в фоновом режиме.
- Завершение функции Open() БД.
Опубликовать ( 0 )