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 demRemotehost 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
}
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
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
zfs snapshot $zpool@backup_$NAMESNAP
log_last_command "Create local $zpool@backup_$NAMESNAP" true
if [ -z "$backpool" ]; then
write_to_log "Local keeping is complete"
exit 0
fi
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
exit 0
fi
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
MOST_SLAVE_SNAP_NAME=`$sship zfs list -H -o name -t snapshot -s creation|grep "$backpool@backup"|tail -n1|awk -F "@" '{print $2}'`
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 | 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 [ -n "`$sship zfs list -H -o name -s creation|grep -w "$backpool"`" ]; then
$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 | 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
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ähigzfsbackup.sh - auch ein ordentliches, aber wenig funktionierendesPS 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!