Backups incrementais remotos do ZFS. Nenhum lugar mais fácil

Garanta seu irmão, garanta ...


O ZFS 0.8 tem a capacidade de enviar instantâneos incrementais de dados criptografados sem descriptografar. Ou seja, com uma matriz criptografada, você pode organizar uma cópia espelhada em uma máquina remota, não confiando no proprietário das instalações remotas. Os dados chave e descriptografados não saem das instalações confiáveis.

Nenhum dos meus clientes (microcontroladores) possui mais de uma sala de servidores, se ocorrer um incêndio, por exemplo, uma estrela. Depois de concordar com seu colega em um negócio administrativo perigoso, você pode se proteger mutuamente, sem medo de que eles usem os dados.

Qualquer serviço na forma de uma máquina virtual é instalado no Proxmox, onde os dados estão localizados no ZFS, e você sempre terá a oportunidade de armazenar uma cópia remota da máquina virtual. Há uma chance de que um dia, em vez de cair em desânimo, você vá para uma sala remota, pegue um pedaço de ferro e administre todos os serviços com boa saúde. Já transferi quase todos os meus serviços para o Proxmox há cerca de 2 anos e não me arrependo, tudo funciona bem. No ZFS, tenho um servidor de terminal para 30 pessoas, vinculado a thin clients (ou seja, 30 trabalhos completos). Além da cópia atual, você também terá instantâneos nos últimos x dias, local e remotamente.

Sim, você perderá a produtividade com o próprio uso do zfs e da criptografia, mas por mim cheguei à conclusão de que estava pronto para pagar esse preço por essa funcionalidade.

Uma colher de alcatrão


No equipamento você voa imediatamente na pomada. Sim, o ZFS é mais lento. Essencialmente. Mas você não pode usá-lo como um fs regular. Ele deve funcionar em uma variedade de discos, onde um aumento no número de discos é bem-vindo, os discos devem ser preferencialmente SAS, o controlador deve funcionar no modo HBA (e não raid0 como discos únicos), deve haver ECC RAM e deve haver muitos, deve haver um O SSD (melhor PCI-E) como cache para leitura do segundo nível (pequeno, shows a partir de 64) e um SSD para ZIL podem ser muito pequenos, mas de preferência MLC.

Em relação ao SSD, eu fiz essas recomendações e comprei 2 SSDs PCI-E de 128 e cada um dividido em 16 shows e o restante. Lancei duas partições de 16 gigabytes no ZIL como um espelho e lancei as partes restantes no cache do segundo nível como faixa. À mercê de zfs deu 16 shows de ópera. (Um slot em uma mãe comprada com o ebay acabou inoperante; se funcionasse, daria 32)

zfskeeper.sh


No script, eu precisava de notificação automática de problemas, monitorando o número de snaps nas extremidades e o controle de velocidade. Dos scripts que caíram em minhas mãos, não houve scripts que me satisfizessem. Abaixo, darei alguns dos scripts que revi antes de fazer isso. Para receber notificações por e-mail, substitua meus dados na sua função send_error_to_mail () pela sua

zfskeeper.sh A ajuda mostrará exemplos de uso O
zfskeeper.sh prepare mostrará o procedimento para as ações preparatórias (recomendado)
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 tira o instantâneo atual e deixa os últimos 10 instantâneos
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 22 banco de replicadores de 10m / rtl / subvol-100-disk-0 20Envie dados não criptografados para remotehost: 22 no replicador de usuário com uma velocidade de até 10 MB / se deixe 10 imagens na origem e 20 no host remoto
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol -100-disk-0 20 -w a mesma coisa, mas os dados serão criptografados

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


Para manter várias seções tonificadas, você precisa de um script de controle. Todo mundo já pode ter o seu gosto e cor, dependendo da configuração. Meu teste é assim:

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

Soluções existentes


Eu o encontrei primeiro, com base nisso, verifiquei a operacionalidade geral do mecanismo. Graças aos autores, mas o estilo de escrever é bastante sujo, teve que ser reescrito sem ambiguidade.

O zfs-auto-snapshot.sh é apenas um bloco. Há algo para pedir emprestado,

zfsbackup.sh bonito, elegante, mas volumoso e com baixa funcionalidade - também um

PS limpo, mas com baixa funcionalidade . Não consegui fazê-la trabalhar rapidamente e, ao máximo, falhei. Em geral, a situação mudou após a instalação dos discos SAS (pelo menos 7200, pelo menos NL).

Paz para todos! Obrigado pela leitura!

All Articles