Для одного из моих проектов мне нужно ввести большую часть событий в базу данных для последующей обработки, и я пытаюсь решить, какая СУБД будет лучше для моей цели.
У меня есть:
-
Около 400 000 000 дискретных событий на данный момент
-
Около 600 ГБ данных, которые будут сохранены в БД
Эти события бывают разных форматов, но я считаю, что количество индивидуальных атрибутов составляет около 5000. Большинство событий содержат только значения около 100 атрибутов. Значения атрибутов должны рассматриваться как произвольные строки, а в некоторых случаях - целые числа.
События в конечном итоге будут объединены в один временной ряд. Хотя у них есть какая-то внутренняя структура, нет ссылок на другие события, которые, я считаю, означает, что мне не нужна объектная БД или какая-то система ORM.
Мои требования:
-
Лицензия с открытым исходным кодом - мне, возможно, придется немного подкорректировать ее.
-
Масштабируемость благодаря возможности расширения до нескольких серверов, хотя сначала будет использоваться только одна система.
-
Быстрые запросы - обновления не так критичны.
-
Зрелые драйверы/привязки для C/С++, Java и Python. Предпочтительно с лицензией, которая хорошо сочетается с другими людьми - я бы предпочел не брать на себя что-либо из-за технического решения. Я думаю, что у большинства драйверов DB нет проблем, но в любом случае это нужно упомянуть.
-
Доступность для Linux.
-
Было бы неплохо, но не обязательно, если бы он был доступен для Windows
Моя идеальная БД для этого позволит мне получить все события за определенный период времени с помощью одного запроса.
То, что я нашел/рассмотрел до сих пор:
-
Postgresql с увеличенным размером страницы, по-видимому, может иметь до 6 000 столбцов в каждой таблице. Если моя оценка количества атрибутов не выключена, это может сделать.
-
MySQL, кажется, имеет ограничение 4000 столбцов на таблицу. Я мог бы использовать несколько таблиц с немного SQL-fu, но я бы предпочел не.
-
MongoDB - это то, к чему я сейчас склоняюсь. Это позволило бы мне сохранить внутреннюю структуру событий, все еще будучи в состоянии запросить их. Его API также кажется довольно прямым. Я понятия не имею, насколько хорошо он работает по производительности - хотя бы на одном сервере.
-
OpenTSDB и его структура метрической коллекции звучит интересно. Я мог бы использовать один временной ряд для каждого атрибута (что могло бы помочь с некоторыми из моей обработки), имеют значение атрибута в качестве тега и дополнительно помещают записи, чтобы связать их с определенным событием. Вероятно, он имеет более крутую кривую подготовки, которую три выше, как с точки зрения администратора, так и с точки зрения прикладного программиста. Не знаю о его производительности.
-
Используйте HBase напрямую. Это может соответствовать моим требованиям лучше, чем OpenTSDB, хотя, судя по моему прошлому опыту с hadoop, административные накладные расходы, вероятно, все же выше, чем первые три варианта.
Возможно, есть и другие базы данных, которые могут это сделать, поэтому не стесняйтесь сообщать мне - я был бы признателен за любые предложения или комментарии, которые могут помочь мне в этом.
PS: У меня только минимальный опыт работы в качестве администратора БД, поэтому я приношу свои извинения за любые заблуждения.