Какую СУБД выбрать для большого объема документов?
Хочу посоветоваться по такому вопросу.
Создаю свою систему для анализа большого объема информации и задаюсь вопросом её хранения.
Итого:
- Есть реляционная БД с характеристиками документа (дата, номер, орган, подписант и т.д.). Десятки миллионов строк, 9 Гб в MS SQL Server при максимальном сжатии.
- Есть данные для обработки - тексты документов. Совершенно неструктурированные, связи с другими сущностями в тексте бывают, но построить из них реляционную модель очень сложно да и не факт что потребуется вообще. Объем - около 2 Тб.
- Обработка текста происходит в ElasticSearch, отчего есть соблазн хранить тексты только там.
- Основное назначение БД - поиск по характеристикам документа и содержимому текста и последующая обработка этого текста. Создание данных происходит редко и производится вручную через запрос. Модификация происходит редко и в основном во время разработки. Удаляться данные не будут вообще.
Варианты, которые я вижу:
1) Записать все в обычную реляционную БД (сейчас это MS SQL Server). Но смущает скорость работы такого монстра + данные из него все равно качать в ElasticSearch.
2) Оставить структуру как есть, а тексты с привязкой к id документа хранить в NoSQL БД (например, MongoDB). Но смущает необходимость в этом звене.
3) Оставить структуру как есть, а тексты с привязкой к id документа хранить прямо в ElasticSearch. Вроде бы идеальный вариант, но читал что ElasticSearch не самый надежный и подходящий инструмент для использования в качестве БД. А выкачивать потом 2Тб из бекапов желания никакого нет.
4) Психануть, денормализовать данные (благо, там нет ничего очень сложного) и хранить и характеристики и текст документа в ElasticSearch.
Ну, смотрите - в чем проблема с ES в качестве primary database: он может периодически терять апдейты, плохо ведет себя со split-brain, нет ACID, бывает реплики ведут себя неразумно и т.д. ( какие-то баги фиксятся, какие-то добавляются)
Однако, возвращаясь к вашей задаче - у вас всего 2 терабайта данных и почти нет записи, только чтение. И, думается мне, у вас там не 40 машин в кластере, верно?:). То есть сценарий типа: "Мастер вырубился при сплит-брейне, 2 слейва провозгласили себя мастерами, пока чинили на них позаписывали по 5 терабайт противоречивой информации, мы все про***ли, где бэкапы" вам на самом деле не грозит.
Так что почему бы не хранить эти несчастные 2Тб в эластике + бэкап/снэпшот плюс еще где-нибудь для надежности против нашествия инопланетян ( у вас все равно данные почти иммутабельные).