База данных с высокой пропускной способностью, эффективным произвольным доступом и запросами по вторичному индексу

У нас есть ~1 ТБ пользовательских профилей, и нам нужно выполнить над ними два типа операций:

  • случайное чтение и запись (~20 тыс. обновлений профиля в секунду)
  • запросы по заранее определенным измерениям (например, для отчетов)

Например, если мы сталкиваемся с пользователем в транзакции, мы хотим обновить его профиль с помощью URL-адреса, с которой он пришел. В конце дня мы хотим видеть всех пользователей, которые посетили определенный URL. Нам не нужны объединения, объединения и т. Д., А только фильтрация по одному или нескольким полям.

Мы не заботимся о задержке, но нам нужна высокая пропускная способность.


Большинство рассмотренных нами баз данных относятся к одной из двух категорий: БД с ключом-значением с быстрым произвольным доступом или пакетные БД, оптимизированные для запросов и аналитики.

Ключевые хранилища

Aerospike может хранить данные в терабайтовом масштабе и очень хорошо оптимизирован для быстрого поиска на основе ключей. Однако запросы к вторичному индексу являются чрезвычайно медленными, что делает его непригодным для наших целей.

MongoDB довольно гибок, но требует слишком много оборудования для обработки нашей нагрузки. Кроме того, мы столкнулись с особыми проблемами при массовом экспорте из него.

HBase выглядит привлекательно, так как у нас уже есть кластер Hadoop. Тем не менее, не совсем понятно, как создать вторичный индекс для него и какова будет его производительность.

Кассандра - может быть вариант, но у нас нет опыта с этим (если вы делаете, пожалуйста, поделитесь им)

Couchbase - может быть вариант, но у нас нет опыта с ним (если у вас есть, пожалуйста, поделитесь им)

Аналитические хранилища

Реляционные СУБД (например, Oracle, PostreSQL) обеспечивают как произвольный доступ, так и эффективные запросы, но у нас есть сомнения, что они могут обрабатывать терабайтные данные.

HDFS / Hive / SparkSQL - отлично подходит для пакетной обработки, но не поддерживает индексацию. Наиболее близким является разделение, но оно не применимо, учитывая отношения "многие ко многим" (например, многие пользователи посетили много URL-адресов). Кроме того, насколько нам известно, ни один из поддерживаемых HDFS инструментов, за исключением обновлений поддержки HBase, не позволяет добавлять только новые данные и читать последнюю версию, что не очень удобно.

Vertica имеет очень эффективные запросы, но обновления сводятся к переписыванию всего файла, поэтому они ужасно медленные.

(Из-за ограниченного опыта некоторая информация выше может быть субъективной или неправильной, пожалуйста, не стесняйтесь комментировать)


  1. Есть ли в какой-либо из упомянутых баз данных полезные опции, которые мы пропустили?
  2. Существуют ли какие-либо другие базы данных, оптимизированные для вашего варианта использования? Если нет, как бы вы решили эту задачу?

0 ответов

Другие вопросы по тегам