Когда использовать Cassandra vs. Solr в DSE?

Я использую DSE для интеграции Cassandra / Solr, чтобы данные хранились в Cassandra и индексировались в Solr. Вполне естественно использовать Cassandra для обработки операций CRUD и использовать Solr для полнотекстового поиска соответственно, а DSE действительно может упростить синхронизацию данных между Cassandra и Solr.

Однако, когда дело доходит до запроса, на самом деле есть два пути: вторичный / настраиваемый вручную индекс Cassandra и Solr. Я хочу знать, когда использовать какой метод и какова разница в производительности в целом, особенно при настройке DSE.

Вот один пример использования в моем проекте. У меня есть таблица Cassandra, в которой хранятся некоторые данные объекта. Помимо базовой операции CRUD, мне также нужно получить элементы по равенству в каком-то поле (например, категории), а затем отсортировать их в каком-то порядке (в моем случае здесь - поле like_count).

Я могу придумать три разных способа справиться с этим:

  1. Объявите indexed = true в схеме Solr для поля category и like_count и запроса в Solr
  2. Создайте денормализованную таблицу в Cassandra с первичным ключом (category, like_count, id)
  3. Создайте денормализованную таблицу в Cassandra с первичным ключом (категория, порядок, идентификатор) и используйте внешний компонент, такой как Spark / Storm ,, чтобы отсортировать элементы по like_count

Первый метод кажется наиболее простым в реализации и обслуживании. Я просто пишу тривиальный код доступа к Solr, а остальная тяжелая работа выполняется поиском Solr / DSE.

Второй метод требует ручной денормализации при создании и обновлении. Мне также нужно вести отдельную таблицу. Также существует проблема с надгробиями, так как like_count может часто обновляться. Хорошо то, что чтение может быть быстрее (если нет лишних надгробий).

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

Как вы думаете, какой метод лучше всего? Какая разница в производительности?


person Ziju Feng    schedule 17.09.2014    source источник


Ответы (1)


Вторичные индексы Cassandra имеют ограниченные варианты использования:

  1. Проиндексировано не более пары столбцов.
  2. Только один индексированный столбец в запросе.
  3. Слишком большой межузловой трафик для данных высокой мощности (относительно уникальные значения столбцов)
  4. Слишком большой межузловой трафик для данных с низкой мощностью (соответствует высокий процент строк)
  5. Запросы должны быть известны заранее, чтобы модель данных могла быть оптимизирована вокруг них.

Из-за этих ограничений приложения часто создают «индексные таблицы», которые индексируются по любому желаемому столбцу. Для этого необходимо либо дублировать данные из основной таблицы в каждую таблицу индексов, либо потребуется дополнительный запрос для чтения таблицы индексов, а затем чтения фактической строки из основной таблицы после чтения основного ключа из таблицы индексов. Запросы по нескольким столбцам придется заранее проиндексировать вручную, что сделает специальные запросы проблематичными. И любое дублирование должно быть вручную обновлено приложением в каждой индексной таблице.

В остальном ... они будут работать нормально в тех случаях, когда "скромное" количество строк будет выбрано из небольшого числа узлов, а запросы хорошо определены заранее, а не для случая.

DSE / Solr лучше всего подходит для:

  1. Проиндексировано умеренное количество столбцов.
  2. Сложные запросы с указанным количеством столбцов / полей - Lucene параллельно сопоставляет все указанные поля в запросе. Lucene индексирует данные на каждом узле, поэтому узлы запрашивают параллельно.
  3. Специальные запросы в целом, когда точные запросы не известны заранее.
  4. Запросы с форматированным текстом, такие как поиск по ключевым словам, подстановочные знаки, нечеткие / похожие, диапазон, неравенство.

Использование индексации Solr связано с затратами на производительность и емкость, поэтому рекомендуется проверить реализацию концепции, чтобы оценить, сколько дополнительной оперативной памяти, хранилища и узлов необходимо, что зависит от того, сколько столбцов вы индексируете, объема проиндексированного текста и любая сложность фильтрации текста (например, n-граммов нужно больше). Она может варьироваться от 25% увеличения для относительно небольшого числа проиндексированных столбцов до 100%, если все столбцы проиндексированы. Кроме того, вам необходимо иметь достаточное количество узлов, чтобы индекс Solr для каждого узла поместился в ОЗУ или в основном в ОЗУ при использовании SSD. А виртуальные узлы в настоящее время не рекомендуются для центров обработки данных Solr.

person Jack Krupansky    schedule 17.09.2014
comment
+1 Замечательный ответ. И я полностью согласен с ограниченными вариантами использования вторичных индексов. Вероятно, самый непонятный инструмент в Cassandra прямо сейчас. - person Aaron; 17.09.2014
comment
+1 Я не мог бы сказать лучше. Я недавно столкнулся с этой дилеммой и обнаружил, что использую Solr для ВСЕХ операций чтения, потому что Cassandra не может фильтровать более одного столбца на запрос (в основном, потому что вторичные индексы Cassandra могут быть объявлены только для одного столбца за раз, т.е. без составных индексов). Для меня это главное ограничение. - person PJ.; 18.09.2014
comment
Отличный ответ !! Как бы вы сказали индексы SASI по сравнению с DSE / Solr. Очень хотелось бы услышать ваше мнение. - person taylorcressy; 15.02.2017