• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • Welcome to the world of Anagram Engineering
  • Who we are
  • Leistungen
    • Web Development
    • Embedded Systems
  • References
    • Customers
    • Webdesign & Webapps
    • Mobile Apps
    • Embedded Systems
    • Cloud Apps
  • News

Search

Anagram Engineering

Webdesign und Softwarelösungen aus Vorarlberg. Ihr Partner für innovative Lösungen rund ums Internet. Full Service Agentur.

January 29, 2015 by Harald

Wir nehmen unseren Job ernst: High-Performance and Availability MariaDB Cluster

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.

Filed Under: News

About Harald Entner

Since january 2013 Harald is CEO of Anagram Engineering.

After he has finished his study in computer science at the Technical Universicty of Vienna he worked in Vienna, Munich and Dornbirn as software engineer, software architect and system developer.

Today he enjoys travelling, learning new languages and frameworks, systems, environments and tries to educate hilmself within these domains.

Primary Sidebar

Recent Posts

  • Zumtobel PROset App | Rebranding February 3, 2021
  • Speed matters July 2, 2019
  • Vienna calling June 18, 2019
  • Resclite Pro April 12, 2019
  • Zumtobel PROset App April 10, 2019

Legal

  • AGB
  • Impressum

Footer

Contact US

Stiegstrasse 24
6830 Rankweil

+43 650 925 62 64

About US

Anagram Engineering develops software for Web, Mobile, Tablet and embedded devices.

Learn More

© 2025 · Anagram Engineering

  • terms & conditions
  • impress
  • customers
  • References
  • who we are
Manage Cookie Consent
Wir benützen Cookies um unsere Website und unsere Services zu optimieren.
Funktional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistik
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage vendors Read more about these purposes
Einstellungen
{title} {title} {title}
  • Deutsch
  • English