November 8, 20241 yr Hallo zusammen ich habe ein Problem mit der Übertragung meiner Backups. Jeweils am Morgen um 04:00 Uhr wird mittels des Backupscripts von @mgutt eine Sicherung erstellt. Nun möchte ich diese Backups mit rsync auf meine anderen Server übertragen. Bisher habe ich die Sicherungen mit dem Appdata Backup Plugin erstellt und dann wegkopiert, einmal auf einen Server bei mir zu Hause und einmal per VPN zu meinen Eltern. Die Übertragun hat jeweils nur ein paar Minuten gedauert. Wenn ich nun die Backups, welche mit dem Script erstellt wurden, wegkopieren will, dauert dass Stunden. Gestern waren 12 Backups in dem Ordner, diese auf den Server im gleichen Netzwerk zu kopieren hat fast 24 Stunden gedauert. Nachdem heute morgen ein neues Backup erstellt wurde habe ich etwa um 8 Uhr den rsync Befehl manuell ausgeführt, diesmal hat das Kopieren etwa 8 Stunden gedauert. Ich sichere mit dem Script meinen appdata, boot und nextcloud Ordner, auf dem Cache belegen die Ordner etwa 67GB. Das Script, welches ich benutze und bisher anstandslos funktioniert hat, sieht wie folgt aus (erstellt mit Hilfe von ChatGPT): #!/bin/bash # Konfiguration QUELL_SERVER="[email protected]" QUELL_ORDNER="/mnt/cache/inc_backup" ZIEL_ORDNER="/mnt/user/ZEUS" # rsync-Aufruf rsync -avH --delete --chmod=ugo=rwX --rsync-path="mkdir -p $ZIEL_ORDNER && rsync" "$QUELL_SERVER:$QUELL_ORDNER" "$ZIEL_ORDNER" # Benachrichtigung an Unraid Dashboard senden /usr/local/emhttp/webGui/scripts/notify -e "Backup abgeschlossen" -s "Das Backup von appdata ZEUS wurde erfolgreich durchgeführt." Weiss jemand wieso die Übertragung inkrementeller Backups so lange dauert? Würde es Sinn machen mit dem Script direkt auf den Remoteserver zu sichern? Können mehrere Ziele im Script angegeben werden? Besten Dank für eure Hilfe.
November 8, 20241 yr Community Expert Solution 56 minutes ago, b_tob said: Würde es Sinn machen mit dem Script direkt auf den Remoteserver zu sichern? Nein. Das Skript sollte immer auf dem Remote ausgeführt werden, also abholen. Allerdings sollte man dabei root-Rechte auf dem Quellserver besitzen. Da man aber auf keinen Fall den Unraid root User remote nutzen sollte, empfehle ich den rsync Container zu verwenden um die entsprechenden Pfade nur read-only verfügbar und nur dessen SSH Port erreichbar zu machen. 59 minutes ago, b_tob said: Wenn ich nun die Backups, welche mit dem Script erstellt wurden, wegkopieren will, dauert dass Stunden. Grundregeln: - auf der Remote Maschine ausführen - keine /mnt/user Pfade nutzen (um Unraids Overhead zu umgehen) - rsync über SSH verbinden und nicht zb nicht per SMB oder sshfs gemountete Pfade verwenden 1 hour ago, b_tob said: Das Script, welches ich benutze und bisher anstandslos funktioniert hat ... Weiss jemand wieso die Übertragung inkrementeller Backups so lange dauert? Ich kann dir in dem Punkt nicht folgen was du nun wirklich machst, wenn es langsam ist. Das Skript von chatgpt ist ja nicht inkrementell?!
November 11, 20241 yr Author Vielleicht noch ein paar genauere Angaben: Ich führe auf Server A das Backup Script von dir @mgutt aus, welche inkrementelle Backups erstellt, diese werden auf dem Cache abgelegt. Nun möchte ich diese auf Server B übertragen, dazu habe ich SSH Keys der beiden Server ausgetauscht damit ein Login ohne Passwort funktioniert. Nun wird auf Server B, auf welchen die Backups kopiert werden sollen, das oben genannte Script ausgeführt, welches die Backups von Server A abholt (192.168.1.193 ist Server A, 192.168.1.120 wäre Server B). Diese Variante zum kopieren habe ich bisher benutzt und die Backups, welche mit Hilfe des appdata Backup Plugin erstellt wurde, auf Server B zu kopieren. Dies hat jeweils nur paar minuten gedauert. Wenn ich das Script nun aber die bereits erstellten inkrementellen Backups kopieren lassen will, steht im Log jeweils für mehrere Stunden "receiving incremental file list". Zuerst habe ich den Fehler gemacht und die Option "-H" nicht eingefügt, darum wurden die Hardlinks nicht berücksichtig und es hat jedes Backup als Fullbackup kopiert. Aber auch mit der Option -H dauert es immer noch Stunden. Ich weiss nicht ob es nicht anders möglich ist, weil mit Hardlinks gearbeitet wird, oder ob ich einen (Denk)Fehler mache. On 11/8/2024 at 11:12 PM, mgutt said: - keine /mnt/user Pfade nutzen (um Unraids Overhead zu umgehen) Wie würden dann die Pfade lauten? Müsste man direkt die Disk angeben, also in meinem Fall /mnt/disk3/...? Wie muss man vorgehen wenn ein Share nicht nur auf einer Platte liegen würde?
November 11, 20241 yr 2 hours ago, b_tob said: Wie würden dann die Pfade lauten? On 11/8/2024 at 10:08 PM, b_tob said: QUELL_ORDNER="/mnt/cache/inc_backup" Das ist damit schon richtig umgesetzt. So wird das cache Laufwerk direkt angesprochen und nicht der Weg über /mnt/user/inc_backup , denn da muss Unraid nämlich mittels Fuse schauen, wo die Dateien derzeit wrilklich liegen, io auf /mnt/cache oder /mnt/disk1 etc.
November 11, 20241 yr 8 hours ago, b_tob said: Ich führe auf Server A das Backup Script von dir @mgutt aus, ... Nun wird auf Server B, auf welchen die Backups kopiert werden sollen, das oben genannte Script ausgeführt, welches die Backups von Server A abholt Löst jetzt nicht das Problem, aber warum führst du das Backup Script nicht direkt auf Server B durch? Also die shares von Server A (meinetwegen auch nur readonly) in Server B mounten und dort dann das Backup Script starten?!
November 14, 20241 yr Author On 11/11/2024 at 7:10 PM, jj1987 said: Löst jetzt nicht das Problem, aber warum führst du das Backup Script nicht direkt auf Server B durch? Also die shares von Server A (meinetwegen auch nur readonly) in Server B mounten und dort dann das Backup Script starten?! Danke für den Input, habe das mal getestet, leider werden die Docker Container nicht gestoppt bevor das Backup erstellt wird. Wenn man das Script lokal ausführt wird ein Snapshot vom appdata Ordner erstellt, dies funktioniert gemäss Hinweis im Script leider noch nicht per SSH, daher möchte ich es nicht auf dem Server B ausführen.
November 14, 20241 yr Willst du denn gar kein erstes Backup auf dem Server mehr haben? Wenn doch holst du doch mit dem Backup-Rechner nur die schon gemachten Backups vom Server, dazu muss dann kein Container mehr gestoppt werden.
November 21, 20241 yr Author Also vielleicht nochmal zur Klarstellung, ich möchte eigentlich auf Server A das Script laufen lassen und appdata von Server A sichern, anschliessend auuf Server B ein anderes Script ausführen welches die Backups von Server A abholt. Das Script von @mgutt funktioniert auf Server A auch ohne Probleme, nur wenn ich dann auf Server B das rsync Script ausführe dauert es Stunden bis alles kopiert ist, auch wenn es nur inkrementell kopieren müsste. Im rsync Befehl habe ich die Option -H eingefügt, so sollten Hardlinks übernommen werden, und nicht jeweils alle Files komplett wieder kopiert werden. Aber auch mit dieser Option dauert der Kopiervorgang mehrere Stunden. Auf den Hinweis von jj1987 habe ich dann das Script auf Server B ausgeführt, dies stoppt aber die Docker auf Server A nicht, im Script steht auch dass das per SSH aktuell noch nicht funktioniert. Zusammenfassend: Ich möchte die inkrementellen Backups von Server A auf Server B und auch Server C kopieren, aufgrund der Dauer von mehreren Stunden ist dies aber nicht praktikabel. Fullbackups, welche mit dem appdata Backup Plugin erstellt wurden kopiere, dauert das ein paar Minuten, braucht aber auch ein vielfaches an Speicherplatz. Ich denke daher dass entweder bei meinem rsync Befehl ein Problem mit den Hardlinks besteht oder der Server B vielleicht zu wenig Leistung hat, da beim Kopiervorgang der inkrementellen Backups die CPU auf 100% ist.
November 21, 20241 yr Community Expert 1 hour ago, b_tob said: Auf den Hinweis von jj1987 habe ich dann das Script auf Server B ausgeführt, dies stoppt aber die Docker auf Server A nicht, im Script steht auch dass das per SSH aktuell noch nicht funktioniert. Ich mache es so: - Skript auf Server A sichert appdata von SSD (Primary) auf HDD (Secondary) mit 1 Tag Aufbewahrung - Skript auf Server B holt alles von Server A (nur von dessen HDDs) ab mit 14 Tagen Aufbewahrung Alternativ könnte man dieses reduzierte Skript auf Server A nehmen: #!/bin/bash # settings src_path="/mnt/cache/appdata" snapshot_name=".appdata_backup" # functions notify() { echo "$2" if [[ -f /usr/local/emhttp/webGui/scripts/notify ]]; then /usr/local/emhttp/webGui/scripts/notify -i "$([[ $2 == Error* ]] && echo alert || echo normal)" -s "$1 ($src_path)" -d "$2" -m "$2" fi } # temporarily stop containers to create snapshot of /mnt/cache/appdata docker_app_config_path=$(grep DOCKER_APP_CONFIG_PATH /boot/config/docker.cfg | grep -oP '[^"]+(?="$)') docker_sharename=$(basename "$docker_app_config_path") cache_mode=$(grep shareUseCache "/boot/config/shares/$docker_sharename.cfg" | grep -oP '(?<==")[^"]+(?=")') # source path must be the docker appdata share if [[ $src_path != */"$docker_sharename" ]]; then notify "Wrong appdata path!" "$src_path is not the unraid appdata path (sharename: $docker_sharename)!" exit fi # obtain list of running containers mapfile -t container_ids < <(docker container ls -q 2>/dev/null) if [[ ${#container_ids[@]} -eq 0 ]]; then notify "No containers found!" "It seems that no container is running, which could be stopped!" exit fi # appdata should be only on array OR pool appdata_paths=$(ls -d /mnt/*/"$docker_sharename" | grep -v -e /mnt/user/"$docker_sharename" -e /mnt/user0/"$docker_sharename") # should return /mnt/diskX OR /mnt/poolname if [[ $(echo "$appdata_paths" | wc -l) -gt 1 ]]; then notify "Backup probably inconsistent!" "Docker appdata files were found in too many locations (cache: $cache_mode, paths: ${appdata_paths//$'\n'/ })!" exit fi # snapshot must be /mnt/cache/appdata or /mnt/diskX/appdata if [[ $src_path == "/mnt/user/"* ]]; then notify "Backup causes long docker downtime!" "The source path $src_path needs to be /mnt/cache/$docker_sharename or /mnt/diskX/$docker_sharename to reduce downtime!" exit fi # echo stop containers echo "Stop containers:" if ! docker container stop "${container_ids[@]}"; then notify "Could not stop containers!" "The container ids ${container_ids[*]} could not be stopped!" sleep 30 docker container start "${container_ids[@]}" # try to start at least those which were stopped exit fi # obtain snapshot path snapshot_dirname=$(dirname "$src_path") snapshot_temp="$snapshot_dirname/.tmp.$snapshot_name" snapshot_path="$snapshot_dirname/$snapshot_name" # delete existing snapshot [[ -d "$snapshot_path" ]] && rm -r "$snapshot_path" # create snapshot if ! cp -a --reflink=always "$src_path" "$snapshot_temp" 2>/dev/null; then notify "Error creating snapshot!" "The source path $src_path maybe does not support reflink copies?!" rm -r "$snapshot_temp" else mv "$snapshot_temp" "$snapshot_path" echo "Created snapshot of $src_path to $snapshot_path" fi # start containers echo "Start containers (fast method):" docker container start "${container_ids[@]}" Es stoppt die Container, erstellt mit cp einen Snapshot von /appdata nach /.appdata_backup und startet die Container wieder. Bei der nächsten Ausführung löscht er /.appdata_backup wieder und erzeugt es wieder neu. Alternativ könnte man nach Abholung von /.appdata_backup das Verzeichnis löschen, aber da ich nur read-only Abholungen empfehle, würde ich einfach damit leben, dass es dauerhaft rumliegt. Eine Reflink-Kopie belegt ja nur dann mehr Speicherplatz, wenn sich die Dateien in appdata ändern. EDIT: Von appdata_backup in .appdata_backup geändert, damit Unraid keinen Share erstellt.
November 21, 20241 yr Author 2 hours ago, mgutt said: Ich mache es so: - Skript auf Server B holt alles von Server A (nur von dessen HDDs) ab mit 14 Tagen Aufbewahrung Wie sieht dieses Script aus? Das Backupscript funktioniert eigentlich einwandfrei, nur das Kopieren auf den Backupserver nicht. Ich benutze dazu wie gesagt den rsync Befehl mit der Option -H: #!/bin/bash # Konfiguration QUELL_SERVER="[email protected]" QUELL_ORDNER="/mnt/cache/inc_backup" ZIEL_ORDNER="/mnt/user/ZEUS" # rsync-Aufruf rsync -avH --delete --chmod=ugo=rwX --rsync-path="mkdir -p $ZIEL_ORDNER && rsync" "$QUELL_SERVER:$QUELL_ORDNER" "$ZIEL_ORDNER" So wird der Ordner auf dem Server B mit dem Ordner auf dem Server A abgeglichen, sprich wenn ein Backup auf Server A entfernt wird (Aufbewahrungszeit vorbei) wird es auch auf Server B gelöscht.
December 6, 20241 yr Author Nachdem ich nun im Script beide Pfade von Usershare auf Diskshare umgestellt habe dauert der Kopiervorgang nur noch etwa 15-20 Minuten.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.