Dieser Artikel beschreibt das Setup eines High-Performance MariaDB Cluster mittels Azure Ubuntu VMs.
Wir wollen unseren Kunden die Sicherheit geben, dass ihre Websites und Services, zu jeder Zeit verfügbar sind.
Um das zu bewerkstelligen, setzt Anagram auf ein synchronisiertes Cluster System, um uns und unsere Kunden ruhig schlafen zu lassen.
Das Resultat des ersten Versuchs ist ein verteiltes und synchronisiertes Datenbanksystem mit vorgelagertem Loadbalancer. Die VMs nützen Software RAID um Harddiskausfälle kompensieren zu können. Die Verwendung einer Affinity Group gewährt die schnelle Kommunikation innerhalb des virtuellen Netzes, und die Availability Group verhindert den gleichzeitigen Ausfall mehrere VMs auf Grund von Wartungsarbeiten.
Auch wenn nicht Azure verwendet wird, werden wertvolle Informationen zum Setup eines High Performance Clusters gegeben.
Das Ganze ist eine Adaption dieses Artikels, jedoch umgesetzt für Ubuntu und ins Deutsche übersetzt. Zudem wurden Alternativen aufgezeigt, für Befehle die zum Zeitpunkt der Niederschrift nicht durch Azure unterstützt wurden.
Als kleiner Hint: Um den Cursor in der Powershell Console sichtbar zu machen, kann folgender Befehl verwendet werden
[Console]::CursorSize = 25
Ich würde das Ganze zudem noch ins Startupprofile aufnehmen. Dadurch muss das dann nicht immer wieder ausgeführt werden.
Azure Connect
azure login -u YOUR_AZURE_USER
Affinity Group erzeugen
Um die Latency zwischen des Virtuellen Servers und des Speichers zu minimieren, kann eine Affinitätsgruppe erstellt werden. Diese wird dann dem virtuellen Server und dem Speicher zugewiesen, wodurch garantiert ist, dass diese räumlich nah aneinander liegen.
azure account affinity-group create anagramcluster --location "West Europe" --label "Anagram Cluster"
Anschließend muss noch das virtuelle Netzwerk erstellt werden
(Da zu Beginn Informationen zum virtuellen Netzwerk abgefragt werden, funktioniert das nur, wenn bereits ein virtuelles Netzwerk existiert)
azure network vnet create --address-space 10.0.0.0 --cidr 8 --subnet-name dbcluster --subnet-start-ip 10.0.0.0 --subnet-cidr 24 --affinity-group anagramcluster anagramvnet
Die folgenden Befehle erwarten eine bestehenden Speicher. Am einfachsten löst man das über die Platform.
Ich habe den Speicher
anagramclusterstorage
genannt.
Nun haben wir unser erstes Setup:
Affinity-Group: anagramcluster
Virtual Network:anagramvnet / dbcluster
Storage: anagramclusterstorage
VM wählen
Auflisten aller Ubuntu Images
azure vm image list | findstr Ubuntu
Wir wählen die Ubuntu 14.10
b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_10-amd64-server-20141204-en-us-30GB
Anlegen der virtuellen Maschine
azure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --blob-url "https://anagramclusterstorage.blob.core.windows.net/vhds/clustertemplate-os.vhd" --vm-size Medium --ssh 22 --ssh-cert "C:/development/azure/azure.pem" --no-ssh-password a-vm-1 b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_10-amd64-server-20141204-en-us-30GB YOUR_AZURE_USER
Jetzt fügen wir noch 3 500GB Laufwerke hinzu
azure vm disk attach-new a-vm-1 512 https://www.anagram.atclusterstorage.blob.core.windows.net/vhds/a-vm-1-data-1.vhd
azure vm disk attach-new a-vm-1 512 https://www.anagram.atclusterstorage.blob.core.windows.net/vhds/a-vm-1-data-2.vhd
azure vm disk attach-new a-vm-1 512 https://www.anagram.atclusterstorage.blob.core.windows.net/vhds/a-vm-1-data-3.vhd
Software Installation auf dem virtuellen Rechner
Wir brauchen root Rechte.
sudo su
Installiere RAID Unsterstützung
(bei MDADM handelt es sich um Software RAID):
apt-get install mdadm
Die RAID0/stripe Konfiguration mit einem EXT4 Dateisystem erstellen
mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=3 /dev/sdc /dev/sdd /dev/sde
mdadm --detail --scan >> /etc/mdadm.conf
mkfs -t ext4 /dev/md0
Den Mount Point erzeugen
mkdir /mnt/data
Feststellen der UUID des neu erzeugten RAID Device
blkid | grep /dev/md0
z.B.. 74b5206e-ee98-4057-96df-29887d391d9f
/etc/fstab
bearbeiten, damit beim nächsten Reboot das Ganze wieder gemounted ist
UUID=
z.B.
UUID="3ef2895a-d6e8-4d45-8519-75eff134c9a7 /mnt/data ext4 defaults,noatime 1 2
Und Laufwerk einhängen
mount /mnt/data
MariaDB Installation
MariaDB Repository anlegen (mittels apt-get)
sudo apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu precise main'
Nun kann MariaDB installiert werden
sudo apt-get update
apt-get install mariadb-galera-server mariadb-client galera
(Bei der Deinstallation sollte zudem apt-get remove mysql-common ausgeführt werden)
Nun sollte auch der mysql Dienst installiert sein (und zumindest auf Ubuntu auch schon gestartet.) Das prüft man am besten mit
service mysql status
das Ganze sollte dann ungefähr so aussehen:
* /usr/bin/mysqladmin Ver 9.0 Distrib 5.5.41-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.
Server version 5.5.41-MariaDB-1~precise-wsrep-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 5 sec
Threads: 1 Questions: 80 Slow queries: 0 Opens: 54 Flush tables: 2 Open tables: 39 Queries per second avg: 16.000
Verwenden der RAID Platte für MariaDB
Daten kopieren
cp -avr /var/lib/mysql /mnt/data
rm -rf /var/lib/mysql
Rechte setzen
chown -R mysql:mysql /mnt/data && chmod -R 755 /mnt/data/
und einen Symlink auf die RAID Partition setzen
ln -s /mnt/data/mysql /var/lib/mysql
Nun sollte mysql korrekt als Service installiert sein, und mittels
service mysql start
service mysql stop
service mysql status
gestartet, gestoppt und der Status abgefragt werden.
Nachdem man nun den Dienst mysql gestartet hat, sollte die Sicherheit erhöht werden
mysql_secure_installation
Anlage eines Benutzer für Cluster Operationen
mysql -u root -p
GRANT ALL PRIVILEGES ON . TO 'cluster'@'%' IDENTIFIED BY 'p@ssw0rd' WITH GRANT OPTION; FLUSH PRIVILEGES;
exit
wobei das Passwort durch ein sichereres ersetzt werden sollte.
Stoppen des Service
service mysql stop
Firewall Einstellungen
Installieren von firewall-cmd
apt-get install firewalld
Öffnen der Ports
MySQL: firewall-cmd --zone=public --add-port=3306/tcp --permanent
GALERA: firewall-cmd --zone=public --add-port=4567/tcp --permanent
GALERA IST: firewall-cmd --zone=public --add-port=4568/tcp --permanent
RSYNC: firewall-cmd --zone=public --add-port=4444/tcp --permanent
Firewall neu starten
firewall-cmd --reload
Man kann überprüfen, ob der Port auch wirklich offen ist, mittels
firewall-cmd --zone=public --query-port=3306/tcp
Für die Einstellungen erstellen wir eine neue Datei unter
/etc/mysql/conf.d/cluster.cnf
[mysqld]
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0
Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options=”gcache.size=32G”
Galera Cluster Configuration
wsrep_cluster_name=”test_cluster”
wsrep_cluster_address=”gcomm://first_ip,second_ip,third_ip”
Galera Synchronization Congifuration
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:p@ssw0rd
Galera Node Configuration
wsrep_node_address=”this_node_ip”
wsrep_node_name=”this_node_name”
chkconfig existiert leider nicht für Ubuntu, die brauchbarste Alternative ist wohl
sudo apt-get install sysv-rc-conf
und dann
sudo sysv-rc-conf
und mysql deselektieren. (ich habe es für Level 3,4,5 deaktiviert)
TODO
Wir sollten die Einstellungen von Mysql noch für dieses Setup verbessern. To be continued!
waagent -deprovision
Image Capture durch das Azure Portal, damit dieses Setup nicht nochmals ausgeführt werden muss.
Das Image nennen wir
a-vm-1-template
Erzeugen des Cluster
azure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert "C:/development/azure/azure.pem" --no-ssh-password --ssh 22 --vm-name a-vm-1 a-vm-ha a-vm-1-template azure@anagram.at
Dadurch wird die erste Instanz unseres Clusters erzeugt. Hier erzeugen wir eine neue VM im virtuellen Netzwerk anagramvnet mit dem Subnet dbluster innerhalb des availability-set clusteravset. Die Rechnergröße wird medium sein und das Zertifikat azure.pem für das Login verwendet. Zudem wir noch ein Cloud-Endpoint mit dem Namen a-vm-ha angelegt.
Die Ausgaben sollten ungefähr so aussehen
info: Executing command vm create
+ Looking up image a-vm-1-template
+ Looking up virtual network
+ Looking up cloud service
info: cloud service a-vm-ha not found.
info: Using the virtual network's affinity group anagramcluster
+ Creating cloud service
+ Configuring certificate
+ Creating VM
info: vm create command OK
Jetzt erzeugen wir noch zwei weitere VMs, und verbinden diese mit dem Endpoint a-vm-ha.
azure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert "C:/development/azure/azure.pem" --no-ssh-password --ssh 23 --vm-name a-vm-2 --connect a-vm-ha a-vm-1-template azure@anagram.at
azure vm create --virtual-network-name anagramvnet --subnet-names dbcluster --availability-set clusteravset --vm-size Medium --ssh-cert "C:/development/azure/azure.pem" --no-ssh-password --ssh 24 --vm-name a-vm-3 --connect a-vm-ha a-vm-1-template azure@anagram.at
Nun müssen wir die IP-Adressen der gerade erzeugten VMs ausfindig machen. Das geschieht am Besten über das Portal.
Dann verbinden wir uns mit den drei erzeugten VMs und ändern folgende Einstellungen unter /etc/conf.d/cluster.cnf
[mysqld]
query_cache_size=0
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
query_cache_type=0
bind-address=0.0.0.0
Galera Provider Configuration
wsrep_provider=/usr/lib/galera/libgalera_smm.so
#wsrep_provider_options=”gcache.size=32G”
Galera Cluster Configuration
wsrep_cluster_name=”a-vm-ha”
wsrep_cluster_address=”gcomm://10.10.0.4,10.10.0.5,10.10.0.6″
Galera Synchronization Congifuration
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:PW
Galera Node Configuration
wsrep_node_address=”10.10.0.4″
wsrep_node_name=”a-vm-1″
Anschließend müssen wir noch den Inhalt von /etc/conf.d/debian.cnf auf a-vm1 und a-vm-2 kopieren (jeweils in das gleich File)
Aktuell sollte keiner der drei DB-Server laufen, deshalb können wir nun unseren Cluster starten.
sudo service mysql start --wsrep-new-cluster
Der Parameter –wsrep-new-cluster legt fest, dass es sich hier um einen neuen Cluster handelt. Alle anderen Clusterteilnehmer werden diese quasi “Joinen”, würde man das weglassen, so schlägt das Kommando fehl, da kein anderer Clusternode vorhanden ist.
Alle weiteren VMs können dann mittels
sudo service mysql start
gestartet werden.
Load Balancing
Zu Beginn haben wir eine ein Availability Set angelegt, dem wir die virtuellen Maschinene zugewiesen haben. Dadurch ist garantiert, dass Wartungsarbeiten nicht an zwei Maschinen gleichzeitig stattfinden. Nun erfüllen wir auch die Bedingungen für das Azure Service Level Agreement (SLA).
Jetzt aktivieren wir noch den Azure Loadbalancer.
Die Definition des Kommandos lautet dabei folgendermaßen
azure vm endpoint create-multiple ::::::
azure vm endpoint create-multiple a-vm-1 3306:3306:tcp:false:MySQL:tcp:3306
azure vm endpoint create-multiple a-vm-2 3306:3306:tcp:false:MySQL:tcp:3306
azure vm endpoint create-multiple a-vm-3 3306:3306:tcp:false:MySQL:tcp:3306
Test
Hat alles richtig funktioniert, so sollten nun alle Daten zwischen den drei Clusternodes synchronisiert werden.
Zudem läuft die Verbindung zu a-vm-ha.cloudapp.net nun über den Azure Loadbalancer und wählt, je nach Last, eine der drei Instanzen.
Die Verbindung zu a-vm-ha.cloudapp.net sollte nun auch durch die verschiedenen Clients möglich sein.