Это больше вопрос о том, какой тип решения NOSQL более подходит для решения этой проблемы.
Проблема
Бэкэнд-система Java создает "обновления" для "параметров" с частотой около 1000 / сек. Параметр в основном представляет собой объект со значением, типом, именем, описанием и множеством другой информации, связанной с его определением, допустимостью, проверками, временными метками обновления и т. Д. Обновление представлено в виде Java Pojo ( ~ 450 байт) и содержит около 40 полей.
Необходимо сохранить все эти обновления (1000 / сек) в течение следующих 10 лет. Как видите, у вас останется около 35 миллиардов обновлений для хранения.
Важно знать, что каждое обновление имеет только небольшой набор полей, которые меняются:
- обычно есть поля, которые меняются каждый раз (см. Значение и время),
- другие, которые редко изменяются (например, тип, проверка достоверности),
- другие, которые в основном никогда не меняются (например, имя, описание, UUID и т. Д.)
Хранить все эти обновления в hbase как независимые строки невозможно, потому что я в конечном итоге буду хранить петабайты данных со временем и не могу себе этого позволить. Я также считаю, что невозможно будет оперативно получить эти данные.
Другим важным моментом является то, что мне нужно поддерживать очень сложные поисковые запросы, часто со сложными фильтрами. Некоторые примеры этих запросов приведены в качестве примера ниже:
- получение последнего дня обновления набора выбранных 1000
Параметры
- получить последнее значение заданного набора выбранного параметра. Последнее значение иногда можно найти всего несколько лет назад в истории (так называемые редкие параметры)
- извлечение единственного набора параметров на основе подстановочного знака имени и более сложной фильтрации
Вопрос
Правильнее ли использовать решение с широкими столбцами, например, HBase, или лучше использовать решения на основе документов, такие как MongoDB?
Мой приоритет состоит в том, чтобы хранить хранилище в терабайтовых порядках (скажем, ниже 100-200 тера за все время) и иметь отзывчивость запросов в течение нескольких секунд (обычно 2-3).
Я знаю, что это очень широкий вопрос, но он помог бы мне увидеть точку зрения кого-то наверняка более опытного, чем я!
Большое спасибо заранее