This commit is contained in:
Tower committed 2026-05-28 20:04:44 +02:00
1 parent 7130ee6b53
commit 6524fb3fbd
13 files changed
+187 -44

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
# MariaDB Galera Cluster Setup (3 Server)
Dieses Setup ist für den Betrieb auf drei separaten Servern optimiert.
## Server-Struktur
- **Server 1:** 10.233.1.101 (Bootstrap)
- **Server 2:** 10.233.1.102 (Joiner)
- **Server 3:** 10.233.1.103 (Joiner)
## Vorbereitung
1. Stelle sicher, dass auf allen Servern **Docker** installiert ist.
2. Die Firewall muss folgende Ports zwischen den Servern erlauben:
- `3306` (MySQL/MariaDB)
- `4567` (Galera Cluster)
- `4568` (IST)
- `4444` (SST)
## Installations-Ablauf
### 1. Auf Server 1 (10.233.1.101)
Kopiere das Verzeichnis `docker/mariadb/n1` auf diesen Server.
```bash
cd n1
# Cluster initialisieren
GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose up -d
```
### 2. Auf Server 2 (10.233.1.102)
Kopiere das Verzeichnis `docker/mariadb/n2` auf diesen Server.
```bash
cd n2
# Dem Cluster beitreten
docker compose up -d
```
### 3. Auf Server 3 (10.233.1.103)
Kopiere das Verzeichnis `docker/mariadb/n3` auf diesen Server.
```bash
cd n3
# Dem Cluster beitreten
docker compose up -d
```
## Status prüfen
Führe auf einem beliebigen Server folgenden Befehl aus:
```bash
docker exec -it mariadb mariadb -p"bBHofurUJWKzPE8Z" -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
```
Die `wsrep_cluster_size` muss **3** sein.
## Besonderheit: Network Mode Host
Die Container nutzen `network_mode: host`. Das bedeutet:
- Beste Performance (kein Docker-NAT-Overhead).
- MariaDB lauscht direkt auf der IP des Servers.
- Keine Port-Mappings in der `docker-compose.yml` nötig.
+7
View File
@@ -0,0 +1,7 @@
NODE_NAME=node1
# Die öffentliche oder interne IP dieses Servers (Server 1)
NODE_IP=10.233.1.101
MARIADB_ROOT_PASSWORD=bBHofurUJWKzPE8Z
MARIADB_DATABASE=cluster
MARIADB_USER=worker
MARIADB_PASSWORD=bBHofurUJWKzPE8Z
+7 -12
View File
@@ -1,22 +1,17 @@
services:
mariadb:
image: mariadb:11.4.3 # Feste Version statt :latest
image: mariadb:11.4.3
container_name: mariadb
network_mode: host
volumes:
- ./data/:/var/lib/mysql
- ./galera/galera.cnf:/etc/mysql/conf.d/galera.cnf
environment:
MARIADB_ROOT_PASSWORD: bBHofurUJWKzPE8Z
MARIADB_DATABASE: cluster
MARIADB_USER: worker
MARIADB_PASSWORD: bBHofurUJWKzPE8Z
ports:
- "3306:3306"
- "4567:4567"
- "4567:4567/udp"
- "4568:4568"
- "4444:4444"
restart: unless-stopped # Nicht "always" – sonst bootet Node1 ewig
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
restart: unless-stopped
command: >
mariadbd
--wsrep_node_address=${NODE_IP}
+7
View File
@@ -0,0 +1,7 @@
NODE_NAME=node2
# Die öffentliche oder interne IP dieses Servers (Server 2)
NODE_IP=10.233.1.102
MARIADB_ROOT_PASSWORD=bBHofurUJWKzPE8Z
MARIADB_DATABASE=cluster
MARIADB_USER=worker
MARIADB_PASSWORD=bBHofurUJWKzPE8Z
+7 -12
View File
@@ -1,22 +1,17 @@
services:
mariadb:
image: mariadb:11.4.3 # Feste Version statt :latest
image: mariadb:11.4.3
container_name: mariadb
network_mode: host
volumes:
- ./data/:/var/lib/mysql
- ./galera/galera.cnf:/etc/mysql/conf.d/galera.cnf
environment:
MARIADB_ROOT_PASSWORD: bBHofurUJWKzPE8Z
MARIADB_DATABASE: cluster
MARIADB_USER: worker
MARIADB_PASSWORD: bBHofurUJWKzPE8Z
ports:
- "3306:3306"
- "4567:4567"
- "4567:4567/udp"
- "4568:4568"
- "4444:4444"
restart: unless-stopped # Nicht "always" – sonst bootet Node1 ewig
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
restart: unless-stopped
command: >
mariadbd
--wsrep_node_address=${NODE_IP}
+7
View File
@@ -0,0 +1,7 @@
NODE_NAME=node3
# Die öffentliche oder interne IP dieses Servers (Server 3)
NODE_IP=10.233.1.103
MARIADB_ROOT_PASSWORD=bBHofurUJWKzPE8Z
MARIADB_DATABASE=cluster
MARIADB_USER=worker
MARIADB_PASSWORD=bBHofurUJWKzPE8Z
+7 -12
View File
@@ -1,22 +1,17 @@
services:
mariadb:
image: mariadb:11.4.3 # Feste Version statt :latest
image: mariadb:11.4.3
container_name: mariadb
network_mode: host
volumes:
- ./data/:/var/lib/mysql
- ./galera/galera.cnf:/etc/mysql/conf.d/galera.cnf
environment:
MARIADB_ROOT_PASSWORD: bBHofurUJWKzPE8Z
MARIADB_DATABASE: cluster
MARIADB_USER: worker
MARIADB_PASSWORD: bBHofurUJWKzPE8Z
ports:
- "3306:3306"
- "4567:4567"
- "4567:4567/udp"
- "4568:4568"
- "4444:4444"
restart: unless-stopped # Nicht "always" – sonst bootet Node1 ewig
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
MARIADB_DATABASE: ${MARIADB_DATABASE}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
restart: unless-stopped
command: >
mariadbd
--wsrep_node_address=${NODE_IP}
+3 -1
View File
@@ -1 +1,3 @@
sudo docker exec -it mariadb mariadb -p"bBHofurUJWKzPE8Z" -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
#!/usr/bin/env bash
# Prüft den lokalen Status des Containers
docker exec -it mariadb mariadb -p"bBHofurUJWKzPE8Z" -e "SHOW STATUS LIKE 'wsrep_cluster_size'; SHOW STATUS LIKE 'wsrep_local_state_comment';"
+11 -1
View File
@@ -1 +1,11 @@
NODE_IP="10.233.1.101" NODE_NAME="node01" GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose -f /home/worker/docker/mariadb/n1/docker-compose.yml --env-file /home/worker/docker/mariadb/n1/.env up -d --force-recreate
#!/usr/bin/env bash
# Verzeichnis dieses Skripts ermitteln
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Pfad zum n1 Verzeichnis
NODE_DIR="$(dirname "$SCRIPT_DIR")/mariadb/n1"
echo "Starte MariaDB Galera Cluster (BOOTSTRAP auf Server 1)..."
cd "$NODE_DIR"
GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose up -d
echo "Knoten 1 (n1) gestartet."
+10 -3
View File
@@ -1,4 +1,11 @@
#!/usr/bin/env bash
# Node 2 dem bestehenden Cluster joinen.
# Voraussetzung: Node 1 ist bereits gestartet und healthy.
NODE_IP="10.233.1.102" NODE_NAME="node02" GALERA_BOOTSTRAP="" docker compose -f /home/worker/docker/mariadb/n2/docker-compose.yml --env-file /home/worker/docker/mariadb/n2/.env up -d --force-recreate
# Verzeichnis dieses Skripts ermitteln
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Pfad zum n2 Verzeichnis
NODE_DIR="$(dirname "$SCRIPT_DIR")/mariadb/n2"
echo "Trete Galera Cluster bei (Server 2 / n2)..."
cd "$NODE_DIR"
docker compose up -d
echo "Knoten 2 (n2) gestartet."
+10 -3
View File
@@ -1,4 +1,11 @@
#!/usr/bin/env bash
# Node 3 dem bestehenden Cluster joinen.
# Voraussetzung: Node 1 (und idealerweise Node 2) sind bereits gestartet und healthy.
NODE_IP="10.233.1.103" NODE_NAME="node03" GALERA_BOOTSTRAP="" docker compose -f /home/worker/docker/mariadb/n3/docker-compose.yml --env-file /home/worker/docker/mariadb/n3/.env up -d --force-recreate
# Verzeichnis dieses Skripts ermitteln
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Pfad zum n3 Verzeichnis
NODE_DIR="$(dirname "$SCRIPT_DIR")/mariadb/n3"
echo "Trete Galera Cluster bei (Server 3 / n3)..."
cd "$NODE_DIR"
docker compose up -d
echo "Knoten 3 (n3) gestartet."
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# Verzeichnis dieses Skripts ermitteln
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASE_DIR="$(dirname "$SCRIPT_DIR")"
echo "Erstelle Docker Netzwerk..."
docker network create --subnet=10.233.1.0/24 galera_net 2>/dev/null || true
echo "Starte Node 1 (Bootstrap)..."
cd "$BASE_DIR/mariadb/n1"
GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose up -d --force-recreate
echo "Warte auf Node 1 Healthcheck..."
until [ "$(docker inspect -f '{{.State.Health.Status}}' mariadb_n1)" == "healthy" ]; do
sleep 2
done
echo "Starte Node 2..."
cd "$BASE_DIR/mariadb/n2"
docker compose up -d --force-recreate
echo "Starte Node 3..."
cd "$BASE_DIR/mariadb/n3"
docker compose up -d --force-recreate
echo "Cluster wird gestartet. Status prüfen mit: ./check_nodes.sh"
+30
View File
@@ -0,0 +1,30 @@
<?php
$nodes = ['10.233.1.101', '10.233.1.102', '10.233.1.103'];
$user = 'worker';
$pass = 'bBHofurUJWKzPE8Z';
$db = 'cluster';
echo "<h1>Galera Cluster Status</h1>";
foreach ($nodes as $node) {
echo "<h2>Verbindung zu $node:</h2>";
try {
$pdo = new PDO("mysql:host=$node;dbname=$db", $user, $pass, [
PDO::ATTR_TIMEOUT => 2,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$stmt = $pdo->query("SHOW STATUS LIKE 'wsrep_local_state_comment'");
$state = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $pdo->query("SHOW STATUS LIKE 'wsrep_cluster_size'");
$size = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Status: <span style='color:green'>" . $state['Value'] . "</span><br>";
echo "Cluster Größe: " . $size['Value'] . "<br>";
} catch (PDOException $e) {
echo "Status: <span style='color:red'>Offline (" . $e->getMessage() . ")</span><br>";
}
}
?>