Вопрос: какое решение или какие советы вам придется иметь при работе с очень большой (многотерабайтной) базой данных, индексированной на сильных хэшах с высокой избыточностью?
Какое-то перевернутое хранилище?
Есть ли что-то, что можно сделать с Postgres?
При необходимости я готов откатить собственное хранилище.
(Подсказка: должен быть с открытым исходным кодом, без Java, должен работать в Linux, должен быть на диске, предпочтительно C / C ++ / Python)
Детали:
Мне нужно создать очень большую базу данных, в каждой записи которой есть:
- некоторые произвольные метаданные (некоторые текстовые поля), включая некоторый первичный ключ
- один хеш (128-битный хеш, сильный MD5-подобный)
Объем записей - это то, что я бы назвал довольно большим: от 10 до 100 миллиардов). Существует значительная избыточность хэшей по строкам (более 40% записей имеют общий хэш как минимум с другой записью, некоторые хэши существуют в записях 100K)
Основное использование - поиск по хешу, а затем получение метаданных. Вторичное использование - поиск по первичному ключу, а затем получение метаданных.
Это база данных аналитического типа, поэтому общая нагрузка средняя, в основном чтение, мало записей, в основном пакетные записи.
Текущий подход заключается в использовании Postgres с индексом по первичному ключу и индексом по хеш-столбцу. Таблица загружается пакетно с выключенным индексом по хешу.
Все индексы - это деревья. Индекс в столбце хеширования становится огромным, до размеров самой таблицы. Для таблицы размером 120 ГБ на воссоздание индекса уходит около суток. Однако производительность запросов неплохая.
Проблема в том, что прогнозируемый размер целевой базы данных будет более 4 ТБ на основе тестов с меньшим набором данных в 400 ГБ, что составляет около 10% от общего целевого объема. После загрузки в Postgres более 50% хранилища, к сожалению, используется индексом SQL в столбце хэша.
Это слишком велико. И я считаю, что избыточность хешей - это возможность хранить меньше.
Также обратите внимание, что, хотя это описывает проблему, необходимо создать несколько таких таблиц.