Mysql Logo

Seit einigen MySQL-Versionen gibt es die Möglichkeit Datenbanken (oder Teile davon) zu Clustern
Wie man einen solchen Cluster mit ndb-Storage-Engine installiert bzw. konfiguriert möchte ich in diesem HOWTO zeigen.

Erst einmal sollte man sich über ein paar Sachen im Klaren sein:

  • Ein ndb-Cluster besteht mindestens aus 3 Nodes (wobei eine node für das Management benötigt wird)
  • Bestimmte Features von MyISAM-Tabellen (z.B. FullText Index) gibt es in beim ndb-Cluster nicht.
  • Der komplette Datenbestand wird im RAM der jeweiligen Node gehalten. Das bedeutet Grenzen für die Größe der Datenbank-Tabellen.
  • Es sollte sehr regelmäßig ein Dump der Daten gezogen werden, weil bei einem kompletten Zusammenbruch des Clusters (was natürlich nicht passieren sollte) sämtliche Daten seit dem letzten Backup weg sind.

Damit sieht man bereits, dass schon eine Menge Aufwand betrieben werden muss, um so einen ndb-Cluster ans laufen zu bekommen.

Belohnt wird die Arbeit dann durch hohe Performance und sehr hohe Verfügbarkeit - beides abhängig von letztendlichen Konfiguration bzw. Anzahl und Leistung der Nodes.

Voraussetzungen für den MySQL-ndb-Cluster

Zu aller erst benötigt man 3 Maschinen. Dabei können diese Rechner natürlich auch rein virtuell sein, was aber sicherlich lediglich zum testen Sinn macht.

Da ich momentan ein solches System (noch) nicht produktiv einsetze, mir aber trotzdem schon mal ein Bild über die Installation und Konfiguration machen wollte, habe ich mit OpenVZ drei virtuelle Maschinen angelegt.

Besonders viel RAM wird für so ein Test-System übrigens auch nicht benötigt, da ja die Menge von der Größe der Tabellen abhängt. Solange man also seine Test-Daten nicht eine gewisse Größe übersteigen lässt, reicht ein Standard-PC zum probieren absolut aus.

Man hat nun seine 3 Maschinen, die über jeweils eine IP-Adresse bzw. einen Hostnamen ansprechbar sind.

Am besten trägt man die IP-Adressen/Hostnamen Kombination in die Datei /etc/hosts jeweils auf jedem Rechner ein:

mgm.localnet		192.168.1.100
node1.localnet		192.168.1.101
node2.localnet		192.168.1.102

Die Hostnamen sollten nun alle anpingbar sein:

ping mgm.localnet
ping node1.localnet
ping node2.localnet

Damit sollten nun alle Vorraussetzungen für die Installation des ndb-Clusters erfüllt sein.

Installation

Es gibt zwei Möglichkeiten der Installation. Entweder man ein Paketorientiertes System (z.B. apt) und kann die fertigen Pakete einfach installieren oder man kompiliert sich das ganze selbst aus den Sourcen.

Die erste Methode ist natürlich wesentlich einfacher und sollte möglichst auf aus Gründen einer späteren Wartung bevorzugt werden.

Folgendermaßen kann man den MySQL-Server via apt installieren:

apt-get install mysql-server-5.0

Für die Selbstbau-Methode ist etwas mehr Arbeit notwendig:

Zuerst werden die Sourcen heruntergeladen.

In einem Verzeichnis der Wahl wird das Archiv entpackt.

tar xfz mysql-5.0.41.tar.gz

in dem neu erstellten Verzeichnis wird dann das ./configure - Script aufgerufen.

./configure --with-ndbcluster

danach noch:

make
make install

Diese Installation muss auf allen Nodes durchgeführt werden.

Gerade, wenn man sehr viele Nodes hat wird das natürlich zur Fleißarbeit. Wenn man KDE-User ist, dann kann man sich die Arbeit etwas erleichtern, indem man zu allen Maschinen eine SSH-Session öffnet und aus dem Menü unter „Ansicht“ „Eingabedaten an alle Sitzungen senden“ wählt.
Dann muss man alle Eingaben nur indem ausgewählten Fenster machen und alle Tastatureingaben werden an anderen Fenster weitergegeben.

Konfiguration des Managementservers

Zuerst sollte der Managementserver konfiguriert werden.
Sollte das Verzeichnis: /var/lib/mysql-cluster noch nicht existieren bitte anlegen:

mkdir /var/lib/mysql-cluster

und in dieses Verzeichnis wechseln:

cd /var/lib/mysql-cluster

Mit dem bevorzugten Editor (z.B. vi) wird nun die Datei config.ini in diesem Verzeichnis erstellt und sollte folgendermaßen aussehen:

[NDBD DEFAULT]
# Anzahl der Datenkopien, die der Cluster halten soll
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Der Managment Server
[NDB_MGMD]
# Der Hostname des Management-Servers
HostName=mgm.localnet
# Storage Nodes
[NDBD]
# Hostname der ersten Storage-Node
HostName=node1.localnet
DataDir= /var/lib/mysql-cluster
 [NDBD]
# Hostname der zweiten Storage-Nodes
 HostName=node2.localnet
 DataDir=/var/lib/mysql-cluster
 [MYSQLD]
 [MYSQLD]

Sehr wichtig ist an dieser Stelle die Anzahl der Replicas, die MySQL halten soll, weil man darüber errechnen kann, wie viel RAM für den kompletten Cluster benötigt wird.

Folgende Formel, mit der man den Speicherverbrauch für jede Node errechnen kann soll dies veranschaulichen:
(Größe der Datenbank * Anzahl der Replicas * 1.1) / Anzahl der Storage Nodes

Natürlich ist es immer gut, wenn man möglichst viele Replicas in seinem Cluster hat – wirklichen Effekt macht eine Hohe Anzahl aber natürlich nur , wenn man auch möglichst viele Maschinen zur Verfügung hat. Es macht zum Beispiel keinen Sinn, dass das auf 2 Storage-Nodes mehr als 2 Replicas untergebracht werden, weil bei einem Ausfall einer Node natürlich direkt 2 Datenkopien verloren gehen.

Nun kann der Managementserver gestartet werden:

ndb_mgmd

Konfiguration der Storage bzw. SQL Server

Jetzt muss den Nodes noch mitgeteilt werden wer Ihr Managementserver ist:

Dafür die Datei /etc/my.cnf bzw. /etc/mysql/my.cnf öffnen und die bestehende Konfiguration durch folgende ersetzen:

[mysqld]
ndbcluster
# Hostname des Managementservers
ndb-connectstring=mgm.localnet
[mysql_cluster]
# Hostname des Managementservers
ndb-connectstring=mgm.localnet

Auf den beiden Storage Nodes muss nun das Verzeichnis welches im Managementserver konfiguriert wurde angelegt werden:

mkdir /var/lib/mysql-cluster

Der ndb-Daemon kann nun mit dem Argument –inital gestartet werden.
Außerdem wird der lokale MySQL Daemon gestartet.

cd /var/lib/mysql-cluster
ndbd --initial
/etc/init.d/mysql start

Damit ist bereits alles notwendige getan und der neue Cluster kann getestet werden.

Test des MySQL-ndb-Cluster

Auf der Maschine, auf der der Managementserver läuft kann man nun die Management-Console starten:

ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.101 (Version: 5.0.32, Nodegroup: 0, Master)
id=3 @192.168.1.102 (Version: 5.0.32, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.100 (Version: 5.0.32)

[mysqld(API)] 2 node(s)
id=4 @192.168.1.101 (Version: 5.0.32)
id=5 @192.168.1.102 (Version: 5.0.32)

Wie man hier sehen kann, haben sie unsere Nodes erfolgreich zum Mangement-Server verbunden.
Auch wenn es nun Theoretisch klappen sollte, wollen wir uns jetzt auch mal anschauen, ob das ganze wirklich funktioniert.

Auf einem der beiden SQL-Nodes kann man nun testweiste eine Tabelle erstellen:

mysql
create database cluster;
use cluster;
CREATE TABLE cluster_test (i INT) ENGINE=NDBCLUSTER;
INSERT INTO cluster_test () VALUES (1);
SELECT * FROM cluster_test;

Man sollte nun eine Zeile mit dem Wert 1 als Ergebnis erhalten.

Nun möchte man natürlich wissen, ob der Wert auch auf der anderen Node angekommen ist. Dort muss aber zuerst die Datenbank cluster erzeugt werden, weil der mysql-ndb-Cluster Tabellenorientiert arbeitet.

mysql
create database cluster;
use cluster;
SELECT * FROM cluster_test;

Das sollte nun genau den gleichen Wert zurückgeben, wie auf der anderen Node.

Da wir 2 Replicas auf 2 verschiedenen Nodes haben sollte nach einem Kompletten Absturz der Storage-Node immernoch der Datenbestand vorhanden sein.

Wir simulieren diesen Absturz mit:

killall -9 ndbd

Danach sollte immernoch der Wert 1 als Erbebnis der Abfrage zurückgegeben werden. Um die Storage-Node wieder zu aktivieren starten wir den Dienst mit

ndbd

Diesmal allerdings ohne das Argument –initial.

Backup von MySQL-ndb-Cluster-Tabellen

Damit bei einem kompletten Ausfall des Clusters nicht alle Daten verloren gehen, sollte man regelmäßig ein Backup der Daten auf Festplatte machen.
Dies kann man mit über die Management-Console erledigen:

ndb_mgm

Nach dem Start der Konsole wird mit: START BACKUP das Backup initiiert.
Dabei wird an alle Nodes der Befehl gesendet, dass sie eigenständig das Backup ausfiühren. Standardmäßig wird dabei im „Normalen“ Mysql-Data-Dir ein Verzeichnis BACKUP angelegt.
In diesem Verzeichnis werden die Daten dann abgelegt.

Waiting for completed, this may take several minutes
Node 2: Backup 1 started from node 1
Node 2: Backup 1 started from node 1 completed
 StartGCP: 919 StopGCP: 922
 #Records: 2050 #LogRecords: 0
 Data: 32880 bytes Log: 0 bytes

Jedes Backup erhält eine eindeutige ID, welche als Backup X gekennzeichnet ist.

Um ein Backup wieder herzustellen wird nicht die Management-Console verwendet. Dafür gibt es ein eigenenständiges Tool namens ndb_restore, welches auf den einzelnen Nodes ausgeführt wird.

ndb_restore -c mgm.localnet -n 1 -b backup_id

Es muss darauf geachtet werden, dass alle Nodes im Cluster die gleiche Backup-ID verwenden.

Weitere Information über Backup und Restore gibt es auf der offiziellen MySQL Dokumentationsseite.

Weitere Info’s über das MySQL-ndb-Cluster-Setup

Immer, wenn man in der config.ini des Management-Servers eine Änderung vornimmt, muss der gesamte Cluster heruntergefahren werden.

Das sollte man vor allem bedenken, wenn man die Cluster-Infrastruktur plant. So kann ein späteres hinzufügen von Storage-Nodes je nach Datenbank-Größe durch das Zurückspielen eines backups eine recht lange Ausfallzeit bedeuten.

Leider ist der MySQL-ndb-Cluster selbst nicht besonders Sicher was das Management angeht. Jeder, der die Möglichkeit hat sich zum Management-Server zu verbinden kann quasi alles damit machen inklusive herunterfahren. Aus diesem Grund sollte man den Management – Server möglichst hinter einer Firewall betreiben. Besser noch wäre es, wenn man den für das Management eine eigene Netzwerk-Karte verwendet, die sich in einem isolierten Netzwerk befindet.

Weiterführende Links

Offizielle Dokumentation
Offizielle Linkliste

Englisches Howto
Noch ein englisches Howto

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Technorati
  • MisterWong
  • del.icio.us
  • Digg
  • BlinkList
  • Furl