MySQL-NDB-Cluster Installation und Konfiguration (HOWTO)

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
Verwandte Artikel
- Bash-Prompt ändern
- Der eigene “über ein Webinterface konfigurierbare Mailserver” in 10 Minuten, dank CpVES
- Nested Sets - oder wie man Baumstrukturen effizient in Datenbanken hält
- Blogtipps für Einsteiger: Programmiert euer eigenes Wordpress-Plugin
- Der Traum von der eigenen Suchmaschine
Beitrag: 9. Juli 2007 (06:26 Uhr) von juniperus
Kategorien: Linux, Server, SQL, Tutorials, Software, Allgemein
Tags: cluster, howto, linux, mysql, ndb, server, tutorial
Permanentlink: MySQL-NDB-Cluster Installation und Konfiguration (HOWTO)
Kommentarfeed abonnieren
Beitrag Kommentieren
TrackBack-URL







10 Kommentare zu “MySQL-NDB-Cluster Installation und Konfiguration (HOWTO)”
Das ist mal ganz ordentlich…
Ich hab’s nicht hinbekommen.
Hab 3 (echte) Rechner benutzt.
Immer, wenn ich die Nodes gestartet habe und in der MGM Konsole nachschauen will, ob’s geklappt hat bekomme ich die Meldung:
not connected, accepting connect from 192.168.1.[1/2/3]
Vielen Dank
Hallo,
Irgend etwas scheint mit der Verbindung der einzelnen Nodes zum Management-Server nicht zu klappen. Poste doch bitte mal Deine config.ini und die my.cnf der Nodes!
Gruss
Nochmal ich - ich habs jetzt hinbekommen. Das Problem war, dass die Rechner gar nicht im 192.168.1er Netz sondern im 192.168.0er Netz waren. ^^
Ich kanns kaum glauben, aber es funzt absolut Prima.
Hab direkt mal die einzelnen Nodes abgeschossen - und noch alles da. Werd das jetzt mal noch etwas ausgiebiger testen.
Gratulation zu diesem genialen Tutorial!
Es hat alles einwandfrei funktioniert, schade ist nur das manche Tabellentypen noch nicht unterstützt werden.
Habe nun solch ein Cluster seid über einem Jahr im harten Einsatz. Fahre ca. 50 Mill. Transaktionen pro Tag. Mit insgesammt 4 Mill. Datensätzen in 12 Datenbanken.
und
heute ist es schon 5 mal verreckt ohne ersichtlichen Grund und zwar total.
Jetzt heule ich erst mal ne Runde…. und Google etwas.
Aber sonst kann ich es nur empfehlen. es Funzt echt gut…. normalerweise.
Gruß Alfa
Hi. Ein super HOWTO, muss ich schon sagen.
Ich habe es genauso konfiguriert wie beschrieben und es lief auf Anhieb.
Was mir aufgefallen ist, egal welche Rechner ich herunterfahre - also z.B. den gesamten Cluster, nach dem Neustart sind alle Daten wieder da, sprich ich musste keine Daten wiederherstellen.
[…] Forge – offizielle Community-WebsiteMySQL-HandbuchInformation zu MySQL auf sql-info.deMySQL NDB-Cluster HowToMySQLfs mit MySQL NDB-Cluster als verteiltes Dateisystem HowTo Kategorien: Datenbankmanagementsystem […]
[…] Einen mySQL-NDB-Cluster hier […]
Boah, was für ein Howto. Vielen Dank für diese Möglichkeit. Habe nie dran gedacht es so zu machen. Das hat mir einiges an Zeit und viel viel Arbeit erspart. Fast Zauberei