Wann sollte Cassandra vs. Solr in DSE verwendet werden?

7

Ich verwende DSE für die Cassandra / Solr-Integration, so dass Daten in Cassandra gespeichert und in Solr indiziert werden. Es ist ganz natürlich, Cassandra für die CRUD-Operation zu verwenden und Solr für die Volltextsuche zu verwenden, und DSE kann die Datensynchronisation zwischen Cassandra und Solr wirklich vereinfachen.

Bei der Abfrage gibt es jedoch zwei Möglichkeiten: Cassandra sekundär / manuell konfigurierter Index vs. Solr. Ich möchte wissen, wann ich welche Methode verwenden soll und was der Leistungsunterschied im Allgemeinen ist, besonders unter DSE-Setup.

Hier ist ein Beispiel für einen Anwendungsfall in meinem Projekt. Ich habe eine Cassandra-Tabelle, in der einige Daten zu Entitäten gespeichert sind. Neben der grundlegenden CRUD-Operation muss ich auch Elemente durch Gleichheit auf einem Feld (z. B. Kategorie) abrufen und dann nach einer bestimmten Reihenfolge sortieren (in meinem Fall hier ein like_count-Feld).

Ich kann mir drei verschiedene Wege vorstellen, damit umzugehen:

  1. Deklarieren Sie 'indiziert = wahr' im Solr-Schema für das Feld category und like_count und fragen Sie in Solr
  2. ab
  3. Erstellen Sie eine denormalisierte Tabelle in Cassandra mit Primärschlüssel (Kategorie, like_count, id)
  4. Erstellen Sie in Cassandra eine denormalisierte Tabelle mit Primärschlüssel (Kategorie, Reihenfolge, ID) und verwenden Sie eine externe Komponente wie Spark / Storm, um die Elemente nach like_count
  5. zu sortieren

Die erste Methode scheint am einfachsten zu implementieren und zu warten. Ich schreibe einfach einen trivialen Solr-Zugangscode und der Rest wird von der Solr / DSE-Suche gehandhabt.

Die zweite Methode erfordert eine manuelle Denormalisierung beim Erstellen und Aktualisieren. Ich muss auch eine separate Tabelle pflegen. Es gibt auch ein Tombstone-Problem, da der like_count möglicherweise häufig aktualisiert werden kann. Der gute Teil ist, dass das Lesen schneller sein kann (wenn es keine übermäßigen Grabsteine ​​gibt).

Die dritte Methode kann das Tombstone-Problem auf Kosten einer zusätzlichen Komponente zum Sortieren mindern.

Welche Methode ist Ihrer Meinung nach die beste Option? Was ist der Unterschied in der Leistung?

    
Ziju Feng 17.09.2014, 07:19
quelle

1 Antwort

21

Cassandra Sekundärindizes haben begrenzte Anwendungsfälle:

  1. Nicht mehr als ein paar Spalten indiziert.
  2. Nur eine einzelne indizierte Spalte in einer Abfrage.
  3. Zu viel Verkehr zwischen Knoten für Daten mit hoher Kardinalität (relativ eindeutige Spaltenwerte)
  4. Zu viel Verkehr zwischen den Knoten für Daten mit niedriger Kardinalität (hoher Prozentsatz der Zeilen wird übereinstimmen)
  5. Abfragen müssen im Voraus bekannt sein, damit das Datenmodell um sie herum optimiert werden kann.

Aufgrund dieser Einschränkungen ist es für Apps üblich, "Indextabellen" zu erstellen, die durch die gewünschte Spalte indiziert werden. Dies erfordert entweder, dass Daten aus der Haupttabelle in jede Indextabelle dupliziert werden, oder eine zusätzliche Abfrage wird benötigt, um die Indextabelle zu lesen und dann die tatsächliche Zeile aus der Haupttabelle zu lesen, nachdem der Hauptschlüssel aus der Indextabelle gelesen wurde. Abfragen in mehreren Spalten müssen im Voraus manuell indiziert werden, wodurch Ad-hoc-Abfragen problematisch werden. Und jede duplizierte Datei muss manuell von der App in jede Indextabelle aktualisiert werden.

Abgesehen davon ... werden sie in Fällen funktionieren, in denen eine "bescheidene" Anzahl von Zeilen aus einer bescheidenen Anzahl von Knoten ausgewählt wird und Abfragen im Voraus und nicht ad hoc genau spezifiziert werden.

DSE / Solr ist besser für:

  1. Eine moderate Anzahl von Spalten wird indiziert.
  2. Komplexe Abfragen mit einer Anzahl von referenzierten Spalten / Feldern - Lucene stimmt alle angegebenen Felder in einer Abfrage parallel ab. Lucene indiziert die Daten auf jedem Knoten, so dass die Knoten parallel abfragen.
  3. Ad-hoc-Abfragen im Allgemeinen, bei denen die genauen Abfragen nicht im Voraus bekannt sind.
  4. Rich-Text-Abfragen wie Stichwortsuche, Platzhalter, Fuzzy / like, Bereich, Ungleichheit.

Die Verwendung der Solr-Indexierung verursacht hohe Leistungs- und Kapazitätskosten. Daher empfiehlt es sich, eine Proof-of-Concept-Implementierung durchzuführen, um zu ermitteln, wie viel zusätzlicher Arbeitsspeicher, Speicher und Knoten benötigt werden. Dies hängt davon ab, wie viele Spalten Sie indexieren indiziert, und jede Text-Filter-Komplexität (z. B. brauchen N-Gramm mehr.) Es könnte reichen von 25% Erhöhung für eine relativ kleine Anzahl von indizierten Spalten bis 100%, wenn alle Spalten indiziert sind. Außerdem müssen Sie über genügend Knoten verfügen, damit der Solr-Index pro Knoten bei Verwendung von SSD in RAM oder überwiegend in RAM passt. Und vnodes werden derzeit nicht für Solr-Rechenzentren empfohlen.

    
Jack Krupansky 17.09.2014, 13:39
quelle