Ubuntu 20.04 - Galera-Cluster mit MariaDB installieren (encrypted Replication)

Aus Twilight-Networks Wiki
Wechseln zu:Navigation, Suche

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.


Ubuntu 20.04 - Galera-Cluster mit MariaDB installieren (encrypted Replication)
Stand: 11/2022


MariaDB-logo.png


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
beispiel.conf
url		= www.twlnet.com
content	= Dokumentationen

domain	= example.com
owner	= root
Anzupassende Parameter:
# 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
beispiel.map
benutzer1@example.com
benutzer2@example.com
benutzer3@example.com









Nodes vorbereiten

Für das Galera-Cluster verwenden wir insgesamt drei Nodes.

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.

Bereiten Sie zunächst drei Server entsprechend der nachfolgenden Anleitung vor.



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
/etc/hosts
127.0.0.1       localhost
127.0.1.1       galera-node01.example.tld galera-node01
[...]


Erhöhen Sie den Zähler im 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:

# curl -fsSL https://mariadb.org/mariadb_release_signing_key.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mariadb.gpg  > /dev/null
# echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/mariadb.gpg] http://mirror.mariadb.org/repo/10.6/ubuntu/ focal main | sudo tee /etc/apt/sources.list.d/mariadb.list
# 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
# 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
Anzupassende Parameter:
# 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
/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
/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
Anzupassende Parameter:
# 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     |
	+--------------------+-------+