Inkrementelle Remote-ZFS-Sicherungen. Nirgendwo einfacher

Sichern Sie Ihren Bruder, sichern Sie ...


ZFS 0.8 bietet die Möglichkeit, inkrementelle Snapshots verschlüsselter Daten ohne Entschlüsselung zu senden. Das heißt, mit einem verschlüsselten Array können Sie eine Spiegelkopie davon auf einem Remotecomputer organisieren, ohne dem Eigentümer der Remote-Räumlichkeiten zu vertrauen. Der Schlüssel und die entschlüsselten Daten verlassen die vertrauenswürdigen Räumlichkeiten nicht.

Keiner meiner Clients (Mikrocontroller) hat mehr als einen Serverraum, wenn dort ein Feuer kommt, zum Beispiel ein Stern. Nachdem Sie mit Ihrem Kollegen in einem gefährlichen Verwaltungsgeschäft vereinbart haben, können Sie sich gegenseitig versichern, ohne befürchten zu müssen, dass er die Daten verwendet.

Jeder Dienst in Form einer virtuellen Maschine wird auf Proxmox installiert, wo die Daten auf ZFS gehostet werden, und Sie haben immer die Möglichkeit, eine Remote-Kopie der virtuellen Maschine zu speichern. Es besteht die Möglichkeit, dass Sie eines Tages, anstatt in Verzweiflung zu geraten, in einen abgelegenen Raum gehen, ein Stück Eisen aufheben und alle Dienste bei guter Gesundheit ausführen. Ich habe bereits vor ungefähr 2 Jahren fast alle meine Dienste auf Proxmox übertragen und ich bereue nichts, alles funktioniert gut. Unter ZFS habe ich einen Terminalserver für 30 Personen, der an Thin Clients gebunden ist (dh 30 vollwertige Jobs). Zusätzlich zur aktuellen Kopie haben Sie auch Schnappschüsse für die letzten x Tage, sowohl lokal als auch remote.

Ja, Sie werden durch die Verwendung von zfs und durch die Verschlüsselung an Produktivität verlieren, aber für mich selbst bin ich zu dem Schluss gekommen, dass ich bereit war, diesen Preis für diese Funktionalität zu zahlen.

Ein Löffel Teer


Im Tackle fliegt man sofort in die Salbe. Ja, ZFS ist langsamer. Im Wesentlichen. Sie können es jedoch nicht als reguläres fs verwenden. Es sollte in einem Array von Festplatten funktionieren, wobei eine Erhöhung der Anzahl der Festplatten erwünscht ist, die Festplatten sollten vorzugsweise SAS sein, der Controller sollte im HBA-Modus arbeiten (und nicht raid0 als einzelne Festplatten), es sollte ECC-RAM geben und es sollten viele sein, es muss eine geben SSD (besser PCI-E) als Cache zum Lesen der zweiten Ebene (klein, Gigs ab 64) und eine SSD für ZIL können sehr klein sein, vorzugsweise jedoch MLC.

In Bezug auf die SSD habe ich diese Empfehlungen umgesetzt und 2 PCI-E-SSDs mit 128 Stück gekauft, die jeweils in 16 Gigs und den Rest unterteilt sind. Ich habe zwei 16-Gigabyte-Partitionen in ZIL als Spiegel gestartet und die restlichen Teile unter dem Cache der zweiten Ebene als Streifen gestartet. In der Gnade von zfs gab 16 Konzerte der Oper. (Ein Slot bei einer Mutter, die bei ebay gekauft wurde, erwies sich als nicht funktionsfähig. Wenn es funktionierte, würde es 32 geben.)

zfskeeper.sh


Aus dem Skript heraus brauchte ich eine automatische Benachrichtigung über Probleme, die Überwachung der Anzahl der Schnappschüsse an beiden Enden und die Geschwindigkeitskontrolle. Von den Skripten, die mir in die Hände fielen, gab es keine Skripte, die mich zufriedenstellten. Im Folgenden werde ich einige der Skripte angeben, die ich zuvor überprüft habe. Um Benachrichtigungen per E-Mail zu erhalten, ersetzen Sie meine Daten in Ihrer Funktion send_error_to_mail () durch Ihre.

Zfskeeper.sh-Hilfe zeigt Ihnen Verwendungsbeispiele.
Zfskeeper.sh prepare zeigt Ihnen die Vorgehensweise für die vorbereitenden Aktionen (empfohlen).
Zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 nimmt den aktuellen Snapshot auf und hinterlässt die letzten 10 Snapshots.
Zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m Replikatorbank / rtl / subvol-100-disk-0 20Senden Sie unverschlüsselte Daten an Remotehost: 22 unter dem Benutzerreplikator mit einer Geschwindigkeit von bis zu 10 MB / s und belassen Sie 10 Bilder auf der Quelle und 20 auf dem
Remotehost zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m Replikatorbank / rtl / subvol -100-disk-0 20 -w das gleiche, aber die Daten werden verschlüsselt

#!/bin/bash

zpool=$1
lsnaps=$2

ip=$3
port=$4
speedl=$5
remoteuser=$6
backpool=$7
rsnaps=$8
sendargs=$9

ZFSLOGDIR=~/zfskeeplogs
if [ ! -d "$ZFSLOGDIR" ]; then
    mkdir -p $ZFSLOGDIR
fi

NAMESNAP=`date "+%Y_%m_%d_%T"|sed s/:/_/g`
logfile=$ZFSLOGDIR/$NAMESNAP.log

write_to_log ()
{
echo `date +"%T"`" $1" >> $logfile
}

log_last_command ()
{
if [ $? -ne 0 ]; then
	    write_to_log "$1 FAILED."
	    if [ $2 = true ]; then
		write_to_log "Script execution stops"
		send_error_to_mail "$1" "$?" "$*"
		exit 1
	    fi
	else
	    write_to_log "$1 COMPLETED."
	fi
}

send_error_to_mail ()
{

Subject=`hostname`" ZFS backup $zpool missing"
swaks --header "Subject: $Subject" --to admin@mydomain.ru --from "alertbot@mydomain.ru" -a LOGIN -au alertbot@mydomain.ru -ap ailPass --server mail.mydomain.ru -tls --body \
"$Subject
command: zfskeeper.sh $3

    $1
    $2" \
    --attach $logfile
#    --attach-type "$(get_mimetype $logfile)" --attach $logfile

}

case "$#" in
    1)
    case "$1" in
	prepare)
    echo "
    Sender mashine:
    apt install swaks mbuffer
    useradd -s /bin/bash replicator
    mkdir -p /home/replicator 
    chown replicator:replicator /home/replicator
    zfs allow -u replicator send,snapshot,destroy,mount bank/encrypted
    su replicator
    ssh-keygen

    Receiver machine:
    ln -s /usr/sbin/zfs /usr/local/bin/zfs
    useradd -s /bin/bash replicator
    mkdir -p /home/replicator 
    chown replicator:replicator /home/replicator
    passwd replicator

    Sender mashine:
    ssh-copy-id -i .ssh/id_rsa.pub Remotehost
    zfs allow -u replicator compression,create,receive,destroy,mount bank/companyname

    "
    ;;
	*)
    echo "
    Usage:

    To show the prepare instrutions:
    zfskeeper.sh prepare

    localkeeping:
    keep last 10 snapshots of bank/encrypted/subvol-100-disk-0

    zfskeeper.sh bank/encrypted/subvol-100-disk-0 10

    remotekeeping:

    keep last 10 snapshots bank/encrypted/subvol-100-disk-0 and send it by ssh to Remotehost:22 bank/rtl/subvol-100-disk-0
    and keep last 20 copies by replicator user and limit transferspeed 10Mb/s

    zfskeeper.sh bank/encrypted/subvol-100-disk-0 10 Remotehost 22 10m replicator bank/rtl/subvol-100-disk-0 20

    If you need to send encrypted data, then you need add -w to the end of the line

    zfskeeper bank/encrypted/subvol-100-disk-0 10 Remotehost 22 10m replicator bank/rtl/subvol-100-disk-0 20 -w
    "
    ;;
    esac
    exit 0
    ;;
    2)
    echo `date +"%T"`" Local keeping of $NAMESNAP being started" > $logfile
    ;;
    8|9)
    echo `date +"%T"`" Remote keeping of $NAMESNAP being started" > $logfile
    ;;
    *)
    echo "illegal number of parameters" >&2
    exit 1
    ;;
esac



####################################### Local part #######################################################

# Remove waste local snaps
numsnap=`zfs list -H -o name -t snapshot -s creation|grep "${zpool}@"|wc|awk '{ print $1 }'`
let MAXSNAP=numsnap-lsnaps+1 >/dev/null
if [ $MAXSNAP -gt 0 ] ; then
    for d in `zfs list -H -o name -t snapshot -s creation| grep "${zpool}@"|/usr/bin/head -n"$MAXSNAP"`; do
        zfs destroy ${d}
        log_last_command "Remove local snapshot $d"
    done
fi

# Create fresh local snap
zfs snapshot $zpool@backup_$NAMESNAP
log_last_command "Create local $zpool@backup_$NAMESNAP" true

####################################### Local part #######################################################

if [ -z "$backpool" ]; then
    write_to_log "Local keeping is complete"
    exit 0
fi

####################################### Remote part #######################################################


# Check remote address
if [ -n "$ip" ]; then
    if ping -c 1 $ip > null ; then
            sship="ssh -c aes128-ctr -p"$port" -l"$remoteuser" "$ip
    else
            echo "URL $ip is not accesiible, abort"
            send_error_to_mail "Try to ping remote host" "URL $ip is not accesiible, abort" "$*"
            exit 1
    fi
else
    # Remote backup is unnecessary
    exit 0
fi


# Remove waste local snaps
numsnap=`$sship zfs list -H -o name -t snapshot -s creation|grep "${backpool}@"|wc|awk '{ print $1 }'`
let MAXSNAP=numsnap-rsnaps+1 >/dev/null
if [ $MAXSNAP -gt 0 ] ; then
    for d in `$sship zfs list -H -o name -t snapshot -s creation| grep "${backpool}@"|/usr/bin/head -n"$MAXSNAP"`; do
        $sship zfs destroy ${d}
        log_last_command "Remove local snapshot $d"
    done
fi

# Receive last remote snap
MOST_SLAVE_SNAP_NAME=`$sship zfs list -H -o name -t snapshot -s creation|grep "$backpool@backup"|tail -n1|awk -F "@" '{print $2}'`

# If localbackup has same snap then send incremental copy. If has't then send full
if [ -n "`zfs list -H -o name -t snapshot -s creation|grep -w "$zpool@$MOST_SLAVE_SNAP_NAME"`" ]; then
    #zfs send $sendargs -i $MOST_SLAVE_SNAP_NAME $zpool@backup_$NAMESNAP | pv -L $speedl | $sship zfs receive -vF $backpool@backup_$NAMESNAP &>> $logfile
    zfs send $sendargs -i $MOST_SLAVE_SNAP_NAME $zpool@backup_$NAMESNAP | mbuffer -q -v 0 -s 128k -m 1G | pv -L $speedl | $sship "mbuffer -q -v 0 -s 128k -m 1G | zfs receive -vF $backpool@backup_$NAMESNAP" &>> $logfile
    log_last_command "Sending incremental backup to the remote machine" true
else
    #If backpool exist we remove it. You can rename it
    if [ -n "`$sship zfs list -H -o name -s creation|grep -w "$backpool"`" ]; then
	#$sship zfs rename -p $backpool `$sship zfs list -H -o name|grep -w "$backpool"|awk -F "/" '{print $1}'`/old_$NAMESNAP
	$sship zfs destroy -r $backpool 2>> $logfile
	log_last_command "Need to destroy remotepool for full sending $backpool" true
    fi
    #zfs send $sendargs $zpool@backup_$NAMESNAP | pv -L $speedl | $sship zfs receive -vF $backpool &>> $logfile
    zfs send $sendargs $zpool@backup_$NAMESNAP | mbuffer -q -v 0 -s 128k -m 1G | pv -L $speedl | $sship "mbuffer -q -v 0 -s 128k -m 1G | zfs receive -vF $backpool" &>> $logfile

    log_last_command "Sending full backup to the remote machine" true
fi


####################################### Remote part #######################################################

write_to_log "Remote keeping is complete"
exit 0


zfskeepall.sh


Um mehrere Abschnitte in Ton zu halten, benötigen Sie ein Steuerungsskript. Jeder kann es je nach Konfiguration bereits nach seinem Geschmack und seiner Farbe schaffen. Mein Test sieht so aus:

#!/bin/bash
scriptpath=/home/replicator/zfskeeper.sh
$scriptpath bank/encrypted/subvol-100-disk-0 5 RemoteHost 22 30m replicator bank/rtl/subvol-100-disk-0 5 -w

Bestehende Lösungen


Ich habe es zuerst gefunden und anhand dessen die allgemeine Funktionsfähigkeit des Mechanismus überprüft. Dank der Autoren, aber der Schreibstil ist ziemlich schmutzig, musste er eindeutig umgeschrieben werden.

zfs-auto-snapshot.sh ist nur ein Block. Es gibt etwas zu leihen, schön, ordentlich, aber sperrig und wenig funktionsfähig

zfsbackup.sh - auch ein ordentliches, aber wenig funktionierendes

PS Ich habe das zfs ab dem dritten Mal gebissen , jedes Mal, wenn es etwa einen Monat lang knabberte. Ich konnte sie nicht schnell zur Arbeit bringen und scheiterte in vollen Zügen. Im Allgemeinen hat sich die Situation nach der Installation von SAS-Festplatten geändert (mindestens 7200, mindestens NL).

Frieden für alle! Danke fürs Lesen!

All Articles