wall < "MySQL NDB Cluster: mehrere ndbd-Instanzen auf einem Host"

Broadcast message from spillerm@unixe.de (pts/1) (Mo Jun 01 10:03:06 2015):
4
Diesen Beitrag schrieb ich vor 4 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

Weitere Beiträge der Artikelserie »MySQL NDB Cluster« findest du an dieser Stelle.

Unser MySQL NDB Cluster besteht aus mehreren Servern: aus zwei management nodes und aus zwei data nodes. In unserem Setup stellen die data nodes sowohl jeweils einen mysqld zur Verfügung als auch den ndbd — es kann aber sinnvoll sein, auch für jede Aufgabe eigene Hosts zur Verfügung zu stellen.

mysqld ist mysqld, wie man ihn kennt — er lauscht auf Port 3306, er wird über die my.cnf konfiguriert, hat ein Socket, ein Logfile und so weiter. Das Besondere am Cluster sind die ndbd-Instanzen, die Datenknoten, auf denen jene Tabellen abgelegt werden, die ENGINE=NDBCLUSTER verwenden: mit NoOfReplicas=2 haben wir definiert, dass sie paarweise repliziert werden — jeweils zwei ndbd-Instanzen bilden eine node group — und alle Schreiboperationen werden auf allen Datenknoten immer synchron durchgeführt. Das heisst: zu jedem Zeitpunkt ist der Datenbestand auf jedem Datenknoten identisch.

ClusterGreenMacProNdbdEs ist möglich, auf einem Host mehrere Instanzen des ndbd laufen zu lassen — pro Core eine. Da diese Instanzen sich paarweise replizieren sollte man peinlich darauf achten, dass sie sinnvoll auf die Hosts verteilt werden — sonst kann der Absturz eines einzelnen ndbd das ganze System zum Stillstand bringen. Meine beiden data nodes verfügen jeweils über vier Cores und 8GB RAM, und für den Anfang entschied ich, auf jedem zwei Instanzen des ndbd (und halt den mysqld) laufen zu lassen. Mit dieser Konfiguration schoss sich mein datanode1 dann gleich mal tot (Error data: DBTUP could not allocate memory for TableDescriptor) — sollen mehr Ressourcen zur Verfügung gestellt werden, muss man dem System mehr Ressourcen zur Verfügung stellen. Oder so ;) Jedenfalls erhöhte ich das RAM für meine data nodes auf 12GB (!) und passte die config.ini ein weiteres Mal an.

Nach vielen Spielereien entschied ich mich dazu, meine Test-Datenbanken alle zu trashen und bei Null zu beginnen. Dazu sind die folgenden Schritte nötig:

  • Auf allen data nodes die ndbd-Prozesse beenden.
  • Auf allen data nodes die mysqld-Prozesse beenden.
  • Auf allen management nodes die ndb_mgmd-Prozesse beenden.
  • Prüfen, dass auch wirklich alle Prozesse überall beendet sind!
  • Auf allen data nodes nacheinander
    1. den Inhalt von /var/lib/mysql-cluster löschen: $ rm -rf /var/lib/mysql-cluster/*
    2. das Verzeichnis für die Datenbanken neu anlegen und die Rechte setzen: $ mkdir /var/lib/mysql-cluster/data && chown mysql:mysql /var/lib/mysql-cluster/data
    3. die grundlegenden Datenbanken installieren: $ cd /usr/local/mysql && ./scripts/mysql_install_db
    4. die Zugriffsrechte dieser Datenbanken setzen: $ chown -R mysql:mysql /var/lib/mysql-cluster/data
    5. den mysqld starten: $ /etc/init.d/mysql.server start
    6. den mysqld absichern: $ cd /usr/local/mysql && ./bin/mysql_secure_installation
    7. den mysqld beenden: $ /etc/init.d/mysql.server stop
  • auf den management nodes den Inhalt von /var/lib/mysql-cluster ausser der config.ini löschen: $ rm -rf /var/lib/mysql-cluster/ndb*

12GB RAM!Das System kann nun wieder durchgestartet werden:

  • Im ersten Schritt lege ich den management nodes die neue config.iniGITHUB (nach /var/lib/mysql-cluster)
  • und starte sie dann durch; das --initial muss nicht mitgeschickt werden, wenn man ohnehin bei Null anfängt, es schadet aber auch nicht: $ ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster
  • Wenn diese fehlerfrei laufen (Logfiles beachten!), können auf den data nodes die ndbd gestartet werden; der Aufruf ndbd --initial muss nun doppelt getätigt werden, denn auf jedem Knoten soll der Dienst ja auch doppelt laufen!
  • Wenn auch diese sich korrekt gemeldet haben, kann im letzten Schritt der mysqld auf beiden data nodes den Betrieb aufnehmen: $ /etc/init.d/mysql.server start
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	4 node(s)
id=10	@10.0.2.10  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)
id=11	@10.0.2.11  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=12	@10.0.2.10  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 1)
id=13	@10.0.2.11  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 1)
 
[ndb_mgmd(MGM)]	2 node(s)
id=1	@10.0.2.20  (mysql-5.6.24 ndb-7.4.6)
id=2	@10.0.2.21  (mysql-5.6.24 ndb-7.4.6)
 
[mysqld(API)]	2 node(s)
id=20	@10.0.2.10  (mysql-5.6.24 ndb-7.4.6)
id=21	@10.0.2.11  (mysql-5.6.24 ndb-7.4.6)

MarianneFunktioniert alles? Meine data nodes ziehen nun im Leerlauf knappe 7GB RAM. Die node groups replizieren sich über Kreuz. Fällt einer der data nodes aus, fehlt also beiden node groups sozusagen ein »Partner«, das System wird aber weiterlaufen. Sobald diese beiden ndbd wieder verfügbar sind, werden sie von einem der management nodes sozusagen auf Stand gebracht und nehmen, sobald sie synchronisiert sind, den Dienst wieder auf. Und im nächsten Schritt beschäftige ich mich dann damit, wie ich meine Dienste überwachen könnte…

4