База данных с высокой пропускной способностью, эффективным произвольным доступом и запросами по вторичному индексу
У нас есть ~1 ТБ пользовательских профилей, и нам нужно выполнить над ними два типа операций:
- случайное чтение и запись (~20 тыс. обновлений профиля в секунду)
- запросы по заранее определенным измерениям (например, для отчетов)
Например, если мы сталкиваемся с пользователем в транзакции, мы хотим обновить его профиль с помощью URL-адреса, с которой он пришел. В конце дня мы хотим видеть всех пользователей, которые посетили определенный URL. Нам не нужны объединения, объединения и т. Д., А только фильтрация по одному или нескольким полям.
Мы не заботимся о задержке, но нам нужна высокая пропускная способность.
Большинство рассмотренных нами баз данных относятся к одной из двух категорий: БД с ключом-значением с быстрым произвольным доступом или пакетные БД, оптимизированные для запросов и аналитики.
Ключевые хранилища
Aerospike может хранить данные в терабайтовом масштабе и очень хорошо оптимизирован для быстрого поиска на основе ключей. Однако запросы к вторичному индексу являются чрезвычайно медленными, что делает его непригодным для наших целей.
MongoDB довольно гибок, но требует слишком много оборудования для обработки нашей нагрузки. Кроме того, мы столкнулись с особыми проблемами при массовом экспорте из него.
HBase выглядит привлекательно, так как у нас уже есть кластер Hadoop. Тем не менее, не совсем понятно, как создать вторичный индекс для него и какова будет его производительность.
Кассандра - может быть вариант, но у нас нет опыта с этим (если вы делаете, пожалуйста, поделитесь им)
Couchbase - может быть вариант, но у нас нет опыта с ним (если у вас есть, пожалуйста, поделитесь им)
Аналитические хранилища
Реляционные СУБД (например, Oracle, PostreSQL) обеспечивают как произвольный доступ, так и эффективные запросы, но у нас есть сомнения, что они могут обрабатывать терабайтные данные.
HDFS / Hive / SparkSQL - отлично подходит для пакетной обработки, но не поддерживает индексацию. Наиболее близким является разделение, но оно не применимо, учитывая отношения "многие ко многим" (например, многие пользователи посетили много URL-адресов). Кроме того, насколько нам известно, ни один из поддерживаемых HDFS инструментов, за исключением обновлений поддержки HBase, не позволяет добавлять только новые данные и читать последнюю версию, что не очень удобно.
Vertica имеет очень эффективные запросы, но обновления сводятся к переписыванию всего файла, поэтому они ужасно медленные.
(Из-за ограниченного опыта некоторая информация выше может быть субъективной или неправильной, пожалуйста, не стесняйтесь комментировать)
- Есть ли в какой-либо из упомянутых баз данных полезные опции, которые мы пропустили?
- Существуют ли какие-либо другие базы данных, оптимизированные для вашего варианта использования? Если нет, как бы вы решили эту задачу?