Ubuntu 18.04 - Galera-Cluster mit MariaDB installieren (encrypted Replication)
Verwenden Sie die Dokumentation nur noch bei gerechtfertigten Anwendungsfällen.
Vorwort
Diese Dokumentation beschreibt den Installationsvorgang von einem Galera-Cluster mit MariaDB, bestehend aus drei Nodes.
Bitte vergewissern Sie sich, dass Ihr System über die nötigen Voraussetzungen verfügt, wie in der Infobox beschrieben. Weiterhin sind Grundkenntnisse im Umgang mit Linux erforderlich, da die Vorgehensweise, wie sie hier beschrieben ist, in manchen Teilen abweichen kann. Kein System ist wie das Andere. Die Dokumentation wurde sorgfältig von mir geprüft. Dennoch kann ich keinerlei Haftung für Schäden an Ihrem System oder eine Gewährleistung übernehmen. Bitte verwenden Sie diese Dokumentation auf eigene Gefahr.
Verwendete Software:
Voraussetzungen:
Weitere, empfohlene Dokumentationen:
Was soll erreicht werden?
Diese Dokumentation beschreibt die Installation eines Galera-Clusters mit MariaDB. Das Cluster wird aus insgesamt drei gleichberechtigten Nodes bestehen. Die Replikation der Datenbanken wird ausschliesslich verschlüsselt erfolgen.
Was muss ich in der Konfiguration anpassen?
Einige Parameter müssen auf Ihre Umgebung angepasst werden. Im Verlauf dieser Dokumentation müssen Sie nur die Parameter anpassen, die in der nachfolgenden Tabelle aufgelistet sind. Sie können also ganz einfach durch die Funktion "Suchen und Ersetzen" (STRG + H), die Konfigurationsdateien auf Ihre Umgebung anpassen. Das Gleiche gilt für auszuführende Kommandos.
Folgende Parameter werden verwendet:
Wert | Hinweis | |
---|---|---|
Node01: | ||
Hostname | galera-node01.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
IPv4-Adresse | 192.0.2.101 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
Node02: | ||
Hostname | galera-node02.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
IPv4-Adresse | 192.0.2.102 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
Node03: | ||
Hostname | galera-node03.example.tld | Ersetzen Sie diesen Wert durch den FQDN Ihres Servers. |
IPv4-Adresse | 192.0.2.103 | Ersetzen Sie diesen Wert durch die IP-Adresse Ihres Servers. |
Domain | example.tld | Ersetzen Sie diesen Wert durch Ihre Domain. |
MySQL: | ||
root | SicheresRootPasswortVerwenden! | MySQL-Passwort für den Benutzer root . Ersetzen Sie dieses Passwort durch ein eigenes sicheres Passwort.
|
mariabackup | SicheresRootPasswortVerwenden! | MySQL-Passwort für den Benutzer mariabackup . Ersetzen Sie dieses Passwort durch ein eigenes sicheres Passwort.
|
Konfigurations-Dateien werden immer nach dem gleichen Muster erstellt. Unter jeder Datei, die eine Anpassung erfordert, finden Sie die nötigen Hinweise.
Dateien, die zwar Parameter aber keine eigentliche Konfiguration enthalten, werden nach dem vorgegebenen Syntax erstellt.
Beispiel:
Im folgenden Beispiel ist die Datei /home/beispiel.conf
zu erstellen und der Parameter domain
anzupassen.
Erstellen Sie eine neue Datei /home/beispiel.conf
mit folgendem Inhalt:
# nano /home/beispiel.conf
url = www.twlnet.com
content = Dokumentationen
domain = example.com
owner = root
# beispiel.conf
[...]
domain = example.com
[...]
Im folgenden Beispiel ist die Datei /home/beispiel.map
mit einer Liste Ihrer E-Mail-Adressen zu erstellen.
Erstellen Sie eine neue Datei /home/beispiel.map
nach folgendem Syntax:
# nano /home/beispiel.map
benutzer1@example.com
benutzer2@example.com
benutzer3@example.com
Nodes vorbereiten
Grundsätzlich kann das Cluster aus einer beliebigen Anzahl Nodes bestehen. Es sollte aber immer aus einer ungeraden Anzahl Nodes bestehen, also 3, 5, 7, usw.
Root-Rechte einräumen
Während der gesamten Dokumentation werden Root-Rechte benötigt. Um auf das Voranstellen von sudo
zu verzichten, verschaffen Sie sich für die gesamte Sitzung erhöhte Rechte mit:
# sudo -i
Update durchführen
Bringen Sie den Server auf den aktuellen Patchstand:
# apt update && apt upgrade
Hostname vergeben
Vergeben Sie den hostname
für Node01:
# hostnamectl set-hostname galera-node01.example.tld
Editieren Sie die Datei /etc/hosts
und ändern Sie den Hostnamen nach folgendem Syntax:
# nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 galera-node01.example.tld galera-node01
[...]
hostname
für jedes weitere Node.Also
galera-node02.example.tld
für Node02, galera-node03.example.tld
für Node03, usw.
Software herunterladen und installieren
Fügen Sie das MariaDB-Repository hinzu:
# apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' # add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/ubuntu focal main' # apt update
Installieren Sie MariaDB:
# apt install mariadb-server mariadb-backup
SSL-Zertifikate einrichten
Damit die Replikation der Datenbank verschlüsselt durchgeführt werden kann, sind eine CA und entsprechende TLS-Zertifikate erforderlich.
Galera-Cluster unterscheidet zwischen zwei Replikationsmethoden:
- IST (Incremental State Transfer)
Die inkrementelle Replikation erfolgt bei jeder Änderung einer Datenbank. Diese Methode ist sehr schnell und wird im laufenden Betrieb angewendet. Die Änderung ist erst verfügbar, wenn alle Cluster-Nodes den gleichen Stand haben.
- SST (Snapshot State Transfer)
Diese Methode überträgt den gesamten Datenbestand eines Nodes und erfolgt z.B. beim Hinzufügen eines neuen Nodes oder wenn der Stand eines Nodes zu stark vom aktuellen Stand des Clusters abweicht.
Besonders beim SST wird deutlich, dass eine Verschlüsselung obligatorisch ist.
Ohne Veschlüsselung kann ein möglicher Angreifer durch einfaches Mitschneiden des Netzwerkverkehrs in den Besitz des gesamten Datenbestands kommen.
CA erstellen
Erstellen Sie zunächst eine CA auf dem Node01.
Diese CA wird zum Signieren bzw. Erstellen der Server- und Client-Zertifikate verwendet.
Anschliessend wird die CA auf alle anderen Nodes kopiert, damit auf jedem Node ein eigenes Server- und Client-Zertifikat erstellt werden kann.
Erstellen Sie einen Ordner für die Zertifikate und wechseln Sie in diesen:
# mkdir /etc/mysql/certs # cd /etc/mysql/certs
Erstellen Sie die CA:
# openssl genrsa 2048 > ca-key.pem # openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll.
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: galera-cluster.example.tld
Email Address []:
Passen Sie die Berechtigungen auf den Private Key
an:
# chmod 600 ca-key.pem
Kopieren Sie die CA-Dateien auf alle anderen Nodes:
# scp -r /etc/mysql/certs root@192.0.2.102:/etc/mysql # scp -r /etc/mysql/certs root@192.0.2.103:/etc/mysql # [...]
Server-Zertifikat erstellen
Führen Sie die folgenden Schritte auf allen Nodes durch.
Erstellen Sie zunächst den Signing-Request:
# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll. Wichtig ist hierbei nur der Common Name
. Geben Sie als Common Name
den Servernamen ohne Domain an.
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: galera-node01
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Erhöhen Sie den Zähler im Common Name
für jedes weitere Node.
Also galera-node02
für Node02, galera-node03
für Node03, usw.
Erstellen Sie den RSA-Key:
# openssl rsa -in server-key.pem -out server-key.pem
Signieren Sie abschliessend das Server-Zertifikat:
# openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Client-Zertifikat erstellen
Führen Sie die folgenden Schritte auf allen Nodes durch.
Erstellen Sie zunächst den Signing-Request:
# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Geben Sie die Informationen ein, die das Zertifikat enthalten soll. Wichtig ist hierbei nur der Common Name
. Geben Sie als Common Name
den Servernamen ohne Domain an.
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []: galera-node01
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Erhöhen Sie den Zähler im Common Name
für jedes weitere Node.
Also galera-node02
für Node02, galera-node03
für Node03, usw.
Erstellen Sie den RSA-Key:
# openssl rsa -in client-key.pem -out client-key.pem
Siginieren Sie abschliessend das Server-Zertifikat:
# openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Überprüfen Sie die Zertifikate:
# openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem server-cert.pem: OK client-cert.pem: OK
Passen Sie die Zugriffsrechte auf die Dateien an:
# chown -R mysql:mysql /etc/mysql/certs/
Node01 einrichten
Sicherheit erhöhen und MySQL-Root-Passwort vergeben
Vergeben Sie ein Root-Passwort und die Zugriffsrechte für den MariaDB-Server.
Ersetzen Sie SicheresRootPasswortVerwenden!
durch ein eigenes Passwort.
# mysql_secure_installation [...] Enter current password for root (enter for none): "Enter" [...] Switch to unix_socket authentication [Y/n] n [...] Change the root password? [Y/n] y New password: SicheresRootPasswortVerwenden! Re-enter new password: SicheresRootPasswortVerwenden! [...] Remove anonymous users? [Y/n] y [...] Disallow root login remotely? [Y/n] n [...] Remove test database and access to it? [Y/n] y [...] Reload privilege tables now? [Y/n] y [...] Thanks for using MariaDB!
SST-Benutzer anlegen
Verbinden Sie sich mit dem MySQL-Server:
# mysql -u root -p
Erstellen Sie einen Benutzer mariabackup
und räumen Sie dem Benutzer die benötigten Rechte ein.
Ersetzen Sie SicheresPasswortVerwenden!
durch ein eigenes Passwort.
CREATE USER 'mariabackup'@'localhost' IDENTIFIED BY 'SicheresPasswortVerwenden!';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mariabackup'@'localhost';
FLUSH PRIVILEGES;
QUIT;
Konfigurations-Dateien erstellen
Galera konfigurieren
Erstellen Sie die Datei /etc/mysql/conf.d/galera.cnf
mit folgendem Inhalt:
# nano /etc/mysql/conf.d/galera.cnf
# galera.cnf
[mysqld]
bind-address = 192.0.2.101
binlog_format = ROW
default-storage-engine = innodb
innodb_autoinc_lock_mode = 2
query_cache_size = 0
query_cache_type = 0
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 256M
innodb_buffer_pool_instances = 1
## Galera settings ##
wsrep_provider = "/usr/lib/galera/libgalera_smm.so"
wsrep_provider_options = "socket.ssl_key=/etc/mysql/certs/server-key.pem;socket.ssl_cert=/etc/mysql/certs/server-cert.pem;socket.ssl_ca=/etc/mysql/certs/ca-cert.pem;gcs.fc_limit=80;gcs.fc_factor=0.8"
wsrep_cluster_name = "galera-cluster"
wsrep_cluster_address = "gcomm://192.0.2.101,192.0.2.102,192.0.2.103"
wsrep_node_name = "galera-node01"
wsrep_node_address = "192.0.2.101"
wsrep_sst_method = mariabackup
wsrep_sst_auth = mariabackup:SicheresPasswortVerwenden!
wsrep_sst_donor = galera-node01,galera-node02,galera-node03
wsrep_on = ON
wsrep_certify_nonPK = 1
## CPU-Options ##
wsrep_slave_threads = 16
wsrep_debug = 0
[sst]
encrypt = 3
tkey = /etc/mysql/certs/server-key.pem
tcert = /etc/mysql/certs/server-cert.pem
# galera.cnf
[...]
bind-address = 192.0.2.101
[...]
wsrep_cluster_address = "gcomm://192.0.2.101,192.0.2.102,192.0.2.103"
wsrep_node_name = "galera-node01"
wsrep_node_address = "192.0.2.101"
[...]
wsrep_sst_auth = mariabackup:SicheresPasswortVerwenden!
wsrep_sst_donor = galera-node01,galera-node02,galera-node03
[...]
MariaDB konfigurieren
Benennen Sie zunächst die /etc/mysql/my.cnf
um, damit Sie eine Sicherheitskopie der Original-Datei haben:
# mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
Erstellen Sie eine neue Datei /etc/mysql/my.cnf
mit folgendem Inhalt:
# nano /etc/mysql/my.cnf
# my.cnf
[client]
## Basic
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4
## SSL-Config
ssl-ca = /etc/mysql/certs/ca-cert.pem
ssl-cert = /etc/mysql/certs/client-cert.pem
ssl-key = /etc/mysql/certs/client-key.pem
[mysqld]
## Basic
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
server-id = 1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip_name_resolve
skip-external-locking
performance_schema = ON
## SSL-Config
ssl-ca = /etc/mysql/certs/ca-cert.pem
ssl-cert = /etc/mysql/certs/server-cert.pem
ssl-key = /etc/mysql/certs/server-key.pem
## Logging
log-bin = mysql-bin
expire_logs_days = 21
log_warnings = 1
log_error = /var/log/mysql/mariadb.err
#general_log
#general_log_file = /var/log/mysql/mariadb.log
slow_query_log
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time=5
[mysqldump]
quick
max_allowed_packet = 128M
[mysql]
no-auto-rehash
[mysqlhotcopy]
interactive-timeout
!include /etc/mysql/mariadb.cnf
!includedir /etc/mysql/conf.d/
MariaDB Feinabstimmung
Grundsätzlich können Sie MariaDB mit den nachfolgenden Einstellungen verwenden.
Allerdings sind Performance-Einstellungen eines SQL-Servers sehr individuell und hängen nicht nur von der Hardware-Austattung des verwendeten Servers ab, sondern auch wesentlich von der Anzahl, Größe und Frequentierung der einzelnen Datenbanken.
Die nachfolgenden Einstellungen (und auch die Standard-Einstellungen von MariaDB!) sind daher nur ein Richtwert.
Um die gesamte Leistungsfähigkeit Ihres Systems auszuschöpfen, kann Ihnen das Perl-Script MySQLTuner von Major Hayden sehr behilflich sein.
Die folgende Datei enthält Einstellungen für ein kleines MariaDB-Node mit 4 CPU-Kernen und 8GB RAM.
Erstellen Sie eine neue Datei /etc/mysql/conf.d/mysqld_tuning.cnf
mit folgendem Inhalt:
# nano /etc/mysql/conf.d/mysqld_tuning.cnf
# mysqld_tuning.cnf
[mysqld]
## Tuning
interactive_timeout = 300
wait_timeout = 300
key_buffer_size = 256K
max_allowed_packet = 16M
table_open_cache = 600
table_definition_cache = 600
sort_buffer_size = 2M
net_buffer_length = 16K
read_buffer_size = 128K
read_rnd_buffer_size = 128K
join_buffer_size = 32M
thread_cache_size = 128
max_connections = 100
max_heap_table_size = 256M
tmp_table_size = 256M
innodb_file_per_table = 1
innodb_log_file_size = 32M
Node02 und Node03 einrichten
Die Konfiguration der weiteren Nodes ist fast identisch mit der des ersten Nodes (Node01). Lediglich IP-Adresse und Node-Name müssen angepasst werden.
Die Konfigurations-Dateien können also einfach vom ersten Node kopiert und anschliessend editiert werden.
Kopieren Sie die Dateien /etc/mysql/my.cnf
und /etc/mysql/conf.d/galera.cnf
auf die weiteren Nodes:
# scp -r /etc/mysql/my.cnf root@192.0.2.102:/etc/mysql # scp -r /etc/mysql/conf.d/galera.cnf root@192.0.2.102:/etc/mysql/conf.d # scp -r /etc/mysql/conf.d/mysqld_tuning.cnf root@192.0.2.102:/etc/mysql/conf.d
# scp -r /etc/mysql/my.cnf root@192.0.2.103:/etc/mysql # scp -r /etc/mysql/conf.d/galera.cnf root@192.0.2.103:/etc/mysql/conf.d # scp -r /etc/mysql/conf.d/mysqld_tuning.cnf root@192.0.2.103:/etc/mysql/conf.d
Passen Sie folgende Parameter in der Datei /etc/mysql/conf.d/galera.cnf
auf den weiteren Nodes an:
# nano /etc/mysql/conf.d/galera.cnf
# galera.cnf
[...]
bind-address = 192.0.2.101
[...]
wsrep_node_name = "galera-node01"
wsrep_node_address = "192.0.2.101"
[...]
Cluster erstellen
Beenden Sie MariaDB auf allen Nodes:
# service mariadb stop
Erstellen Sie ein neues Cluster auf Node01:
# galera_new_cluster
Überprüfen Sie die Clustergrösse.
Die Clustergrösse sollte jetzt 1 betragen:
# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Enter password:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
Starten Sie MariaDB auf Node02 um das Node dem Cluster hinzuzufügen:
# service mariadb start
Überprüfen Sie die Clustergrösse.
Die Clustergrösse sollte jetzt 2 betragen:
# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Enter password:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
Starten Sie MariaDB auf Node03 um das Node dem Cluster hinzuzufügen:
# service mariadb start
Überprüfen Sie die Clustergrösse.
Die Clustergrösse sollte jetzt 3 betragen:
# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Enter password:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
(Optional) MariaDB sys Schema installieren
Klonen Sie das Git-Repository 'mariadb-sys' nach /usr/local/src
:
# git clone https://github.com/FromDual/mariadb-sys.git /usr/local/src/mariadb-sys
Wechseln Sie in den Ordner /usr/local/src/mariadb-sys
und importieren Sie die Datei sys_10.sql
:
# cd /usr/local/src/mariadb-sys # mysql -u root -p < ./sys_10.sql