Search Engines - Abteilung Datenbanken Leipzig
Transcription
Search Engines - Abteilung Datenbanken Leipzig
NoSQL-Datenbanken Kapitel 5: Search Engines Dr. Anika Groß Wintersemester 2015/16 Universität Leipzig http://dbs.uni-leipzig.de 5-1 Inhaltsverzeichnis • Apache Lucene • Apache Solr • ElasticSearch basiert auf 5-2 Quelle: http://db-engines.com/en/ranking/ DB Ranking • Search Engines • alle 5-3 Apache Lucene Core • “High-performance, full-featured text search engine library written entirely in Java” [Lucene] – Open source – Aktueller Release 5.4.0 – Ports/Integration andere Sprachen (C/C++, C#, Ruby, Perl, Python, PHP, …) • Skalierbare, hoch performante Indexierung – – – – Über 150 GB/hour auf moderner Hardware (Indexing Throughput) Geringe RAM Anforderungen Schnelle inkrementelle Indexierung (wie Batch Indexierung) Indexgröße: ca. 20-30% von Größe des indexierten Texts • Leistungsstarke, korrekte, effiziente Suchalgorithmen – – – – • Ranking der Ergebnisse Versch. Query-Typen (phrase queries, wildcard queries, proximity queries…) Sortierung nach allen Fields … Quelle: [Lucene] Genutzt von Twitter, LinkedIn, CiteSeer, Eclipse, … → http://wiki.apache.org/lucene-java/PoweredBy 5-4 Suche mit Lucene Index document Users Analyze document Search UI Build document Index Build query Render results Acquire content Run query Raw Content http://web.stanford.edu/class/cs276/handouts/lecture-lucene.pptx 5-5 Inverted Index • Index-Struktur für Terme einer Dokumentenkollektion – Statt “page-centric” (page→words) → “keyword-centric” (word → pages) – Zuordnung: Term Liste der Dokumente, die Term enthalten – Erweiterungen: Termhäufigkeit im Dokument, Position im Dokument, ... • Suchanfrage nach Termen kann effizient durch Index realisiert werden – Unterstützung von AND, OR und NOT durch Mengenoperationen • Beispiel Dokumente d1:“A A B C” d2:“B D D” d3:“A B B E” Inverted Index A d1,d3 B d1,d2,d3 C d1 D d2 E d3 5-6 Anfrage A AND B {d1,d3} {d1,d2,d3} = {d1,d3} Inverted Index - Beispiel http://karthikkumar.me/images/intro-to-lucene/inverted_index.jpg 5-7 Lucene Komponenten Indexierung • Directory: Speicherort Index • Document: zu indexierendes Dokument (field collection) • Field: Abschnitt eines Dokument (name, value) • IndexWriter: Indexerzeugung+verwaltung (add, remove, update von Dokumenten im Index) • Analyzer: Textanalyse zur Extraktion der Indexterme (Tokenisierung, Stemming, Stoppwort-Extraktion, …) Suche • QueryParser: Parsen der Anfrage, Erzeugung eines Query-Objekts • IndexSearcher: Zugriff auf Index mit Query-Objekt • Hits (TopDocs): Gerankte Liste von Ergebnisdokumenten http://blogs.msdn.com/b/windows-azure-support/archive/2010/11/01/how-to-use-lucene-net-in-windows-azure.aspx 5-8 Lucene Index • • Zusammengesetzt aus mehreren Sub-Indices = Segmente Jedes Segment ist ein unabhängiger Index, der separate durchsucht werden kann • Segment: – Field names + values – Term dictionary: alle Terme + Pointer auf Frequency+Proximity Data – Term Frequency data: # Dokumente, die Term enthalten + Häufigkeit des Terms im aktuellen Dokument – Term Proximity data: Position eines Terms in jedem Dokument – Normalization factors: für Score-Berechnung – Term Vectors: Vektor mit Termtext und Termhäufigkeit für jedes Field in jedem Dokument • Hinzufügung neues Dokument zu Index – Erzeugung eines neuen Segments – Bei jedem flush von IndexWriter • • Periodischer Merge existierender Segmente Suche bezieht mehrere Segmente ein 5-9 Ranking / Scoring – Vector Space Modell • Repräsentation von Objekten als Vektoren • Information Retrieval – Dokument: Term-Vektor mit Gewicht (z.B. TF*IDF) – Finden ähnlicher Dokumente: (Fast) Duplikate (Plagiate), Clustering, Anfragen, ... • Recommendations und soziale Netzwerke – Nutzer-Präferenzen und Items (z.B. Filme) als Vektoren – Finden potenziell interessanter Filme für Nutzer, potenzielle Freunde, ... • Ähnlichkeit = Kosinus-Ähnlichkeit der Vektoren Quelle: Wikimedia • Beispiel: Dokumente d1:“A A B C” d2:“B D D” d3:“A B B E” sim(d1, d3) Vektoren d1:[2 1 d2:[0 1 d3:[1 2 A B 1 0 0 C 0 2 0 D 0] 0] 1] E 𝑑1 = 22 + 12 + 12 + 02 + 02 = 6 𝑑3 = 12 + 22 + 02 + 02 + 12 = 6 𝑠𝑖𝑚(𝑑1, 𝑑3) = 5-10 2∙1+1∙2+1∙0+0∙0+0∙1 6+ 6 = 4 2 = 6 3 Lucene Query Language • Keyword matching – Search for phrase "foo bar" in the title field title:"foo bar" – Search for either the phrase "foo bar" in the title field AND the phrase "quick fox" in the body field, or the word "fox" in the title field (title:"foo bar" AND body:"quick fox") OR title:fox – Search for word "foo" and not "bar" in the title field title:foo -title:bar • Wildcard Search – Search for any word that starts with "foo" in the title field title:foo* • Proximity matching – Search for "foo bar" within 4 words from each other "foo bar"~4 • Range searches mod_date:[20020101 TO 20030101] • … http://www.lucenetutorial.com/lucene-query-syntax.html 5-11 Inhaltsverzeichnis • Apache Lucene • Apache Solr • ElasticSearch basiert auf 5-12 Apache Solr • „Solr is the popular, blazing-fast, open source enterprise search platform built on Apache Lucene™“[Solr] – Open source – Aktueller Release 5.4.0 – Java Implementierung • • • • REST-like API, Java API (SolrJ) System- und Workflow-Konfiguration (xml-configs) Seit 2010 Subprojekt von Lucene SolrCloud seit Version 4.x: Sharding, Replikation – Performance, horizontale Skalierung, hohe Verfügbarkeit, Ausfallsicherheit & Fehlertoleranz, Elastizität • Anwendungen & Nutzer – Index für Suche – Analyse: Systemangriffe, häufigste Suchanfragen, Trends … – Nutzer: Netflix, Instagramm, AOL … 5-13 [Solr] Workflow • Sammeln der Daten (Akquise) – Zugriff auf Datenquellen und Data Processing – Echtzeitnahe Indexierung der “Rohdaten” • Datenanreicherung – Weiterverarbeitung der Daten (komplexe Verfahren - längere Prozesse) zum Erzeugen von Zusatzinformationen zur Verbesserung der Suche/Navigation • Speicherung in zusätzlichem Datastore z.B. HDFS – Indexierung der angereicherten Daten Solr Anwendung Nutzer Datenakquise Datenspeicher Anreicherung Quelle [W15] 5-14 Index Solr: Collection & Schema • Collection: logischer Index – Menge von Dokumenten mit durchsuchbaren Feldern (=Fields) • Bsp.: Autor, Änderungsdatum, Titel, Abstract, Content … Dokument Field Term … Term Field Term … Term – Zugriff via Collection Name – Definition von Regeln, nach welchen ein Field durchsucht wird mittels Field Types – Kann auf mehrere Shards verteilt sein (SolrCloud) … Dokument … • Schema-Definition (schema.xml) – Definition der Fields in Dokumenten: field name, field type, uniqueKey … <fields> <field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="name" type="textgen" indexed="true" stored="true"/> ... </fields> – Dynamic Fielding: Definition von Regeln zur dynamischen Field-Erzeugung <dynamicField name="*_i" type="integer" indexed="true" stored="true"/> Bsp: http://www.pathbreak.com/blog/solr-text-field-types-analyzers-tokenizers-filters-explained 5-15 Schema (Field Types) – Definition von Field-Typen: • Verschiedene Analyzer-Typen (für index, query ..) • Workflow-Definition zur Anwendung versch. Filter Factories (Stopwords, Delimiter..), Tokenizer (WhiteSpaceTokenizer…) <fieldType name="textgen" class="solr.TextField" ...> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords.txt" .../> <filter class="solr.WordDelimiterFilterFactory" .../> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt".../> <filter class="solr.StopFilterFactory“ .../> ... </analyzer> </fieldType> • Queries werden ebenfalls analysiert & tokenisiert und gegen Tokens des Index gematcht Bsp: http://www.pathbreak.com/blog/solr-text-field-types-analyzers-tokenizers-filters-explained 5-16 Bild: http://image.slidesharecdn.com/solr-workshop-140604141213-phpapp01/95/apache-solr-workshop-18-638.jpg?cb=1408185803 Faceted Search Facet Facet value (=constraint) Facet count • • Suche: www.amazon.de/s/ref=nb_sb_noss_2?field-keywords=festplatte 5-17 Ziel: “Drill down” zu Untermenge von Ergebnissen einer Query facet constraints in jeder Reihenfolge anwendbar/entfernbar Field Faceting • • • • Spezifiziert ein Field, das in Facet genutzt werden soll Jeder indexierte Term ist ein Field Value/Constraint Field muss indexiert sein Kann mehrmals & versch. Fields genutzt werden bzw. Quelle: Yonik Seeley, The Many Facets of Apache Solr, Apache Lucene Eurocon, 2011 5-18 http://de.slideshare.net/lucenerevolution/seeley-solr-facetseurocon2011 Field Faceting (2) • facet.query – verwenden eines Query Ausdrucks als Facet Constraint – Mehrfachanwendung: Erstellung von Teilmengen / Kategorien – Jede Query-Form möglich Range Faceting Außerdem • Range Faceting • Spatial faceting • Date faceting • Pivot faceting Quelle: Yonik Seeley, The Many Facets of Apache Solr, Apache Lucene Eurocon, 2011 5-19 http://de.slideshare.net/lucenerevolution/seeley-solr-facetseurocon2011 Solr Cloud • Menge von Features zur Konfiguration und Verwaltung von Solr in verteilter Umgebung – Fehlertoleranz und hohe Verfügbarkeit – Verteilte Indexierung und Suche – Horizontale Skalierbarkeit Collection = verteilter Index • Konfiguration wird in ZooKeeper gespeichert • Anzahl Shards: Dokumente werden auf N Partitionen des Index verteilt • Document Routing Strategy: bestimmt wie Dokumente den Shards zugeordnet werden • Replication Factor: Anzahl Kopien von jedem Dokument in Collection Cluster: Menge von SolrNodes Node (= Solr server): JVM Instanz a.d. Solr läuft Core: individuelle Solr-Instanz (repräsentiert einen logischen Index); mehrere Cores auf einem Node 5-20 http://de.slideshare.net/saumitra121/scaling-search-with-solrcloud Sharding & Replikation • Shard: Teil/Partition einer Collection – Besteht aus einem oder mehreren Replica – Jeder Shard hat Name, Hash Range, Leader, Replication Factor – Ein Dokument wird genau einem Shard pro Collection zugeordnet mittels hash-basierter Document Routing Strategy • Shard Leader: Replica, das die Leader Election gewonnen hat – Shard Replica leiten Indizierrequest an Leader weiter – Leader führt als erster Update auf Dokumentenbestand durch – Weiterleitung des Indizierrequest an Shard Replica (parallel) • Replica haben mit geringer Zeitverzögerung Stand des Leaders • Shard Replica: Kopie von Shard – Für Ausfallsicherheit und erhöhten Durchsatz von Suchanfragen – Aber je mehr Replica, desto geringer ist die Indiziergeschwindigkeit – z.B. Collection "test" mit numShards=1 und replicationFactor=2 • Zwei Cores, jeweils auf anderer Solr Instance: • test_shard1_replica1 & test_shard1_replica2, wovon einer zum Leader gewählt wird Bild: http://prismoskills.appspot.com/lessons/Solr/imgs/shard_split3.png 5-21 [W15] SolrCloud Architektur 5-22 Bild: http://i.stack.imgur.com/AMwjc.jpg ZooKeeper in SolrCloud • Repository für Clusterzustand: Verwaltung der Konfiguration von Collections und allen Teilen der SolrCloud – Redundanz: mind. 3 Knoten empfohlen – Kann auf gleicher Hardware wie Solr laufen – Zusicherung dass ack’ed Requests verarbeitet werden (atomar & dauerhaft), d.h. kein Datenverlust • Zentralisierte Konfiguration – – – – Speichern der config files in ZooKeeper Solr nodes holen sich config während Initialisierung Config sets können für mehrere Collections genutzt werden Upload von Änderungen in ZooKeeper (reload collections) • Management Clusterzustand – Collection Metadaten und Replika Status – Überwachen der live nodes – Einsatz für Failover Szenarien u.a. Leader Election • Kein Split-Brain Szenario durch Paxos Konsensus (bei Netzwerkpartitionierung nur Major Partition verfügbar) 5-23 Document Routing • Jeder Shard hat Hash Range • Default: Hash ID 32-bit integer, Mappen auf Range • Alternativ: Custom-hashing Bild: http://prismoskills.appspot.com/lessons/Solr/imgs/document_router.png 5-24 Document Routing - Custom Hashing • Dokumente werden spezifischen Shards basierend auf einer shardKeyKomponente (Prefix) in der Dokumenten-ID zugeordnet (Hash: shardKey!docID) – Jeweils 32 Bit Hash → CompositeID aus 16 Bit des ShardKey Hash und 16 Bit des DocID Hash (ShardKey Bits entscheidend für Shard-Zuordnung) – z.B. alle Dokumente eines Kunden in einem Shard → Custumer Name/ID als Prefix • Kunde “IBM” mit Dokument “12345” → "IBM!12345“ – Direkte Anfragen an spezifische Shards mit Prefix und _route_ Parameter • q=solr&_route_=IBM! • kann Query Performance verbessern aufgrund geringerer Netzwerklatenz, da nicht alle Shards angefragt werden müssen – 2 Routing Level möglich: z.B. "USA!IBM!12345" • Scale-up durch mehr Replicas für spezifische Shards mit höheren Query- und/oder Indexierungsanforderungen • Schlecht balancierte Shards können aufgeteilt werden (zusätzlicher /num Parameter in Prefix) 5-25 Shard Splitting • Aufteilung eines existierenden Shards in zwei Teile, die als zwei neue Shards persistiert werden: SPLITSHARD-Befehl – /admin/collections?action=SPLITSHARD&collection=name&shard=shardID • Neue Shards haben Transaction Log mit Updates von Parent Shard – In diesem Zustand nehmen sie keine Queries an! • • • • • Leader für beide Sub-Shards: Anwendung der gepufferten Updates aus TransactionLog Erstellung der Replica Switch des Shard-Zustands: Parent Shard inaktiv, neue Sub-Shards aktiv Parent Shard kann gelöscht werden Zur Laufzeit ausführbar, keine Downtime Node 1 Shard 1 Leader Node 2 Shard 1 Replica shard1 range: 80000000-ffffffff Shard 2 Replica Shard 2 Leader shard2 range: 0-7fffffff Node 1 Node 2 Shard 1_0 Leader Shard 1_0 Replica shard1_0 range: 80000000-bfffffff Shard 1_1 Leader Shard 1_1 Replica shard1_1 range: c0000000-ffffffff Shard 2 Replica Shard 2 Leader shard2 range: 0-7fffffff 5-26 Timothy Potter: Introduction to SolrCloud, ApacheCon, 2014; http://events.linuxfoundation.org/sites/events/files/slides/ApacheCon_IntroSolrCloud.pdf Transaction Log • • • • Ziel: Update Durability, Recovey Dokumente, die nicht committed sind, gehen nicht verloren Jeder Node hat eigenes tlog Bei Update: Schreiben des ganzen Dokuments in tlog – Nicht nur das “delta” (bei atomic update) • tlog zur Aktualisierung von Index, falls JVM gestoppt wird bevor Segment committed – Anwendung tlog kann sehr lange dauern • Hard commit – tlog wird beendet, neues tlog gestartet (alte tlogs später gelöscht) – close und flush von aktuellem Index-Segment – Ggf. Merge von Segmenten • Soft commit: – “less expensive than hard commits“ – Dokumente sind sichtbar, aber tlog wird nicht beendet! – Cache Aktualisierung nötig 5-27 Verteilte Indexierung Node 1 1. Hole Clusterzustand von ZooKeeper 2. Leite Dokument direkt an Leader (hash auf doc ID) 3. Persistiere Dokument auf Storage (tlog) 4. Weiterleitung an Replica 5. Acknowledge write an Client Node 2 Shard 1 Leader 5 Shard 2 Replica Shard 1 Replica 4 Shard 2 Leader shard1 range: 80000000-ffffffff shard2 range: 0-7fffffff 3 tlog tlog 2 1 CloudSolrServer „smart client“ View of cluster state from Zk Zookeeper Get current URLs of leaders? 5-28 Timothy Potter: Introduction to SolrCloud, ApacheCon, 2014; http://events.linuxfoundation.org/sites/events/files/slides/ApacheCon_IntroSolrCloud.pdf Verteilte Anfragen 1. Query Client holt Clusterzustand von ZooKeeper oder via load balancer 2. Client kann Query an irgendeinen Node senden 3. Query Controller sendet Query an alle Shards und führt Ergebnisse zusammen 4. Query Controller sendet 2. Query an alle Shards mit Dokumenten des gemergten Ergebnisses, um angefragte Fields zu erhalten Query controller 2 Node 1 Node 2 Shard 1 Leader Shard 1 Replica Shard 2 Replica 3 4 get fields Shard 2 Leader 1 q=*.* CloudSolrServer View of cluster state from Zk Zookeeper Get current URLs of leaders? 5-29 Timothy Potter: Introduction to SolrCloud, ApacheCon, 2014; http://events.linuxfoundation.org/sites/events/files/slides/ApacheCon_IntroSolrCloud.pdf SolrCloud und CAP • Fokus auf Consistency (CP) – Alle Replicas eines Shards haben die gleichen Daten – Reduzierte Schreibverfügbarkeit: writes werden (nur) akzeptiert, solange je Shard mind. ein aktives Replica verfügbar ist • Skalierbarkeit – Alle Knoten führen Indexierung und Queries aus (kein Master) – Verteilte Indexierung: kein SPoF, hoher Durchsatz durch direkte Updates an Leader – Verteilte Anfragen: Hinzufügen neuer Replicas für Scale-out; Parallelisierung komplexer Queries • Ausfallsicherheit – Ausfall Replica: erhält keine Anfragen mehr – Ausfall Leader: Leader Election aus Replica • Neuer Leader nimmt Indizier- und Suchanfragen an – Neuer Knoten/Wiederherstellung durch Synchronisation • Transaction Log für erneutes Indizieren eines Dokuments nach Ausfall 5-30 Solr Admin UI 5-31 Solr - Kombination mit anderen Open-Source-Tools • Datenanreicherung – Clustering, Klassifikation, Recommendations mit Apache Mahout vor allem für zunächst unstrukturierte Daten – Apache OpenNLP, Apache Stanbo, Apache UMIA: z.B. für Textsegmentierung, Named Entity Recognition (Extrahieren von z.B. Personen, Orten, Organisationen … aus Text) • Datenakquise – Solr Log Manager: Logstash-Port mit Plugin, um Daten an Solr zur Indizierung zu senden – Apache Flume: Senden der akquirierten Daten an Solr und Übertragen von Daten in HDFS für Anreicherungsprozesse • Visualisierung mit Banana: Kibana Framework zum Erstellen von Dashboards • Einsatz von Hadoop: z.B. MapReduce Jobs / Spark • für Index Lesen/Schreiben in/aus HDFS • für Datenanreicherungsprozesse 5-32 Quelle [W15] Inhaltsverzeichnis • Apache Lucene • Apache Solr • ElasticSearch 5-33 Elasticsearch • “Elasticsearch is a highly scalable open-source full-text search and analytics engine.“[Elastic] • Aktueller Release: 2.1 • Apache 2.0 Lizenz • Elasticsearch/Logstash/Kibana (ELK) stack – Datenverarbeitung, Analyse, Visualisierung … • Nutzer: GitHub, SoundCloud, Stackoverflow, … – https://www.elastic.co/use-cases [Elastic] 5-34 Mapping • Definition wie Dokument mit seinen Fields gespeichert und indexiert werden soll – Volltext-Fields, Numbers, Dates, Geolocations… • • Definition von Regeln für dynamisch hinzugefügte Fields Mapping Typen zur Unterteilung der Dokumente in logische Gruppen – z.B. User documents in User type, Blog posts in Blogpost type • • • Meta-Fields: z.B. Dokument _index, _type, _id .. Fields: je Mapping Type Liste spezifischer Fields (user type: title, name, age fields..) Indexierung des gleichen Fields für versch. Zwecke (Volltextsuche, Sortierung, Aggregationen…) PUT my_index { "mappings": { "user": { "_all": { "enabled": false }, "properties": { "title": { "type": "string" }, "name": { "type": "string" }, "age": { "type": "integer" } } }, "blogpost": { "properties": { "title": { "type": "string" }, "body": { "type": "string" }, "user_id": { "type": "string", "index": "not_analyzed" }, "created": { "type": "date", "format": "strict_date_optional_time||epoch_millis" } } } } } 5-35 Index API • Hinzufügen oder Ändern eines JSON Dokuments in Index • Beispiel: Einfügen eines Dokuments in den Index "twitter“ unter dem Typ "tweet" mit id=1 $ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }' • Ergebnis { "_shards" : { "total" : 10, "failed" : 0, "successful" : 10 }, "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_version" : 1, "created" : true } 5-36 Sharding • Horizontale Partitionierung – Verteilung des Index auf mehrere Server – Parallelisierung von Operationen auf Dokumenten (Indizierung, Aktualisierung, Löschen, Auslesen) • Verteilte Ausführung von Suchanfragen – Alle Shards können relevante Dokumente enthalten • Routing – shard = hash(routing) % number_of_primary_shards • routing = Shard key = Dokumenten-ID (default) oder Custom Value • Range von 0 bis number_of_primary_shards - 1 → Einschränkung ElasticSearch: – Kein Shard Splitting: Anzahl der Shards eines Index lässt sich nach initialer Erstellung nicht ändern – Hinreichende Anzahl von Shards durch Voranalysen einplanen 5-37 Replikation Primary 1 Primary 3 • Vorteile Primary 2 Replica 1 Replica 3 Replica 2 Node 1 Node 2 – Ausfallsicherheit: Failover bei Ausfall des Primary – Performanz bei Suchanfragen • N Replikate pro Shard – Primary Shard + N-1 Replica – Anzahl ist dynamisch änderbar • Index-Operation wird an Primary Shard geleitet (basierend auf Routing) und ausgeführt • Anschließend wird update an Replicas verteilt 5-38 Konsistenz • Synchrone Replikation (sync) – Aufwendigere Index-Operationen: Änderungen müssen auf allen Kopien durchgeführt werden – Alternativ async: ack nach erfolgreicher Ausführung auf Primary • Inkonsistenzen bei Lesezugriffen auf versch. Kopien desselben Shards • Near-Realtime Suche: Definition eines Refresh-Intervals: default 1 Sek. bis neu indexierte Dokumente in Suche erscheinen • Gelöschte Dokumente tragen zu Index-Statistiken bei – Löschung von Dokumenten in Lucene: zunächst logische Löschung im Index, erst später physische Löschung – Berechnung der Relevanz von Dokumenten wird verfälscht – Prinzipiell wenig problematisch, aber: • Physische Löschung auf Replica findet zu unterschiedlichen Zeitpunkten statt • N-mal hintereinander gleiche Suchanfrage: Ergebnis enthält immer die gleichen Dokumente, aber jeweils in unterschiedlicher Reihenfolge (je nach Replica) • Kann über Stunden so bleiben [P15] – ElasticSearch: preference-Parameter • z.B. Nutzer-ID: alle Suchanfragen des 5-39Nutzers landen immer bei dem/den selben Replika Write Consistency • Verhindern, dass writes in “falscher” Partition stattfinden • One, quorum, all • Default quorum: Indexoperationen nur erfolgreich, wenn ein Quorum (>replicas/2+1) aktiver Shard Replicas verfügbar ist (d.h. bevor write überhaupt versucht wird) • Erfolgreicher write, erst wenn alle aktiven Replicas des Shards erfolgreich die Änderung durchgeführt haben (sync replication) 5-40 Zen Discovery • Default, built in Discovery Modul für Elasticsearch • Discovery: Ping / Gossip Mechanismus zum Auffinden anderer Knoten • Master Election – Master: Handling von Knoten, Allokation der Shards • Einziger Knoten, der Cluster-Zustand ändern kann • Kein SPoF: bei Ausfall Neuwahl • Kein Bottleneck: Knoten müssen nicht bei jedem Request mit Master kommunizieren – Netzwerkpartitionierung: SplitBrain-Problem 5-41 Split Brain Netzwerkpartitionierung • Beide Knoten, denken der andere Knoten ist nicht verfügbar → Node 2 wählt sich als Master • Beide Knoten nehmen Requests an → inkonsistenter Cluster-Zustand • Minimum_master_nodes = # „master-wählbarer“ Knoten, die ein Knoten sehen muss, um selbst als Master gewählt werden zu können • Quorum (mehr als die Hälfte der Clusterknoten) als Schutz vor SplitBrain, da max. in einer Partition mehr als die Hälfte der „master-wählbaren“ Knoten (nur eine Partition funktionsfähig) • ABER: schützt nur im Falle vollständiger Netzwerkpartitionierung vor SplitBrain – z.B. nur eine Verbindung zw. 2 Knoten gestört – C sieht A nicht mehr und hat mit B Quorum an Masterwählbaren Knoten (SplitBrain A + C) Master A B [P15] C 5-42 Bilder: http://blog.trifork.com/2013/10/24/how-to-avoid-the-split-brain-problem-in-elasticsearch/ ELK Stack • Logstash: Data Pipeline zur Prozessierung von Logs u.a. Event-Daten • Elasticsearch: Speicherung und Indexierung von Daten, komplexe Queries • Kibana: Erstellen von Custom Dashboards, Datenvisualisierung 5-43 Solr vs. ElasticSearch Feature APIs Format Third party Integrations Schema Suche Cluster Management Skalierbarkeit Replikation Sharding Failover Fehlertoleranz http://solr-vs-elasticsearch.com/ Apache Solr Elasticsearch Java, PHP, Ruby, Rails, AJAX, Perl, Scala, Java, Groovy, JavaScript, .NET, PHP, Perl, Python, .NET, JavaScript, HTTP RESTful API Python, and Ruby, HTTP RESTful API XML, JSON, CSV XML, JSON Kommerziell + Open source Schema + Schema-frei Dynamic fields support, Synonyms , Multiple indexes, Faceting, Rich documents support, Auto Suggest, Highlighting, Default/Custom Analyzers/Tokenizers/Token filters, Fuzzy Logic, "Did you mean", Stopwords, Geosearch ZooKeeper Built-in Vertikal + Horizontal + + + (wenn set up im Cluster Replica mode) + (wenn set up im Cluster mode) 5-44 Solr vs. Elasticsearch Feature Self-contained cluster Automatic node discovery Partition tolerance Automatic failover Automatic leader election Shard replication Sharding Automatic shard rebalancing http://solr-vs-elasticsearch.com/ Apache Solr Elasticsearch o (separater ZooKeeper Server) + Nur ElasticSearch Nodes + ZooKeeper + internes Zen Discovery o. ZooKeeper + Partition mit ZooKeeper Quorum ist - SplitBrain teilweise verhindert durch funktionsfähig; P. ohne Quorum nimmt Min-Anzahl MasterNodes ≥ N/2+1 (N = keine Indexierrequests o. ClusterClustergröße) zustandsänderungen an + Requests müssen mit shards.tolerant= + true Parameter gestellt werden + + + + Zuordnung von Tags zu Nodes + + Konfig., dass Replicas eines Shards nicht zu Knoten mit gleichen Tags zugeordnet werden 5-45 Solr vs. Elasticsearch Feature http://solr-vs-elasticsearch.com/ Apache Solr Elasticsearch - Keine Änderung der # Shard Primarys + Shards können hinzugefügt o. gesplittet nach initialer Indexerstellung möglich Change # werden (Replicas können immer (Replicas können immer hinzugefügt shards hinzugefügt werden) werden) Shard Splitting + - (Re-indexierung in neuen Index) + Erstellung Shard Replica auf + Verschieben von Shards and Replicas Relocate shards gewünschtem Knoten, anschließend on demand and replicas Löschen des „Source Shards“ + routing Parameter Shard routing + shards or _route_ Parameter Synchrone Replikation für IndexierSynchrone Replikation (default), Requests (Antwort aller Replicas), neue Consistency asynchrones Setting möglich Replicas antworten erst, wenn Indexreplikation fertiggestellt ist Data Rivers modules, Logstash Input Plugins, Default import/export Handler, import/export Custom programs / Snapshot API Custom import/export Handler Web Interface Sense Solr Admin 5-46 Referenzen • • • • [Lucene] https://lucene.apache.org/core/ [Solr] http://lucene.apache.org/solr/ [Solr2] https://cwiki.apache.org/confluence/display/solr/Apache+Solr+Reference+Guide [W15] Daniel Wrigley: Wer suchet, der findet – Wie Apache Solr und Big Data unter einen Hut passen. iXDeveloper, Big Data, 02/2015. • [Elastic] https://www.elastic.co/guide/en/elasticsearch/reference/2.1/index.html • [P15] Patrick Peschlow: Gesucht, gefunden – Elasticsearch erfolgreich skalieren. iXDeveloper, Big Data, 02/2015. • http://solr-vs-elasticsearch.com/ 5-47