Seite wählen

NETWAYS Blog

Galera Clustering

Viele von Euch kennen es bestimmt schon, das Project Galera. Dieses vereint die wsrep API mit MySQL bzw. dessen Fork MariaDB. Zum aktuellen Zeitpunkt werden schon InnoDB und die XtraDB – Storage Engine unterstützt. Letzteres ist eine InnoDB-Erweiterung und wird von Percona entwickelt .

Galera-Cluster-logo-1024x195

Der Galera Cluster bringt folgende Features/Benefits mit:

  • Multi-Master schon von Haus aus
  • Synchrone Replication kein Datenverlust mehr auch keine Slave-Lags mehr (Boa wie mich das immer wieder nervt)
  • Eng gekoppelt Alle Knoten haben grundsätzlich denselben Status, keine Daten mehr die auseinander laufen
  • Multi-threaded Slave für bessere Performance der Nutzlast
  • Keine Master-Slave Failover Operationen nötig oder die Notwendigkeit eine virtuelle IP binden zu müssen
  • Hot Standby keine Downtimes während des Failover (denn es gibt keinen Failover mehr)
  • Automatic Node Provisioning kein manuelles Eingreifen mehr um Knoten in den Cluster zu bringen, die Daten werden automatisch auf den neuen Knoten repliziert
  • Supports InnoDB bald auch MyISAM (ist noch experimentell)
  • Transparent zur Application benötigt in Kombination mit GLB (oder HAproxy) keine Änderungen an der Applikation
  • Kein Aufspalten von Read und Write Operationen nötig (einfach Feuer auf das Ding 😉 ).

Galera ist somit die Lösung für Unternehmungen die ein hohes Aufkommen an Schreib- und Lese -Operationen in ihren Datenbanken erwarten. Die Main „Use Cases“ für den Betrieb des Galera Cluster sind eben kurz und gut, Skalierung der Schreib-Operationen, entkoppeln von Latenz Killern (wie zB. lange laufende Queries).
Die Entwickler des Forks MariaDB haben diese vielfältigen Möglichkeiten erkannt und bieten auf ihren Seiten Anleitungen zum Betrieb so eines Basic Setups an. Ebenfalls werden dort fertige Pakete für die Installation auf alle Major Linux Distributionen angeboten, somit fällt auch schon mal das Kompilieren weg.
Für das Setup können zwei Loadbalancing-Produkte zum Einsatz kommen: Zum einen der schon etwas in die Jahre gekommene (aber immer noch sehr beliebte) HAproxy und zum anderen GLB (Galera LoadBalancer), der eigens für Galera, aber außerhalb des Projekts entstanden ist. Wir bevorzugen für unsere Setups meist den GLB da dieser auch während der Laufzeit (wenn nötig auch automatisiert durch Skripte) konfiguriert bzw. gesteuert werden kann. Änderungen können somit im laufenden Betrieb und auch unter Last problemlos vorgenommen werden. Wenn es dann doch mal knapp wird, kann man im Betrieb ganz einfach einen weiteren Knoten hinzufügen 🙂

Graphite auf CentOS, RHEL oder Fedora installieren

Um Graphite auf einem CentOS, RHEL oder Fedora zu installieren, muss das EPEL Repository eingebunden werden. Danach können die zu Graphite gehörenden Pakete installiert werden:

yum install python-whisper python-carbon graphite-web

Graphite-web benötigt noch eine Datenbank um Session- und Benutzerinformationen zu speichern, zum Beispiel MySQL:

# mysql -u root -p
mysql> CREATE DATABASE graphite;
mysql> GRANT ALL ON graphite.* TO graphite@localhost IDENTIFIED BY 'graphite';

Damit die erstellte Datenbank von Graphite-web genutzt wird, muss in der Datei /etc/graphite-web/local_settings.py folgende Konfiguration hinzugefügt werden:

DATABASES = {
  'default': {
    'NAME': 'graphite',
    'ENGINE': 'django.db.backends.mysql',
    'USER': 'graphite',
    'PASSWORD': 'graphite',
    'HOST': 'localhost',
    'PORT': '3306',
  }
}

Der Datenbank fehlt jetzt nur noch das Schema und ein administrativer Benutzer, die mit folgendem Kommando angelegt werden:

# /usr/lib/python2.6/site-packages/graphite/manage.py syncdb

Zum Abschluss muss in der Datei /usr/lib/python2.6/site-packages/graphite/settings.py nur noch der SECRET_KEY konfiguriert werden.

Eric Lippmann
Eric Lippmann
CTO

Eric kam während seines ersten Lehrjahres zu NETWAYS und hat seine Ausbildung bereits 2011 sehr erfolgreich abgeschlossen. Seit Beginn arbeitet er in der Softwareentwicklung und dort an den unterschiedlichen NETWAYS Open Source Lösungen, insbesondere inGraph und im Icinga Team an Icinga Web. Darüber hinaus zeichnet er für viele Kundenentwicklungen in der Finanz- und Automobilbranche verantwortlich.

MySQL Cheat-Sheet

Da ich euch nicht mit Dingen wie SELECT, INSERT oder UPDATE nerven möchte, aber es auch immer wieder Dinge gibt die ich regelmäßig nachschlagen muss, hier mein persönliches MySQL-Cheat-Sheet in der Hoffnung das es euch auch helfen möge 😉
Mitschneiden der MySQL-Session, z. B. für Doku’s:
[user@host ~]$ mysql -u root -p --tee=/tmp/what_i_have_done.log
Logging to file '/tmp/what_i_have_done.log'
Enter password:

Anzeigen aller DB’s mit der jeweiligen Größe in MB:
SELECT table_schema "Data Base Name",
sum( data_length + index_length ) / 1024 /
1024 "Data Base Size in MB",
sum( data_free )/ 1024 / 1024 "Free Space in MB"
FROM information_schema.TABLES
GROUP BY table_schema ;

Auflisten aller Benutzer und deren Datenbankberechtigungen:
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges;

Klonen von Tablellen (keys und index werden nicht automatisch übernommen!):
CREATE TABLE AS SELECT * FROM ;

Erstellen / Wiederherstellen einer Replikation:
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO MASTER_HOST='myotherdbms', MASTER_USER='replication_user', MASTER_PASSWORD='nsa_will_never_guess', MASTER_LOG_FILE='mysql-bin.00000', MASTER_LOG_POS=414138;
START SLAVE;

Bei Fehlern in der Replikation auch gerne gesehen… Ignoriere eine Anzahl N an Fehlern:
SET GLOBAL sql_slave_skip_counter = N;

Sollte ich noch mehr coole Sachen finden, werde ich diese Liste selbstverständlich erweitern 🙂

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker und renoviert, baut und bastelt als Heimwerker an allem was er finden kann.

Die Macht von SQL-Triggern

Trigger sind SQL-Anweisungen die bei bestimmten Events wie zum Beispiel Inserts, Deletes oder Updates ausgelöst werden. Mit Triggern ist es beispielsweise möglich komplexe Tabellenconstraints in MySQL zu realisieren, die wesentlich mächtiger als die herkömmlichen MySQL-Constraints sind. In diesem Blogpost will ich euch zeigen wie man Trigger verwendet und von welchen Anwendungen man besser die Finger lassen sollte.

Change-Logs mithilfe von Triggern in MySQL

Ein wirklich prominentes Beispiel für den Einsatz von Triggern ist das implementieren eines Change-Logs. Nehmen wir an, wir haben eine Anwendung die Blogposts verwaltet und wollen jetzt dem Nutzer zusätzlich anzeigen wann Änderungen an den Posts durchgeführt wurden.
Ausgangspunkt ist folgende Tabelle die einfach nur die Artikel eines Blogs enthält:

CREATE TABLE article (
   `id` INT AUTO_INCREMENT PRIMARY KEY,
   `title` VARCHAR(255),
   `author` VARCHAR(255),
   `text` VARCHAR(4096)
);

Wir können jetzt einen Trigger erstellen, der bei jedem UPDATE einer Tabellenzeile eine bestimmte Aktion durchführt. Für jede Änderung an einem Blogpost wollen wir den Text vor der Änderung, den Änderungszeitpunkt, die Aktion und den betroffenen Post speichern. Dafür erstellen wir uns eine Tabelle die die Einträge enthalten soll und einen Trigger der die Tabelle befüllt:

CREATE TABLE article_change_log (
   `article_id` INT, `time` DATETIME, `action` VARCHAR(16), `old` VARCHAR(4096)
);
CREATE TRIGGER update_article_logger
   BEFORE UPDATE ON article
   FOR EACH ROW
   INSERT INTO article_change_log SET
      `article_id` = NEW.`id`, `action` = 'update', `time` = NOW(), `old` = OLD.`text`;

CREATE TRIGGER erstellt einen Trigger der bei UPDATE einer Zeile der Tabelle „Article“ ausgelöst wird. Der Trigger führt dann für jede betroffene Zeile eine bestimmte Anweisung durch. Die Bezeichner OLD und NEW können innerhalb dieser Anweisung verwendet werden um auf die Daten der Zeile vor und nach dem Update zuzugreifen.
Um einen vollständigen Logger zu implementieren müssten noch ähnliche Trigger für INSERT und DELETE erstellt werden. Damit ihr gleich etwas zum selbst ausprobieren habt und um den Rahmen dieses Blogposts nicht zu sprengen, überlasse ich euch diese Schritte allerdings selbst.

Vorsicht, unsichtbare Trigger!

Ein anderes Wort für „automatisches“ Verhalten ist beim Programmieren auch oft „unsichtbares“ Verhalten. Da Trigger automatisch Dinge tun ohne dass sie der Benutzer der Datenbank direkt angewiesen hat, sind sie auch immer eine eventuelle Fehlerquelle. Wenn möglich sollten Trigger keine Daten erstellen oder verändern, die von der eigentlichen Anwendungslogik erstellt werden, sondern immer nur eigene Datensätze verwalten. Damit kann sichergestellt werden, dass übersehene Trigger bei späteren Änderungen an der Anwendung zu keinem fehlerhaften Verhalten führen.

Speedup – Schnelles Kopieren mit netcat

Wer kennt das Problem nicht: Man will „mal eben“ seine 200GB große Datenbank auf einen neuen Server kopieren, aber die Zeit ist knapp.
Zugegeben, so oft kommt das dann doch nicht vor. Spätestens aber, wenn man einen neuen Slave zu seinem MySQL-Cluster hinzufügen will, kommt man nicht drum herum diese Daten zu kopieren. Mit den üblichen Tools wie rsync oder scp dauert der Vorgang allerdings relativ lange. Um den Kopiervorgang zu beschleunigen, greife ich hier auf  altbekannte Tools zurück: ’netcat‘ und ‚tar‘
Auf der Empfängerseite lassen wir netcat auf einem Port unserer Wahl lauschen. Alles was Empfangen wird, wird mit tar in das aktuelle Verzeichnis entpackt:

cd /var/lib/mysql
netcat -l -p 8888 | tar x

Die Senderseite verpackt die Daten wiederrum und schickt sie übers Netzwerk zum anderen Server

cd /var/lib/mysql
tar cf - ./* | netcat 192.168.2.1 8888

Wer möchte, kann abschliesend trotzdem noch mal einen rsync laufen lassen. Dieser sollte zwar nichts mehr kopieren, prüft aber zumindest ob wirklich alle Dateien synchronisiert wurden.
Besonders wenn die Server direkt miteinander Verbunden sind, wie es bei Clustern oft der Fall ist, erreicht man hier sehr gute Übertragungsraten. Netcat lässt sich auch schön mit ‚dd‘ verbinden. Ganze Festplatten übers Netzwerk zu kopieren ist dann kein Problem mehr.

Blerim Sheqa
Blerim Sheqa
COO

Blerim ist seit 2013 bei NETWAYS und seitdem schon viel in der Firma rum gekommen. Neben dem Support und diversen internen Projekten hat er auch im Team Infrastruktur tatkräftig mitgewirkt. Hin und wieder lässt er sich auch den ein oder anderen Consulting Termin nicht entgehen. Inzwischen ist Blerim als COO für Icinga tätig und kümmert sich dort um die organisatorische Leitung.