Лучший подход NoSQL для обработки более 100 миллионов записей - PullRequest
5 голосов
/ 23 июня 2011

Я работаю над проектом, в котором мы выполняем пакетную загрузку и храним огромный объем данных в базе данных Oracle, которая постоянно запрашивается через Hibernate для этой таблицы с более чем 100 миллионами записей (чтения выполняются гораздо чаще, чем записи).Чтобы ускорить процесс, мы используем Lucene для некоторых запросов (особенно запросов гео-границ) и кэш второго уровня Hibernate, но этого все еще недостаточно.У нас все еще есть узкое место в запросах Hibernate к Oracle (из-за нехватки памяти мы не кэшируем более 100 миллионов табличных объектов в кэше второго уровня Hibernate).

Какие дополнительные решения NoSQL (кроме Lucene) я могу использовать в этой ситуации?

Вот некоторые варианты, о которых я думаю:

  1. Использование распределенного ehcache (Terracotta) для второго уровня Hibernate, чтобы использовать больше памяти на разных машинах и уменьшить количество дублирующихся кэшей (прямо сейчас каждыйВМ имеет свой кеш).

  2. Для полного использования в памяти базы данных SQL, такой как H2, но, к сожалению, эти решения требуют загрузки более 100 миллионов таблиц в одну виртуальную машину.

  3. Используйте Lucene для запросов и BigTable (или распределенную хэш-карту) для поиска сущностей по id.Какая реализация BigTable подойдет для этого?Я рассматривал HBase.

  4. Используйте MongoDB для хранения данных, а также для запросов и поиска по идентификатору.

Ответы [ 6 ]

6 голосов
/ 23 июня 2011

Рекомендую Cassandra с ElasticSearch для масштабируемой системы (100 миллионов для них - ничто). Используйте cassandra для всех ваших данных и ES для специальных и гео-запросов. Тогда вы можете убить весь свой стек. Для синхронизации данных между Cass вам может понадобиться система MQ, например rabbitmq. и ES.

3 голосов
/ 04 июля 2011

Это действительно зависит от ваших наборов данных.Правило номер один для разработки NoSQL - сначала определить сценарии запросов.Как только вы по-настоящему поймете, как вы хотите запрашивать данные, вы можете посмотреть на различные решения NoSQL.Единицей распределения по умолчанию является ключ.Поэтому вы должны помнить, что вы должны иметь возможность эффективно разделять ваши данные между вашими узловыми машинами, в противном случае вы получите горизонтально масштабируемую систему со всей работой, выполняемой на одном узле (хотя и лучшие запросы в зависимости от случая).

Вам также необходимо вспомнить теорему CAP: большинство баз данных NoSQL в конечном итоге становятся согласованными (CP или AP), в то время как традиционными реляционными СУБД являются CA.Это повлияет на то, как вы обрабатываете данные и создаете определенные вещи, например, генерация ключей может оказаться хитрой.

Также помните, что в некоторых системах, таких как HBase, нет концепции индексирования.Все ваши индексы должны быть построены с помощью логики вашего приложения, и любые обновления и удаления должны будут управляться как таковые.С Mongo вы можете создавать индексы на полях и запрашивать их относительно быстро, также есть возможность интегрировать Solr с Mongo.Вам не нужно просто выполнять запрос по идентификатору в Mongo, как в HBase, который является семейством столбцов (он же база данных в стиле Google BigTable), где у вас есть вложенные пары ключ-значение.

Итак, снова речь идет о ваших данных, о том, что вы хотите сохранить, как вы планируете их хранить и, что наиболее важно, как вы хотите получить к ним доступ.Проект Lily выглядит очень многообещающе.В работе, с которой я работаю, мы берем большое количество данных из Интернета и храним их, анализируем, анализируем, анализируем, анализируем, транслируем, обновляем и т. Д. И т. Д. Мы не просто используем одну систему, а многокоторые лучше всего подходят для работы под рукой.Для этого процесса мы используем разные системы на разных этапах, поскольку он дает нам быстрый доступ туда, где он нам нужен, предоставляет возможность потоковой передачи и анализа данных в режиме реального времени и, что важно, отслеживает все по ходу работы (как потеря данных в продуктовой среде).система это большое дело).Я использую Hadoop, HBase, Hive, MongoDB, Solr, MySQL и даже старые добрые текстовые файлы.Помните, что производить систему с использованием этих технологий немного сложнее, чем устанавливать Oracle на сервер, некоторые выпуски не так стабильны, и вам действительно нужно сначала провести тестирование.В конце концов, это действительно зависит от уровня сопротивления бизнеса и критического характера вашей системы.

Еще один путь, который до сих пор никто не упомянул, - это NewSQL, то есть горизонтально масштабируемые СУБД ... Есть несколько таких, как кластер MySQL (я думаю) и VoltDB, которые могут подойти вам.

Опять же, речь идет о понимании ваших данных и моделей доступа. Системы NoSQL также не являются относительными, то есть нереляционными и лучше подходят для нереляционных наборов данных.Если ваши данные по своей природе являются реляционными, и вам нужны некоторые функции SQL-запросов, которые действительно должны выполнять такие вещи, как декартовы продукты (также называемые объединениями), тогда вам лучше придерживаться Oracle и тратить некоторое время на индексацию, сегментирование и настройку производительности.

Мой совет - поэкспериментировать с несколькими разными системами.Посмотрите;

MongoDB - Документ - CP

CouchDB - Документ - AP

Redis - Значение ключа в памяти (не для семейства столбцов) - CP

Cassandra - Семейство столбцов - Доступно и допустимое разбиение (AP)

HBase - Семейство столбцов - Согласованный и устойчивый к разделам (CP)

Hadoop / Hive

VoltDB - Действительно красивый продукт, база данных отношений, котораяраспространяется и может работать для вашего случая (может быть легче двигаться).Похоже, что они также предоставляют корпоративную поддержку, которая может больше подходить для продвинутой среды (т. Е. Дать бизнес-пользователям чувство безопасности).

В любом случае, это мой 2с.Игра с системами - действительно единственный способ узнать, что действительно работает для вашего случая.

1 голос
/ 24 июня 2011

Вам также следует проверить проект Lily (lilyproject.org).Они интегрировали HBase с Solr.Внутренне они используют очереди сообщений для синхронизации Solr с HBase.Это позволяет им иметь скорость индексации (шифрования и репликации), поддерживаемую высоконадежной системой хранения данных.

1 голос
/ 24 июня 2011

Как вы предполагаете, MongoDB (или любое подобное решение NoSQL для персистентности) подходит вам.Мы запустили тесты со значительно большими наборами данных, чем тот, который вы предлагаете на MongoDB, и он отлично работает.Особенно, если вы читаете тяжелые шарды MongoDB и / или распределение чтений по членам набора репликации позволит вам значительно ускорить ваши запросы.Если ваш сценарий использования позволяет правильно сбалансировать ваши индексы, ваша цель - приблизиться к 20 мс запросам, должна стать достижимой без дальнейшего кэширования.

0 голосов
/ 24 июня 2011

При 100M записях ваше узкое место скорее всего Hibernate, а не Oracle. У наших клиентов обычно есть миллиарды записей в отдельных таблицах фактов нашего хранилища данных на базе Oracle, и оно прекрасно с ними справляется.

Какие запросы вы выполняете на своей таблице?

0 голосов
/ 23 июня 2011

вы можете группировать запросы и разбивать их по определенному набору данных и иметь один (или группу серверов) процесс, в котором вы можете располагать данными, доступными в кеше, для повышения производительности.

например,

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

длячтобы это работало, вам нужен балансировщик нагрузки (который балансирует нагрузку по бизнес-сценарию).

не уверен, сколько из этого может быть реализовано здесь.

...