Уплотнение RocksDB: как уменьшить размер данных и использовать более 1 ядра ЦП? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь использовать RocksDB для хранения миллиардов записей, поэтому результирующие базы данных довольно большие - сотни гигабайт, в некоторых случаях несколько терабайт. Данные первоначально импортируются из другого моментального снимка службы и впоследствии обновляются из Kafka, но это не относится к делу.

Есть две части проблемы:

Часть 1) Первоначальный импорт данных занимает часы с отключенными автокомпенсациями (если я их включаю), то после этого я заново открываю базу данных с включенными автокомпенсациями, но они не запускаются автоматически при открытии БД, поэтому я должен сделать это с CompactRange (Диапазон {ноль, ноль}) в Go вручную. Ручное сжатие занимает почти такое же время, когда занято только одно ядро ​​ЦП, и во время сжатия общий размер БД увеличивается в 2–3 раза, но затем заканчивается примерно в 0,5x

Вопрос 1 : Есть ли способ избежать увеличения размера данных в 2x-3x при сжатии? Это становится проблемой, когда размер данных достигает терабайтов. Я использую уровень сжатия по умолчанию, который, согласно документам, «оптимизирует использование дискового пространства в зависимости от размера логической базы данных (увеличение пространства) путем минимизации количества файлов, участвующих в каждом этапе сжатия».

Вопрос 2 : Возможно ли задействовать больше ядер процессора для ручного уплотнения? Похоже, что используется только один atm (хотя MaxBackgroundCompactions = 32). Это ускорит процесс ОЧЕНЬ много, поскольку во время первоначального ручного уплотнения нет записей, мне просто нужно подготовить БД без ожидания дней. Будет ли работать несколько подпрограмм, работающих с разными наборами ключей, вместо одной подпрограммы, работающей со всеми ключами? Если да, каков наилучший способ разделить ключи на эти наборы?

Часть 2) Даже после этого ручного сжатия RocksDB, по-видимому, выполнит автокомпенсацию позже, после того, как я начну добавлять / обновлять данных, и после того, как это сделано, размер БД становится еще меньше - примерно в 0,4 раза по сравнению с размером до ручного уплотнения.

Вопрос 3 : в чем разница между ручным и автоматическим сжатием и почему автоматическое сжатие кажется более эффективным с точки зрения размера получаемых данных?

Мой проект находится на Go, но я более или менее знаком с кодом RocksDB C ++ и не смог найти ответы на эти вопросы в документы или в исходном коде.

...