Sauvegardes incrémentielles ZFS distantes. Nulle part plus facile

Sécurisez votre frère, sécurisez ...


ZFS 0.8 a la capacité d'envoyer des instantanés incrémentiels de données chiffrées sans déchiffrement. Autrement dit, en ayant une baie chiffrée, vous pouvez en organiser une copie miroir sur une machine distante, sans faire confiance au propriétaire des locaux distants. La clé et les données déchiffrées ne quittent pas les locaux de confiance.

Aucun de mes clients (microcontrôleurs) n'a plus d'une salle de serveurs, si un incendie y arrive, par exemple une étoile. Après avoir convenu avec votre collègue dans une entreprise d'administration dangereuse, vous pouvez vous assurer mutuellement sans craindre qu'ils puissent utiliser les données.

Tout service sous la forme d'une machine virtuelle est installé sur Proxmox, où les données se trouvent sur ZFS, et vous aurez toujours la possibilité de stocker une copie distante de la machine virtuelle. Il y a une chance qu'un jour, au lieu de tomber dans le découragement, vous irez dans une pièce isolée, ramasserez un morceau de fer et exécuterez tous les services en bonne santé. J'ai déjà transféré presque tous mes services à Proxmox il y a environ 2 ans et je n'ai aucun regret, tout fonctionne bien. Sur ZFS, j'ai un serveur terminal pour 30 personnes, qui est lié à des clients légers (c'est-à-dire 30 emplois à part entière). En plus de la copie actuelle, vous aurez également des instantanés pour les x derniers jours à la fois localement et à distance.

Oui, vous perdrez la productivité de l'utilisation même de zfs et du cryptage, mais pour moi, je suis arrivé à la conclusion que j'étais prêt à payer ce prix pour une telle fonctionnalité.

Une cuillère de goudron


En tacle, vous volez immédiatement dans la pommade. Oui, ZFS est plus lent. Essentiellement. Mais vous ne pouvez pas l'utiliser comme un fs ordinaire. Il devrait fonctionner dans un ensemble de disques, où une augmentation du nombre de disques est la bienvenue, les disques devraient de préférence être SAS, le contrôleur devrait fonctionner en mode HBA (et non raid0 en tant que disques simples), il devrait y avoir de la RAM ECC et il devrait y en avoir beaucoup, il doit y en avoir un SSD (meilleur PCI-E) comme cache pour la lecture du deuxième niveau (petit, concerts à partir de 64) et un SSD pour ZIL peut être très petit, mais de préférence MLC.

En ce qui concerne le SSD, j'ai mis ces recommandations et acheté 2 SSD PCI-E de 128 et chacun divisé en 16 concerts et le reste. J'ai lancé deux partitions de 16 gigaoctets dans ZIL en tant que miroir et lancé les parties restantes sous le cache de deuxième niveau en tant que stripe. À la merci de zfs a donné 16 concerts d'opéra. (Une fente sur une mère achetée avec ebay s'est avérée inopérante; si cela fonctionnait, cela donnerait 32)

zfskeeper.sh


À partir du script, j'avais besoin d'une notification automatique des problèmes, de la surveillance du nombre de clichés aux deux extrémités et du contrôle de la vitesse. Parmi les scripts qui sont tombés entre mes mains, aucun script ne m'a satisfait. Ci-dessous, je donnerai certains des scripts que j'ai examinés avant de le faire. Pour recevoir des notifications par e-mail, remplacez mes données dans votre fonction send_error_to_mail () par votre

aide zfskeeper.sh vous montrera des exemples d'utilisation
zfskeeper.sh prepare vous indiquera la procédure pour les actions préparatoires (recommandé)
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 prendra l'instantané actuel et laissera les 10 derniers instantanés
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol-100-disk-0 20Envoyer des données non chiffrées à l'hôte distant: 22 sous le réplicateur d'utilisateur avec une vitesse allant jusqu'à 10 Mo / s et laisser 10 images sur la source et 20 sur l'hôte distant
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol -100-disk-0 20 -w la même chose, mais les données seront cryptées

#!/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


Afin de conserver plusieurs sections toniques, vous avez besoin d'un script de contrôle. Tout le monde peut déjà le faire selon son goût et sa couleur, selon la configuration. Mon test ressemble à ceci:

#!/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

Solutions existantes


Je l'ai trouvé en premier, sur la base de cela, j'ai vérifié l'opérabilité globale du mécanisme. Merci aux auteurs, mais le style d'écriture est plutôt sale, il a fallu le réécrire sans ambiguïté.

zfs-auto-snapshot.sh n'est qu'un bloc. Il y a quelque chose à emprunter, beau, soigné, mais volumineux et

peu fonctionnel zfsbackup.sh - également un

PS soigné, mais peu fonctionnel J'ai mordu le zfs à partir de la troisième fois, chaque fois qu'il a grignoté pendant environ un mois. Je ne pouvais pas la faire travailler rapidement et j'ai complètement échoué. En général, la situation a changé après l'installation de disques SAS (au moins 7200, au moins NL).

Paix pour tous! Merci pour la lecture!

All Articles