Что происходит, когда rocksdb не может сбросить memtable в файл sst? - PullRequest
0 голосов
/ 10 февраля 2019

Нашему сервису (который использует rockdb) не хватало места на диске примерно на 30 минут.Мы вручную удалили некоторые файлы, которые высвободили 650MiB.Тем не менее, даже с этими свободными 650 МБ, rockdb продолжал жаловаться:

Ошибка ввода-вывода: Не удалось записать для: /path/to/database/454250.sst: На диске недостаточно места.

Возможно ли, что memtable стал настолько большим, что ему потребовалось более 650 МБ дискового пространства?Глядя на другие файлы sst в папке базы данных, они занимают не более ~ 40 МБ.

Если нет, то какие еще причины могут быть для этих сообщений об ошибках?

1 Ответ

0 голосов
/ 12 февраля 2019

Это может произойти в двух случаях:

1) Rocksdb сохраняет данные в памяти через файлы WAL и удаляется при сбросе памяти.Если у вас есть несколько семейств столбцов, где некоторые из них имеют более высокую скорость вставки (заполняемая память быстрее), а другие имеют более низкую скорость, .log files (файлы WALDSD-файлов) не могут быть удалены.Это связано с тем, что файлы wal содержат транзакции из всех семейств столбцов и не могут быть удалены до тех пор, пока все семейства столбцов не будут сохранены с помощью сброса.Это может привести к застойным файлам .log, что приведет к проблемам с дисковым пространством.

2) Предположим, что размер записываемого файла настроен на 1 ГБ, а количество записываемых файлов для слияния равно 3, вы фактически ждете 3 заполняемых памятных стола.и тогда срабатывает сброс.Даже если вы настроили целевой размер файла (так как вы упомянули, что ваши SST-файлы составляют около 40 МБ) на 50 МБ, вы сгенерируете 185 SST-файлов каждый размером 50 МБ общим объемом 3 ГБ.Но у вас есть место около 650 МБ, что может быть проблемой.

Существуют различные параметры, которые влияют на поведение сброса в rocksdb.Вы можете взглянуть на,

write_buffer_size - Размер каждой записываемой таблицы.

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

target_file_size_base - размер результирующих SST из-за сжатия или сброса.

target_file_size_multiplier - определяет размер SST на каждом уровне.

Вы также можете взглянуть на методы сжатия SST.Дайте мне знать, если это поможет.

...