Was soll ich tun, wenn die Daten nach der Synchronisierung der Datenbank mit Elasticsearch inkonsistent sind?

1. Probleme an der eigentlichen Kampflinie

  • F1: Logstash synchronisiert PostgreSQL mit Elasticsearch-Daten, die inkonsistent sind.

Beim Importieren einer Tabelle aus der pg-Bibliothek in ES mit Logstash wird festgestellt, dass zwischen dem Datenvolumen in ES und dem Datenvolumen dieser Tabelle in der PG-Bibliothek eine große Lücke besteht. Wie kann man schnell vergleichen, welche Daten nicht eingefügt werden? Während des Importvorgangs sind die Logstash-Protokolle normal. Dieser Tisch in PG hat 7600W.

  • F2: Wie kann im asynchronen Doppelschreibdatenbank- und ES-Schema von mq die Konsistenz von Datenbankdaten und ES-Daten sichergestellt werden?

2. Eine der empfohlenen Lösungen – ID-Vergleichsmethode

Nehmen Sie das folgende Beispiel, um nur Frage 1 zu überprüfen. Das Prinzip von Frage 2 ist dasselbe.

2.1 Schemadiskussion

Um herauszufinden, welche Daten nicht in Elasticsearch eingefügt werden, können Sie die folgende Methode verwenden:

  • Stellen Sie sicher, dass der JDBC-Treiber des Eingabe-Plugins in der Logstash-Konfigurationsdatei ordnungsgemäß konfiguriert ist, um alle Daten aus der PostgreSQL-Datenbank abzurufen. Achten Sie auf den Anweisungsparameter und stellen Sie sicher, dass alle erforderlichen Daten ausgewählt werden.

  • Überprüfen Sie das Ausgabe-Plugin der Logstash-Konfigurationsdatei, um sicherzustellen, dass die Verbindungsparameter zu Elasticsearch korrekt konfiguriert sind. Überprüfen Sie außerdem, ob Filter während des Importvorgangs einige Daten herausgefiltert haben.

  • Fügen Sie der Logstash-Konfigurationsdatei ein stdout-Plugin hinzu, um aus der PostgreSQL-Datenbank gelesene Daten in einer Datei zu protokollieren.

Beispielsweise könnte Folgendes hinzugefügt werden:

output {
  elasticsearch {
    ...Elasticsearch 配置...
  }
  stdout {
    codec => json_lines
    path => "/path/to/logstash_output.log"
  }
}

Vergleichen Sie die Logstash-Ausgabedatei mit den Originaldaten in der PostgreSQL-Datenbank, um Daten zu finden, die nicht importiert wurden. Hierzu kann ein einfaches Skript in Python, einem Shell-Skript oder einer anderen Programmiersprache geschrieben werden.

Wenn die Anzahl der Datensätze in der Logstash-Ausgabedatei mit der Anzahl der Datensätze in der PostgreSQL-Datenbank, jedoch nicht in Elasticsearch, übereinstimmt, überprüfen Sie den Zustand und die Protokolle des Elasticsearch-Clusters. Überprüfen Sie, ob der Cluster Probleme beim Empfangen und Indizieren von Daten hat.

Wenn das Problem weiterhin besteht, versuchen Sie, die Stapelgröße zu reduzieren, um die Belastung von Elasticsearch und Logstash zu verringern. Dies kann durch Festlegen der Parameter „flush_size“ und „idle_flush_time“ im Ausgabe-Plugin der Logstash-Konfigurationsdatei erreicht werden.

Beim Umgang mit großen Datenmengen kann es erforderlich sein, die Leistung und Ressourcenkonfiguration von Logstash und Elasticsearch zu optimieren. Abhängig von den Hardware- und Netzwerkbedingungen müssen möglicherweise Einstellungen für Batch-Vorgänge, JVM-Einstellungen, Thread-Pool-Größe usw. angepasst werden.

2.2 Implementierung des Vergleichsskripts

Im Folgenden finden Sie ein Beispiel für ein einfaches Shell-Skript zum Vergleichen einer Logstash-Ausgabedatei (im JSON-Format) mit Daten in einer PostgreSQL-Datenbank. Das Skript vergleicht bestimmte Felder wie die ID, um festzustellen, welche Daten möglicherweise nicht in Elasticsearch importiert wurden.

dd1f8a0ceaa3587abe362e87ccbcdf48.png

Exportieren Sie zunächst die Daten aus der PostgreSQL-Datenbank und speichern Sie sie als CSV-Datei:

COPY (SELECT id FROM your_table) TO '/path/to/postgres_data.csv' WITH

Als nächstes erstellen Sie ein Shell-Skript namens „compare.sh“:

#!/bin/bash
# 将 JSON 文件中的 ID 提取到一个文件中
jq '.id' /path/to/logstash_output.log > logstash_ids.txt

# 删除 JSON 中的双引号
sed -i 's/"//g' logstash_ids.txt

# 对 Logstash 和 PostgreSQL 的 ID 文件进行排序
sort -n logstash_ids.txt > logstash_ids_sorted.txt
sort -n /path/to/postgres_data.csv > postgres_ids_sorted.txt

# 使用 comm 比较两个已排序的 ID 文件
comm -23 postgres_ids_sorted.txt logstash_ids_sorted.txt > missing_ids.txt

# 输出结果
echo "以下 ID 在 Logstash 输出文件中未找到:"
cat missing_ids.txt

Fügen Sie dem Skript ausführbare Berechtigungen hinzu und führen Sie Folgendes aus:

chmod +x compare.sh

./compare.sh

Dieses Skript vergleicht die IDs in den Dateien logstash_output.log und postgres_data.csv. Werden fehlende IDs gefunden, werden diese in der Datei „missing_ids.txt“ gespeichert und an die Konsole ausgegeben. Beachten Sie, dass dieses Skript davon ausgeht, dass jq (ein Befehlszeilen-JSON-Prozessor) bereits installiert ist. Wenn nicht, installieren Sie es zuerst  jq.

3. Empfehlung 2 – Vergleich der Redis-Beschleunigung

In diesem Fall kann der Sammlungsdatentyp von Redis zum Speichern von IDs in PostgreSQL-Datenbanken und Logstash-Ausgabedateien verwendet werden. Als nächstes können die fehlenden IDs mithilfe der von Redis bereitgestellten Set-Operationen gefunden werden.

3326b1788127ce190fc4e08e809739cb.png

Das Folgende ist ein Beispiel für die Verwendung von Redis, um einen beschleunigten Vergleich zu erreichen:

Exportieren Sie zunächst die Daten aus der PostgreSQL-Datenbank und speichern Sie sie als CSV-Datei:

COPY (SELECT id FROM your_table) TO '/path/to/postgres_data.csv' WITH CSV HEADER;

Installieren und starten Sie Redis.

Laden Sie ID-Daten mithilfe eines Python-Skripts in Redis:

import redis
import csv

# 连接到 Redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 从 PostgreSQL 导出的 CSV 文件中加载数据
with open('/path/to/postgres_data.csv', newline='') as csvfile:
    csv_reader = csv.reader(csvfile)
    next(csv_reader)  # 跳过表头
    for row in csv_reader:
        r.sadd('postgres_ids', row[0])

# 从 Logstash 输出文件中加载数据
with open('/path/to/logstash_output.log', newline='') as logstash_file:
    for line in logstash_file:
        id = line.split('"id":')[1].split(',')[0].strip()
        r.sadd('logstash_ids', id)

# 计算差集
missing_ids = r.sdiff('postgres_ids', 'logstash_ids')

# 输出缺失的 ID
print("以下 ID 在 Logstash 输出文件中未找到:")
for missing_id in missing_ids:
    print(missing_id)

Dieses Python-Skript speichert IDs mithilfe des Redis-Sammlungsdatentyps und berechnet dann die Differenz zwischen ihnen, um fehlende IDs zu finden. Zuerst muss die Redis-Bibliothek von Python installiert werden. Es kann mit dem folgenden Befehl installiert werden:

pip install redis

Dieses Skript ist ein einfaches Beispiel, es kann bei Bedarf geändert und erweitert werden. Der Vorteil der Verwendung von Redis besteht darin, dass große Datenmengen schnell im Speicher verarbeitet werden können, ohne temporäre Dateien auf der Festplatte lesen und schreiben zu müssen.

4. Zusammenfassung

Option 1: Verwenden von Shell-Skripten und dem grep-Befehl

  • Vorteil:

(1) Einfach und leicht zu implementieren.

(2) Es sind keine zusätzlichen Bibliotheken oder Tools erforderlich.

  • Mangel:

(1) ist langsamer, da temporäre Dateien auf der Festplatte gelesen und geschrieben werden müssen.

(2) Bei großen Datenmengen kann es zu einem hohen Festplatten-E/A- und Speicherverbrauch kommen.

Lösung 2: Verwenden Sie Redis, um einen beschleunigten Vergleich zu erzielen

  • Vorteil:

(1) Es ist schneller, da Redis ein speicherbasierter Datenstrukturspeicher ist.

(2) Es verfügt über eine gute Skalierbarkeit und kann große Datenmengen verarbeiten.

  • Mangel:

(1) Die Implementierung ist relativ kompliziert und es müssen zusätzliche Skripte geschrieben werden.

(2) Der Redis-Server muss installiert sein und ausgeführt werden.

Je nach Bedarf und Datenvolumen können Sie eine passende Lösung wählen. Wenn die zu verarbeitende Datenmenge gering ist und die Geschwindigkeitsanforderung nicht hoch ist, können Sie Option 1 wählen, indem Sie ein Shell-Skript und den Befehl grep verwenden. Dieser Ansatz ist einfach und benutzerfreundlich, funktioniert jedoch bei großen Datenmengen möglicherweise nicht gut.

Wenn Sie eine große Datenmenge verarbeiten müssen, wird empfohlen, Option 2 zu wählen und Redis zu verwenden, um einen beschleunigten Vergleich zu erreichen. Diese Methode ist schneller und kann große Datenmengen effizient verarbeiten. Dieser Ansatz erfordert jedoch zusätzliche Einrichtung und Konfiguration, wie beispielsweise die Installation eines Redis-Servers und das Schreiben von Python-Skripten.

In praktischen Anwendungen kann es erforderlich sein, je nach spezifischen Anforderungen Kompromisse einzugehen, um die am besten geeignete Lösung auszuwählen.

------

Wir haben eine hochwertige technische Austauschgruppe gegründet. Wenn Sie mit hervorragenden Menschen zusammen sind, werden Sie selbst hervorragend. Beeilen Sie sich und klicken Sie, um der Gruppe beizutreten und die Freude am gemeinsamen Wachsen zu genießen. Wenn Sie kürzlich den Job wechseln möchten, habe ich außerdem vor zwei Wochen im Jahr eine Welle persönlicher Erfahrungen in großen Fabriken gesammelt. Wenn Sie planen, nach dem Festival den Job zu wechseln, können Sie hier klicken, um es zu beantragen !

Literatur-Empfehlungen

································

Hallo, ich bin DD, ein Programmierer. Ich entwickle seit 10 Jahren einen erfahrenen Treiber, MVP von Alibaba Cloud, TVP von Tencent Cloud. Von der Generalentwicklung über den Architekten bis hin zum Partner. Unterwegs habe ich das tiefste Gefühl, dass wir weiter lernen und auf die Grenzen achten müssen. Solange Sie durchhalten, mehr nachdenken, sich weniger beschweren und hart arbeiten können, wird es Ihnen leicht fallen, in Kurven zu überholen! Fragen Sie mich also nicht, ob es zu spät ist, das zu tun, was ich jetzt tue. Wenn Sie in Bezug auf etwas optimistisch sind, müssen Sie beharrlich daran arbeiten, Hoffnung zu sehen, und nicht nur beharrlich sein, wenn Sie Hoffnung sehen. Glauben Sie mir, solange Sie dabei bleiben, wird es Ihnen besser gehen als jetzt! Wenn Sie noch keine Richtung haben, können Sie mir zuerst folgen, und ich werde hier oft einige aktuelle Informationen teilen, um Ihnen dabei zu helfen, Kapital für Kurvenfahrten und Überholvorgänge zu sammeln.

Supongo que te gusta

Origin blog.csdn.net/j3T9Z7H/article/details/131485416
Recomendado
Clasificación