ZFS Sync Fehler

Clericer

New Member
Aug 26, 2023
14
0
1
Hey ich bin ein riesen Proxmox fan geworden und habe aktuell 2 Server bei denen einer Master und einer slave ist, diese sind nicht als HA Verbund konfiguriert.
Sie laufen beide unabhängig voneinande, jedoch sichert der Haupserver einmal in der Nacht die VMs und LXCs via ZFS Sync auf den slave Server
Das funktioniert auch für eine gewissen Zeit einwandfrei (1-10 Tage)
Irgendwann erhalte ich den Fehler das das Sync nicht mehr funktioniert weil die Remote VMs und LXCs sich verändert haben und nicht mehr im gleichen Snapshot sind. Die Maschinen auf dem zweiten Server sind aber immer aus, und werden auch nie hochgefahren.
Ich hatte das Problem am Anfang wenn ich auf dem slave Server die Sicherung der VMs aktiviere, aber die habe ich abgeschaltet und dennoch passiert es das die VMs sich ändern.
Hat jemand eine Idee was das verursachen kann?
Gibt es eine Möglichkeit z.B: durch mask, unmask der Container soetwas in zukunft zu verhindern?
Ich will nicht alle paar Tage die VMs und LXC löschen und per "Hand" neu Synchronisieren das sind über 6TB. (HA Verbund kommt für mich aktuell auch nicht in Frage)
 
Nein ich hatte beide Server mal im HA Verbund und ich hatte eine Menge anderer Probleme, aufgrund verschiedener öffentlicher wan Addressen, Firewalls und VMs mit öffentlichen Addressen, das war mir zu aufwendig.
Ich keine klare Steuerung über das Quorum habe.
Dazu kommen, verschiedene Server Leistung. 96core 512GB Ram vs backup 32Cores / 128GBRam, verschiedene Festplatten und Platten Größen) und ein ganzer haufen anderer Gründe

Immoment verwende ich für die LXC /VM:
zfs snapshot
zfs send / receive

Das funktioniert wie gesagt auch super für eine gewissen Zeit aber irgendwann nicht mehr. Mir ist auch nicht ganz klar wie die Replikation das anders macht. (ich würde mich auch mit einer Rsync methode zufrieden geben aber das ging nicht weil dabei immer die gesammten VMs neu übertragen werden)
 
Aber Replikation sollte man trotzdem überlegen. Man brauch ja keine HA aktivieren (damit auch kein Quorum erforderlich). Wenn aber die beiden Server in einem Cluster sind, dann ist die Replikation kein Problem.
 
Last edited:
Man brauch ja keine HA aktivieren (damit auch kein Quorum erforderlich).
PVE als Cluster braucht immer ein Quorum. Bei zwei Maschinen kann man das durch ein Quorum Device oder andere "Tricks" sicherstellen. Ohne Quorum sind keinerlei Befehle ausführbar, beispielsweise kann man keine VMs starten.

HA ist ein "Aufsatz", den kann man gerne weglassen. Ohne aktives HA wird beispielsweise kein Reboot (durch Fencing) ausgelöst, falls ein Node ausfällt und das Quorum nicht mehr erreicht wird.

Ich würde immer einen Cluster anlegen. Ich würde immer ZFS verwenden. Ich würde die offizielle Replikation aktiveren.

YMMV ;-)
 
PVE als Cluster braucht immer ein Quorum. Bei zwei Maschinen kann man das durch ein Quorum Device oder andere "Tricks" sicherstellen. Ohne Quorum sind keinerlei Befehle ausführbar, beispielsweise kann man keine VMs starten.

HA ist ein "Aufsatz", den kann man gerne weglassen. Ohne aktives HA wird beispielsweise kein Reboot (durch Fencing) ausgelöst, falls ein Node ausfällt und das Quorum nicht mehr erreicht wird.

Ich würde immer einen Cluster anlegen. Ich würde immer ZFS verwenden. Ich würde die offizielle Replikation aktiveren.

YMMV ;-)
Okay, also brauch man im Cluster *immer* 3 Nodes. Ich meinte das hier müsste auch gehen: https://forum.proxmox.com/threads/lowering-the-quorum-permanently-on-a-cluster.124136/ - Aber ich hab das noch nicht probiert.

Oder vlt. sogar noch einfacher:
Code:
pvecm expected 1

Das setzt das erwartete Quorum auf 1 - > das ist immer erfüllt. Aber auf keine Fall mit HA machen ;)
 
Last edited:
Das nervige beim Cluster ist das ich den zweiten Server nicht beitreten lassen kann, ich muss wieder alles löschen entfernen und dann beitreten und wenn das Experiment schief geht muss ich wieder den gesammten Server neu installieren.
Das ist ein ganzer Tag Arbeit, ich will eigentlich nur das das Sync synchron bleibt und ich kann es mir einfach nicht erklären warum das nicht so ist.
Das ganze war mal in einem Cluster und das hab ich innerhalb von einem tag wieder gelöst und gelöscht um es los zu werden, ich bin mir auch nicht mehr 100%ig sicher warum, aber das ist aktuell keine Option für mich.
 
Last edited:
Können wir bitte die Diskussion über warum wieso bleiben lassen.
Ich will einfach wissen ob jemand weiß wie ich das Sync über zfs-sync machen kann und wie verhindern kann das sich das out of sync begibt.
(ohne Cluster, ohne HA, ohne Replication)
 
Können wir bitte die Diskussion über warum wieso bleiben lassen.
Ich will einfach wissen ob jemand weiß wie ich das Sync über zfs-sync machen kann und wie verhindern kann das sich das out of sync begibt.
(ohne Cluster, ohne HA, ohne Replication)
Es dürfte wohl daran liegen, dass irgendwas im Ziel-Dataset geschrieben wurde. Ich nutze zfs send auch extensiv für datasets -> aber das Ziel-Dataset ist dann immer rdonly
 
Das hatte ich auch schon vermutet: "Gibt es eine Möglichkeit z.B: durch mask, unmask der Container soetwas in zukunft zu verhindern?"
Wie machst du das denn mit zfs send wenn das ziel system nur read only ist?
 
Chat GPT hat mir das ganze mal als Script erzeugt das kann dann über einen cronjob ausgeführt werden.

Code:
#!/bin/bash

VMIDS=(101 102 103 104 106 109 111 114 115)
LogDir="/var/log/cronsnaps.log"
SNAPSHOT_BASE_NAME="snapshot"
DATE_SUFFIX="$(date +"%Y-%m-%d-%H%M%S")"
LAST_SNAPSHOT_FILE_BASE="/root/cronsnaps/"
ZFS_DATASET_BASE="rpool/data/subvol"
REMOTE_HOST="root@Hier_DIE_IP_AENDERN"
REMOTE_PVE_CONF_DIR="/etc/pve/lxc"

check_and_copy_config() {
    local VMID=$1
    local CONFIG_FILE="/etc/pve/nodes/$(hostname)/lxc/${VMID}.conf"

    if ! ssh $REMOTE_HOST test -f $REMOTE_PVE_CONF_DIR/${VMID}.conf; then
        echo "Konfigurationsdatei für VMID $VMID fehlt auf dem Remote-System. Übertrage Datei..."
        scp $CONFIG_FILE $REMOTE_HOST:$REMOTE_PVE_CONF_DIR/

        if [ $? -eq 0 ]; then
            echo "Konfigurationsdatei für VMID $VMID erfolgreich übertragen."
        else
            echo "Fehler beim Übertragen der Konfigurationsdatei für VMID $VMID."
            return 1
        fi
    fi
}

perform_snapshot() {
    local VMID=$1
    local DISK=$2
    local SNAPSHOT_NAME="${SNAPSHOT_BASE_NAME}-${VMID}-${DISK}-${DATE_SUFFIX}"
    local ZFS_DATASET="${ZFS_DATASET_BASE}-${VMID}-disk-${DISK}"
    local LAST_SNAPSHOT_FILE="${LAST_SNAPSHOT_FILE_BASE}${VMID}-${DISK}.txt"

    echo -e "\n >> Übertrage VMID: $VMID << \n"
    zfs snapshot ${ZFS_DATASET}@$SNAPSHOT_NAME
    echo $(date)" Erstelle Snapshot: zfs snapshot ${ZFS_DATASET}@$SNAPSHOT_NAME \n" >> ${LogDir}
    #Versetzt den Remote container in schreibbaren zustand
    ssh $REMOTE_HOST zfs set readonly=off $ZFS_DATASET

    if [ -f $LAST_SNAPSHOT_FILE ]; then
        LAST_SNAPSHOT=$(cat $LAST_SNAPSHOT_FILE)
    else
        LAST_SNAPSHOT=""
    fi

    # Überprüfen, ob am Ziel schon Snapshots vorhanden sind
    if ssh $REMOTE_HOST zfs list -t snapshot ${ZFS_DATASET} > /dev/null 2>&1; then
        # Wenn Snapshots vorhanden sind, versuche eine inkrementelle Übertragung
        if [ ! -z "${LAST_SNAPSHOT}" ]; then
            if zfs send -R -i ${ZFS_DATASET}@${LAST_SNAPSHOT} ${ZFS_DATASET}@$SNAPSHOT_NAME | ssh $REMOTE_HOST zfs receive ${ZFS_DATASET}; then
                echo $(date)" Inkrementelle Übertragung erfolgreich \n" >> ${LogDir}
                echo $SNAPSHOT_NAME > $LAST_SNAPSHOT_FILE
            else
                echo "Fehler bei der Uebertragung des incrementellen Server Backups auf Remotehost AX102 ContainerID: $VMID" | mail -s "Error Proxmox backup task notification" support@viconnect.eu
                echo $(date)" Inkrementelle Übertragung fehlgeschlagen \n" >> ${LogDir}
                return 1
            fi
        else
            # Kein letzter Snapshot bekannt, Starte vollständige Übertragung des neuesten Snapshots
            if ! zfs send ${ZFS_DATASET}@$SNAPSHOT_NAME | ssh $REMOTE_HOST zfs receive -F ${ZFS_DATASET}; then
                echo $(date)" Vollständige Übertragung fehlgeschlagen \n" >> ${LogDir}
                return 1
            fi
            echo $(date)" Vollständige Übertragung erfolgreich \n" >> ${LogDir}
            echo $SNAPSHOT_NAME > $LAST_SNAPSHOT_FILE
        fi
    else
        # Wenn am Ziel keine Snapshots vorhanden sind, führe eine vollständige Übertragung des neuesten Snapshots durch
        if ! zfs send ${ZFS_DATASET}@$SNAPSHOT_NAME | ssh $REMOTE_HOST zfs receive -F ${ZFS_DATASET}; then
            echo $(date)" Vollständige Übertragung fehlgeschlagen \n" >> ${LogDir}
            return 1
        fi
        echo $(date)" Vollständige Übertragung erfolgreich \n" >> ${LogDir}
        echo $SNAPSHOT_NAME > $LAST_SNAPSHOT_FILE
    fi
    #Versetzt container auf dem Remote system in Read only mode
    ssh $REMOTE_HOST zfs set readonly=on $ZFS_DATASET
}

for vmid in "${VMIDS[@]}"; do
    check_and_copy_config $vmid


    perform_snapshot $vmid 0
    # Prüfe, ob eine zweite Festplatte vorhanden ist, und führe ggf. perform_snapshot aus
    if zfs list ${ZFS_DATASET_BASE}-${vmid}-disk-1 > /dev/null 2>&1; then
        perform_snapshot $vmid 1
    fi
don
 
Hilft leider alles nichts auch, zwar sind die Container durch das read only zwar nicht mehr startbar aber nach 2-3 Tagen entsteht wieder der gleiche Fehler, das die LXCs aufgrund von fehlender Übereinstimmung nicht mehr übertragen werden können. :rolleyes:
Code:
ssh $REMOTE_HOST zfs set readonly=on $ZFS_DATASET
Irgendjemand noch eine Idee?
 
Irgend ein Prozess verarbeitet die Daten auf dem Zielsystem. Entweder durchsuchst du die Logs bis du den Übeltäter findest oder nutzt die eingebaute Replikation. Damit hatte ich noch nie Probleme.
 
Dann fehrstehe ich die Replikation nicht, ich habe ein "cluster join" gemacht. Dann wähle ich Replikation und das Intervall, z.B. alle 30 Minuten.
Und es passiert nichts, auf dem Zielserver erscheint keine lxc, oder vm auch nach 3 tagen nicht.
Aber es ist schon schade das es ein tool wie zfs gibt, das aber scheinbar unbrauchbar ist wenn es keine standartisierte Methode gibt das zu nutzen ohne ständig auf Probleme zu treffen.
Mein Wunsch ist, dass auf dem Backupserver die VMs 1zu1 sichtbar, gespiegelt sind, und ich diese beim Ausfall des Hauptservers bei Notwendigkeit einzeln hoch fahren kann.
 
Last edited:
Dann fehere ich die replikation nihct, ich hab ein cluster join gemacht. Klicke auf Replikation und wähle den Zetraum aus. z.B. alle 30 Minuten.
Und es passiert nichts, auf dem Zielserver erscheint keine lxc, oder vm auch nach 3 tagen nicht.
Dein LXC bleibt natürlich immer wo er ist. Es werden nur die Disks repliziert. Die VM Config ist im bereits synchronisierten Ordner /etc/pve.
Guck mal auf dem Zielserver auf deinen Datastore.
Aber es ist schon schade das es ein tool wie zfs gibt, das aber scheinbar unbrauchbar ist wenn es keine standartisierte Methode gibt das zu nutzen ohne ständig auf Probleme zu treffen.
Ich nutze das auch Produktiv bei Kunden, habe bisher noch nie Probleme gesehen.
Mein Wunsch ist, dass auf dem Backupserver die VMs 1zu1 sichtbar, gespiegelt sind, und ich diese beim Ausfall des Hauptservers bei Notwendigkeit einzeln hoch fahren kann.
Die VM Konfiguration liegt ja auch auf dem Zielserver, muss nur in den Ordner des Zielservers verschoben werden und dann tauchen die VMs/LXC in der GUI auf. Eine Konfiguration kann immer nur einmal im Cluster vorhanden sein. Dieser Bullshit von VMware wo man eine VM mehrfach sieht, gibt es nicht.
 
  • Like
Reactions: VolkerS

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!