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 suazfskeeper.sh A ajuda mostrará exemplos de uso Ozfskeeper.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âneoszfskeeper.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 remotozfskeeper.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
}
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
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 umPS 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!