So konfigurieren Sie einen Galera-Cluster mit MariaDB auf Debian 10-Servern

Der Autor hat den Free and Open Source Fund ausgewählt, um eine Spende als Teil des Write for DOnations zu erhalten. Programm.

Einführung

Durch Clustering wird Ihre Datenbank durch die Verteilung von Änderungen auf verschiedene Server mit hoher Verfügbarkeit versehen. Für den Fall, dass eine der Instanzen ausfällt, stehen andere Instanzen schnell zur Verfügung, um den Betrieb fortzusetzen.

Cluster gibt es in zwei allgemeinen Konfigurationen: Aktiv-Passiv und Aktiv-Aktiv. In Aktiv-Passiv-Clustern werden alle Schreibvorgänge auf einem einzelnen aktiven Server ausgeführt und dann auf einen oder mehrere passive Server kopiert, die nur bei einem Ausfall eines aktiven Servers die Funktion übernehmen können. Einige Aktiv-Passiv-Cluster erlauben auch "+ SELECT +" - Operationen auf passiven Knoten. In einem Aktiv-Aktiv-Cluster ist jeder Knoten schreib- und lesbar, und eine an einem vorgenommene Änderung wird für alle repliziert.

MariaDB ist ein relationales Open-Source-Datenbanksystem, das vollständig mit dem bekannten MySQL-RDBMS-System kompatibel ist. Sie können die offizielle Dokumentation für MariaDB unter page lesen. Galera ist eine Datenbank-Cluster-Lösung, mit der Sie Multi-Master-Cluster mithilfe der synchronen Replikation einrichten können. Galera verwaltet automatisch die Synchronisierung der Daten auf verschiedenen Knoten, während Sie Lese- und Schreibanfragen an jeden beliebigen Knoten im Cluster senden können. Weitere Informationen zu Galera finden Sie auf der offiziellen documentation page.

In diesem Handbuch konfigurieren Sie einen Aktiv-Aktiv-MariaDB-Galera-Cluster. Zu Demonstrationszwecken konfigurieren und testen Sie drei Debian 10-Server, die als Knoten im Cluster fungieren. Dies ist der kleinste konfigurierbare Cluster.

Voraussetzungen

Um mitzumachen, benötigen Sie einen DigitalOcean account, zusätzlich zu den folgenden:

  • Drei Debian 10-Server mit aktiviertem privaten Netzwerk, jeder mit einem Nicht-Root-Benutzer mit + sudo + - Rechten.

  • Informationen zum Einrichten eines privaten Netzwerks für die drei Droplets finden Sie in unserem Handbuch Private Networking Quickstart.

  • Wenn Sie Hilfe beim Einrichten eines Nicht-Root-Benutzers mit "+ sudo +" - Berechtigungen benötigen, folgen Sie unseren Initial Server Setup with Debian 10 Lernprogramm.

Während die Schritte in diesem Lernprogramm für DigitalOcean Droplets geschrieben und für diese getestet wurden, sollten viele von ihnen auch auf Nicht-DigitalOcean-Servern mit aktiviertem privaten Netzwerk anwendbar sein.

Schritt 1 - Hinzufügen der MariaDB-Repositorys zu allen Servern

In diesem Schritt fügen Sie jedem Ihrer drei Server die entsprechenden MariaDB-Paketrepositorys hinzu, damit Sie die richtige Version von MariaDB installieren können, die in diesem Lernprogramm verwendet wird. Sobald die Repositorys auf allen drei Servern aktualisiert wurden, können Sie MariaDB installieren.

Bei MariaDB ist zu beachten, dass es ursprünglich ein Drop-In-Ersatz für MySQL war. In vielen Konfigurationsdateien und Startskripten wird daher "+ mysql " anstelle von " mariadb " angezeigt. Aus Gründen der Konsistenz werden wir in diesem Handbuch " mysql" verwenden, wo beides funktionieren könnte.

In diesem Tutorial verwenden Sie MariaDB version 10.4. Da diese Version nicht in den Standard-Debian-Repositorys enthalten ist, fügen Sie zunächst allen drei Servern das externe Debian-Repository hinzu, das vom MariaDB-Projekt verwaltet wird.

Um das Repository hinzuzufügen, müssen Sie zuerst die Pakete + dirmngr + und + software-properties-common + installieren. + dirmngr + ist ein Server zum Verwalten von Repository-Zertifikaten und Schlüsseln. + software-properties-common + ist ein Paket, das das einfache Hinzufügen und Aktualisieren von Speicherorten für das Quell-Repository ermöglicht. Installieren Sie die beiden Pakete, indem Sie Folgendes ausführen:

sudo apt install dirmngr software-properties-common

Sie fügen den MariaDB-Repository-Schlüssel mit dem Befehl "+ apt-key +" hinzu, mit dem der APT-Paketmanager überprüft, ob das Paket authentisch ist:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

Sobald Sie den vertrauenswürdigen Schlüssel in der Datenbank haben, können Sie das Repository mit dem folgenden Befehl hinzufügen:

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/debian buster main'

Führen Sie nach dem Hinzufügen des Repositorys "+ apt update +" aus, um Paketmanifeste aus dem neuen Repository einzuschließen:

sudo apt update

Wenn Sie diesen Schritt auf Ihrem ersten Server abgeschlossen haben, wiederholen Sie den Vorgang für Ihren zweiten und dritten Server.

Nachdem Sie das Paket-Repository erfolgreich auf allen drei Servern hinzugefügt haben, können Sie MariaDB im nächsten Abschnitt installieren.

Schritt 2 - MariaDB auf allen Servern installieren

In diesem Schritt installieren Sie die aktuellen MariaDB-Pakete auf Ihren drei Servern.

Ab Version + 10.1 + werden die MariaDB Server- und MariaDB Galera Server-Pakete kombiniert. Wenn Sie also + mariadb-server + installieren, werden Galera und verschiedene Abhängigkeiten automatisch installiert:

sudo apt install mariadb-server

Sie werden gefragt, ob Sie mit der Installation fortfahren möchten. Geben Sie "+ yes +" ein, um mit der Installation fortzufahren.

Ab der MariaDB-Version + 10.4 + hat der * root * MariaDB-Benutzer standardmäßig kein Passwort mehr. Um ein Passwort für den Benutzer * root * festzulegen, melden Sie sich zunächst bei MariaDB an:

sudo mysql -uroot

Wenn Sie sich in der MariaDB-Shell befinden, ändern Sie das Kennwort, indem Sie die folgende Anweisung ausführen:

set password = password("");

Die folgende Ausgabe zeigt an, dass das Kennwort richtig festgelegt wurde:

OutputQuery OK, 0 rows affected (0.001 sec)

Beenden Sie die MariaDB-Shell, indem Sie den folgenden Befehl ausführen:

quit;

Wenn Sie mehr über SQL erfahren möchten oder eine kurze Auffrischung benötigen, lesen Sie unsere MySQL tutorial.

Sie haben jetzt alle erforderlichen Komponenten, um mit der Konfiguration des Clusters zu beginnen. Da Sie sich jedoch in späteren Schritten auf "+ rsync +" verlassen, stellen Sie sicher, dass Folgendes installiert ist:

sudo apt install rsync

Dadurch wird bestätigt, dass die neueste Version von "+ rsync +" bereits verfügbar ist, oder Sie werden aufgefordert, sie zu aktualisieren oder zu installieren.

Nachdem Sie MariaDB installiert und das Root-Passwort auf Ihrem ersten Server festgelegt haben, wiederholen Sie diese Schritte für Ihre beiden anderen Server.

Nachdem Sie MariaDB erfolgreich auf jedem der drei Server installiert haben, können Sie mit dem Konfigurationsschritt im nächsten Abschnitt fortfahren.

Schritt 3 - Konfigurieren des ersten Knotens

In diesem Schritt konfigurieren Sie Ihren ersten Knoten. Jeder Knoten im Cluster muss nahezu identisch konfiguriert sein. Aus diesem Grund nehmen Sie die gesamte Konfiguration auf Ihrem ersten Computer vor und kopieren sie dann auf die anderen Knoten.

Standardmäßig ist MariaDB so konfiguriert, dass das Verzeichnis "+ / etc / mysql / conf.d " überprüft wird, um zusätzliche Konfigurationseinstellungen von Dateien zu erhalten, die auf " .cnf +" enden. Erstellen Sie in diesem Verzeichnis eine Datei mit all Ihren clusterspezifischen Anweisungen:

sudo nano /etc/mysql/conf.d/galera.cnf

Fügen Sie der Datei die folgende Konfiguration hinzu. Die Konfiguration gibt verschiedene Clusteroptionen, Details zum aktuellen Server und den anderen Servern im Cluster sowie replikationsbezogene Einstellungen an. Beachten Sie, dass die IP-Adressen in der Konfiguration die privaten Adressen Ihrer jeweiligen Server sind. Ersetzen Sie die hervorgehobenen Zeilen durch die entsprechenden IP-Adressen.

/etc/mysql/conf.d/galera.cnf

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://,,"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
  • * Im ersten Abschnitt * werden MariaDB / MySQL-Einstellungen geändert oder neu aktiviert, damit der Cluster ordnungsgemäß funktioniert. Galera funktioniert beispielsweise nicht mit MyISAM oder ähnlichen nicht-transaktionellen Speicher-Engines, und "+ mysqld " darf nicht an die IP-Adresse für " localhost +" gebunden sein. Weitere Informationen zu den Einstellungen finden Sie auf der Galera Cluster-Seite system configuration page.

  • * Der Abschnitt "Galera Provider-Konfiguration" * konfiguriert die MariaDB-Komponenten, die eine WriteSet-Replikations-API bereitstellen. Dies bedeutet in Ihrem Fall Galera, da Galera ein wsrep-Anbieter (WriteSet Replication) ist. Sie geben die allgemeinen Parameter an, um die Erstreplikationsumgebung zu konfigurieren. Hierfür ist keine Anpassung erforderlich. Weitere Informationen finden Sie unter Galera configuration options.

  • * Der Abschnitt "Galera-Cluster-Konfiguration" * definiert den Cluster, identifiziert die Cluster-Mitglieder anhand der IP-Adresse oder des auflösbaren Domänennamens und erstellt einen Namen für den Cluster, um sicherzustellen, dass die Mitglieder der richtigen Gruppe beitreten. Sie können + wsrep_cluster_name + in etwas aussagekräftigeres als + test_cluster + ändern oder es so lassen, wie es ist, aber Sie müssen + wsrep_cluster_address + mit den privaten IP-Adressen Ihrer drei Server aktualisieren.

  • * Der Abschnitt "Konfiguration der Galera-Synchronisierung" * definiert, wie der Cluster Daten zwischen Mitgliedern austauscht und synchronisiert. Dies wird nur für die Statusübertragung verwendet, die erfolgt, wenn ein Knoten online geschaltet wird. Für die Ersteinrichtung verwenden Sie "+ rsync +", da es allgemein verfügbar ist und das tut, was Sie jetzt benötigen.

  • * Der Abschnitt "Galera-Knotenkonfiguration" * erläutert die IP-Adresse und den Namen des aktuellen Servers. Dies ist hilfreich, wenn Sie versuchen, Probleme in Protokollen zu diagnostizieren und die einzelnen Server auf verschiedene Arten zu referenzieren. Das "+ wsrep_node_address +" muss mit der Adresse des Computers übereinstimmen, auf dem Sie sich befinden. Sie können jedoch einen beliebigen Namen auswählen, um den Knoten in den Protokolldateien leichter identifizieren zu können.

Wenn Sie mit Ihrer Cluster-Konfigurationsdatei zufrieden sind, kopieren Sie den Inhalt in Ihre Zwischenablage, speichern und schließen Sie die Datei. Mit dem Nano-Texteditor können Sie dies tun, indem Sie "+ STRG + X " drücken, " y " eingeben und " ENTER +" drücken.

Nachdem Sie Ihren ersten Knoten erfolgreich konfiguriert haben, können Sie mit der Konfiguration der verbleibenden Knoten im nächsten Abschnitt fortfahren.

Schritt 4 - Konfigurieren der verbleibenden Knoten

In diesem Schritt konfigurieren Sie die verbleibenden zwei Knoten. Öffnen Sie auf Ihrem zweiten Knoten die Konfigurationsdatei:

sudo nano /etc/mysql/conf.d/galera.cnf

Fügen Sie die Konfiguration ein, die Sie vom ersten Knoten kopiert haben, und aktualisieren Sie dann die "+ Galera-Knotenkonfiguration +", um die IP-Adresse oder den auflösbaren Domänennamen für den bestimmten Knoten zu verwenden, den Sie einrichten. Aktualisieren Sie abschließend den Namen, den Sie festlegen können, um den Knoten in Ihren Protokolldateien zu identifizieren:

/etc/mysql/conf.d/galera.cnf

. . .
# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
. . .

Speichern und schließen Sie die Datei.

Wenn Sie diese Schritte ausgeführt haben, wiederholen Sie sie auf dem dritten Knoten.

Sie sind fast bereit, den Cluster aufzurufen. Stellen Sie jedoch zuvor sicher, dass die entsprechenden Ports in Ihrer Firewall geöffnet sind.

Schritt 5 - Öffnen der Firewall auf jedem Server

In diesem Schritt konfigurieren Sie Ihre Firewall so, dass die für die Kommunikation zwischen Knoten erforderlichen Ports geöffnet sind. Überprüfen Sie auf jedem Server den Status der Firewall, indem Sie Folgendes ausführen:

sudo ufw status

In diesem Fall ist nur SSH erlaubt durch:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Da in diesem Fall nur SSH-Datenverkehr zulässig ist, müssen Sie Regeln für MySQL- und Galera-Datenverkehr hinzufügen. Wenn Sie versuchen, den Cluster zu starten, schlägt dies aufgrund von Firewall-Regeln fehl.

Galera kann vier Ports nutzen:

  • + 3306 + Für MySQL-Client-Verbindungen und State Snapshot Transfer, die die Methode + mysqldump + verwenden.

  • + 4567 + Für Galera Cluster-Replikationsverkehr. Die Multicast-Replikation verwendet an diesem Port sowohl UDP-Transport als auch TCP.

  • + 4568 + Für inkrementelle Statusübertragung.

  • + 4444 + Für alle anderen Status-Snapshot-Übertragungen.

In diesem Beispiel öffnen Sie alle vier Ports, während Sie die Einrichtung vornehmen. Sobald Sie bestätigt haben, dass die Replikation funktioniert, möchten Sie alle Ports schließen, die Sie gerade nicht verwenden, und den Datenverkehr auf Server im Cluster beschränken.

Öffnen Sie die Ports mit dem folgenden Befehl:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

Nachdem Sie Ihre Firewall auf dem ersten Knoten konfiguriert haben, erstellen Sie auf dem zweiten und dritten Knoten dieselben Firewall-Einstellungen.

Nachdem Sie die Firewalls erfolgreich konfiguriert haben, können Sie den Cluster im nächsten Schritt starten.

Schritt 6 - Starten des Clusters

In diesem Schritt starten Sie Ihren MariaDB-Cluster. Zu Beginn müssen Sie den laufenden MariaDB-Dienst stoppen, damit Sie Ihren Cluster online schalten können.

Beenden Sie MariaDB auf allen drei Servern

Verwenden Sie den folgenden Befehl auf allen drei Servern, um MariaDB zu stoppen, damit Sie sie in einem Cluster wiederherstellen können:

sudo systemctl stop mysql

+ systemctl + zeigt nicht das Ergebnis aller Dienstverwaltungsbefehle an. Verwenden Sie daher den folgenden Befehl, um sicherzugehen, dass Sie erfolgreich waren:

sudo systemctl status mysql

Wenn die letzte Zeile wie folgt aussieht, war der Befehl erfolgreich:

Output. . .
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

Sobald Sie "+ mysql +" auf allen Servern heruntergefahren haben, können Sie fortfahren.

Rufe den ersten Knoten auf

Um den ersten Knoten aufzurufen, müssen Sie ein spezielles Startskript verwenden. Wie Sie Ihren Cluster konfiguriert haben, versucht jeder Knoten, der online geschaltet wird, eine Verbindung zu mindestens einem anderen Knoten herzustellen, der in der Datei "+ galera.cnf " angegeben ist, um seinen Anfangszustand abzurufen. Ohne das Skript " galera_new_cluster ", das es systemd ermöglicht, den Parameter " - wsrep-new-cluster " zu übergeben, würde ein normales " systemctl start mysql +" fehlschlagen, da für den ersten Knoten, mit dem eine Verbindung hergestellt werden soll, keine Knoten ausgeführt werden.

sudo galera_new_cluster

Dieser Befehl zeigt bei erfolgreicher Ausführung keine Ausgabe an. Wenn dieses Skript erfolgreich ausgeführt wurde, wird der Knoten als Teil des Clusters registriert, und Sie können ihn mit dem folgenden Befehl anzeigen:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Die folgende Ausgabe zeigt an, dass sich ein Knoten im Cluster befindet:

Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

Auf den restlichen Knoten können Sie "+ mysql" normal starten. Sie suchen nach allen Mitgliedern der Cluster-Liste, die online sind. Wenn sie eines finden, treten sie dem Cluster bei.

Rufe den zweiten Knoten auf

Jetzt können Sie den zweiten Knoten aufrufen. Starte + mysql:

sudo systemctl start mysql

Bei erfolgreicher Ausführung wird keine Ausgabe angezeigt. Sie werden feststellen, dass Ihre Clustergröße zunimmt, wenn jeder Knoten online geschaltet wird:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Die folgende Ausgabe zeigt an, dass der zweite Knoten dem Cluster beigetreten ist und dass insgesamt zwei Knoten vorhanden sind.

Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

Rufe den dritten Knoten auf

Es ist jetzt Zeit, den dritten Knoten aufzurufen. Starte + mysql:

sudo systemctl start mysql

Führen Sie den folgenden Befehl aus, um die Clustergröße zu ermitteln:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Die folgende Ausgabe zeigt an, dass der dritte Knoten dem Cluster beigetreten ist und dass die Gesamtzahl der Knoten im Cluster drei beträgt.

Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Zu diesem Zeitpunkt ist der gesamte Cluster online und kommuniziert erfolgreich. Jetzt können Sie das funktionierende Setup sicherstellen, indem Sie die Replikation im nächsten Abschnitt testen.

Schritt 7 - Testen der Replikation

Sie haben die Schritte bis zu diesem Punkt ausgeführt, damit Ihr Cluster die Replikation von einem beliebigen Knoten auf einen beliebigen anderen Knoten ausführen kann, der als Aktiv-Aktiv-Replikation bezeichnet wird. Führen Sie die folgenden Schritte aus, um zu testen, ob die Replikation wie erwartet funktioniert.

Schreiben Sie an den ersten Knoten

Beginnen Sie mit Datenbankänderungen auf Ihrem ersten Knoten. Die folgenden Befehle erstellen eine Datenbank mit dem Namen "+ playground " und eine Tabelle in dieser Datenbank mit dem Namen " equipment +".

mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

Im vorherigen Befehl erstellt die Anweisung "+ CREATE DATABASE " eine Datenbank mit dem Namen " playground ". Die Anweisung " CREATE " erstellt eine Tabelle mit dem Namen " equipment" in der Datenbank "+ playground " mit einer automatisch inkrementierenden Bezeichnerspalte mit dem Namen " id " und anderen Spalten. Die Spalten " Typ ", " Quant " und " Farbe " dienen zum Speichern von Typ, Menge und Farbe des Equipments. Die Anweisung " EINFÜGEN " fügt einen Eintrag vom Typ " Folie ", Menge " 2 " und Farbe " Blau +" ein.

Sie haben jetzt einen Wert in Ihrer Tabelle.

Lesen und Schreiben auf dem zweiten Knoten

Schauen Sie sich als Nächstes den zweiten Knoten an, um zu überprüfen, ob die Replikation funktioniert:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Wenn die Replikation funktioniert, werden die Daten, die Sie auf dem ersten Knoten eingegeben haben, hier auf dem zweiten Knoten angezeigt:

Output+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+

Über denselben Knoten können Sie Daten in den Cluster schreiben:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Lesen und Schreiben auf dem dritten Knoten

Vom dritten Knoten aus können Sie alle diese Daten lesen, indem Sie die Tabelle erneut abfragen:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Sie sehen die folgende Ausgabe mit den beiden Zeilen:

Output   +----+-------+-------+--------+
  | id | type  | quant | color  |
  +----+-------+-------+--------+
  |  1 | slide |     2 | blue   |
  |  2 | swing |    10 | yellow |
  +----+-------+-------+--------+

Wieder können Sie einen weiteren Wert von diesem Knoten hinzufügen:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Lesen Sie auf dem ersten Knoten:

Zurück auf dem ersten Knoten können Sie überprüfen, ob Ihre Daten überall verfügbar sind:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Die folgende Ausgabe zeigt an, dass die Zeilen auf dem ersten Knoten verfügbar sind.

Output   +----+--------+-------+--------+
  | id | type   | quant | color  |
  +----+--------+-------+--------+
  |  1 | slide  |     2 | blue   |
  |  2 | swing  |    10 | yellow |
  |  3 | seesaw |     3 | green  |
  +----+--------+-------+--------+

Sie haben erfolgreich überprüft, ob Sie auf alle Knoten schreiben können und ob die Replikation ordnungsgemäß ausgeführt wird.

Fazit

Zu diesem Zeitpunkt ist ein funktionierender Galera-Testcluster mit drei Knoten konfiguriert. Wenn Sie vorhaben, einen Galera-Cluster in einer Produktionssituation zu verwenden, wird empfohlen, mit mindestens fünf Knoten zu beginnen.

Bevor Sie mit der Produktion beginnen, sollten Sie einen Blick auf einige der andere Status-Snapshot-Transfer-Agenten (SST-Agenten) werfen, die Sie einstellen können, z. B. * xtrabackup * Sie können sehr schnell und ohne große Unterbrechungen neue Knoten für Ihre aktiven Knoten einrichten. Dies hat keine Auswirkungen auf die tatsächliche Replikation, ist jedoch ein Problem, wenn Knoten initialisiert werden.

Related