docked webserver and recovery script for cluster
This commit is contained in:
1 parent
30453ced4e
commit
a90cd8dd64
4 files changed
+93
-1
No files matched your search
@@ -44,13 +44,29 @@ bash docker/scripts/check_nodes.sh
|
||||
```
|
||||
Die Ausgabe sollte **`wsrep_cluster_size | 3`** anzeigen.
|
||||
|
||||
## Web-Dashboard (Optional)
|
||||
Du kannst einen kleinen Webserver starten, der den Status des Clusters grafisch im Browser anzeigt:
|
||||
|
||||
1. Starte den Webserver:
|
||||
```bash
|
||||
bash docker/scripts/init_webserver.sh
|
||||
```
|
||||
2. Öffne im Browser: `http://[SERVER-IP]:8080`
|
||||
|
||||
## Wichtige Hinweise
|
||||
|
||||
### Network Mode Host
|
||||
Die Container nutzen `network_mode: host`. Das sorgt für maximale Performance, da kein Docker-Netzwerk-Overhead entsteht. MariaDB ist direkt über die IP des Host-Servers erreichbar.
|
||||
|
||||
### Neustart des Clusters
|
||||
Falls der gesamte Cluster gestoppt wurde, muss der erste Knoten immer wieder mit dem `init_cluster_n1.sh` Skript (Bootstrap) gestartet werden, um den Cluster neu zu initialisieren. Die anderen Knoten können danach normal mit ihren jeweiligen Skripten beitreten.
|
||||
Falls der gesamte Cluster gestoppt wurde, muss der erste Knoten immer wieder mit dem `init_cluster_n1.sh` Skript (Bootstrap) gestartet werden, um den Cluster neu zu initialisieren.
|
||||
|
||||
#### Fehlerbehebung (Recovery)
|
||||
Falls der Cluster nach einem harten Neustart im "Restart-Loop" hängt, nutze auf **Server 1** das Recovery-Skript:
|
||||
```bash
|
||||
bash docker/scripts/recover_cluster.sh
|
||||
```
|
||||
Dieses Skript forciert den Bootstrap von Node 1. Sobald dieser fertig ist, kannst du Node 2 und 3 normal starten.
|
||||
|
||||
### Verzeichnisstruktur
|
||||
Die Skripte erwarten, dass die Verzeichnisstruktur (`docker/scripts/` und `docker/mariadb/n*/`) erhalten bleibt, da sie intern mit relativen Pfaden arbeiten.
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
# Verzeichnis dieses Skripts ermitteln
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
# Pfad zum webserver Verzeichnis
|
||||
WEB_DIR="$(dirname "$SCRIPT_DIR")/webserver"
|
||||
|
||||
echo "Starte Galera Dashboard (Webserver)..."
|
||||
cd "$WEB_DIR"
|
||||
docker compose up -d
|
||||
|
||||
echo "Dashboard gestartet! Erreichbar unter http://localhost:8080 (oder die IP dieses Servers)"
|
||||
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# recover_cluster.sh
|
||||
# Dieses Skript repariert den Galera Cluster nach einem harten Neustart oder Absturz.
|
||||
# Es sollte auf dem Hauptknoten (Node 1) ausgeführt werden.
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||
NODE1_DATA="$PROJECT_ROOT/mariadb/n1/data"
|
||||
GRASTATE_FILE="$NODE1_DATA/grastate.dat"
|
||||
GVWSTATE_FILE="$NODE1_DATA/gvwstate.dat"
|
||||
|
||||
echo "--- Galera Cluster Recovery Start ---"
|
||||
|
||||
# 1. Alle Container auf diesem Server stoppen
|
||||
echo "[1/5] Stoppe lokale Container..."
|
||||
cd "$PROJECT_ROOT/mariadb/n1"
|
||||
docker compose down > /dev/null 2>&1
|
||||
|
||||
# 2. View State bereinigen (verhindert hängenbleiben in alter Sicht)
|
||||
if [ -f "$GVWSTATE_FILE" ]; then
|
||||
echo "[2/5] Lösche veraltete View-State Datei..."
|
||||
rm "$GVWSTATE_FILE"
|
||||
fi
|
||||
|
||||
# 3. safe_to_bootstrap in grastate.dat auf 1 setzen
|
||||
if [ -f "$GRASTATE_FILE" ]; then
|
||||
echo "[3/5] Forciere safe_to_bootstrap in grastate.dat..."
|
||||
# Nutze sed um den Wert sicher auf 1 zu setzen
|
||||
sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/' "$GRASTATE_FILE"
|
||||
else
|
||||
echo "WARNUNG: $GRASTATE_FILE nicht gefunden. Ist der Pfad korrekt?"
|
||||
fi
|
||||
|
||||
# 4. Node 1 mit Bootstrap-Flag neu starten
|
||||
echo "[4/5] Starte Node 1 im Bootstrap-Modus..."
|
||||
GALERA_BOOTSTRAP="--wsrep-new-cluster" docker compose up -d
|
||||
|
||||
# 5. Status-Überprüfung
|
||||
echo "[5/5] Warte auf Initialisierung (max 30s)..."
|
||||
for i in {1..15}; do
|
||||
STATUS=$(docker exec mariadb_n1 mariadb -uworker -pbBHofurUJWKzPE8Z -e "SHOW STATUS LIKE 'wsrep_local_state_comment';" 2>/dev/null | grep 'Synced')
|
||||
if [ ! -z "$STATUS" ]; then
|
||||
echo "ERFOLG: Node 1 ist SYNCED und bereit."
|
||||
echo "Du kannst jetzt auf den anderen Servern die init_cluster Skripte starten."
|
||||
exit 0
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "FEHLER: Node 1 konnte nicht automatisch synchronisiert werden."
|
||||
echo "Bitte prüfe die Logs mit: docker logs mariadb_n1"
|
||||
exit 1
|
||||
@@ -0,0 +1,12 @@
|
||||
services:
|
||||
webserver:
|
||||
image: php:8.2-apache
|
||||
container_name: galera_dashboard
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- ./index.php:/var/var/www/html/index.php
|
||||
# Wir installieren die PDO MySQL Erweiterung direkt beim Start
|
||||
command: >
|
||||
sh -c "docker-php-ext-install pdo pdo_mysql && apache2-foreground"
|
||||
restart: unless-stopped
|
||||
Reference in new issue
Block a user