Cadangan ZFS inkremental jarak jauh. Tidak ada tempat yang lebih mudah

Amankan saudaramu, amankan ...


ZFS 0.8 memiliki kemampuan untuk mengirim snapshot inkremental data terenkripsi tanpa mendekripsi. Artinya, memiliki array terenkripsi, Anda dapat mengatur salinan cermin itu pada mesin jarak jauh, tidak mempercayai pemilik tempat jauh. Data kunci dan dekripsi tidak meninggalkan tempat tepercaya.

Tidak ada satu pun klien saya (mikrokontroler) yang memiliki lebih dari satu ruang server, jika kebakaran datang ke sana, misalnya bintang. Setelah sepakat dengan kolega Anda dalam bisnis admin yang berbahaya, Anda dapat saling melindungi satu sama lain tanpa takut mereka mungkin menggunakan data tersebut.

Setiap layanan dalam bentuk mesin virtual diinstal pada Proxmox, di mana data berada di ZFS, dan Anda akan selalu memiliki kesempatan untuk menyimpan salinan jarak jauh dari mesin virtual tersebut. Ada kemungkinan bahwa suatu hari, alih-alih jatuh dalam kesedihan, Anda akan pergi ke ruang terpencil, mengambil sepotong besi dan menjalankan semua layanan dengan kesehatan yang baik. Saya sudah mentransfer hampir semua layanan saya ke Proxmox sekitar 2 tahun yang lalu dan saya tidak menyesal, semuanya bekerja dengan baik. Di ZFS, saya memiliki server terminal untuk 30 orang, yang terkait dengan klien tipis (yaitu, 30 pekerjaan penuh). Selain salinan saat ini, Anda juga akan memiliki snapshot selama x hari terakhir baik secara lokal maupun jarak jauh.

Ya, Anda akan kehilangan produktivitas karena penggunaan zfs dan enkripsi, tetapi untuk diri saya sendiri sampai pada kesimpulan bahwa saya siap membayar harga ini untuk fungsionalitas tersebut.

Satu sendok tar


Saat mengatasinya Anda segera terbang dalam salep. Ya, ZFS lebih lambat. Intinya. Tetapi Anda tidak dapat menggunakannya sebagai fs biasa. Ini harus bekerja dalam array disk, di mana peningkatan jumlah disk diterima, disk sebaiknya SAS, controller harus bekerja dalam mode HBA (dan bukan raid0 sebagai disk tunggal), harus ada RAM ECC dan harus banyak, harus ada satu, harus ada satu SSD (PCI-E yang lebih baik) sebagai cache untuk membaca level kedua (kecil, pertunjukan dari 64) dan satu SSD untuk ZIL bisa sangat kecil, tetapi lebih disukai MLC.

Mengenai SSD, saya memakai rekomendasi ini dan membeli 2 PCI-E SSD 128 dan masing-masing dibagi menjadi 16 pertunjukan dan sisanya. Saya meluncurkan dua partisi 16 gigabyte di ZIL sebagai mirror dan meluncurkan bagian yang tersisa di bawah cache level kedua sebagai stripe. Pada belas kasihan zfs memberi 16 pertunjukan opera. (Satu slot pada seorang ibu yang dibeli dengan ebay ternyata tidak berfungsi; jika berhasil, itu akan memberi 32)

zfskeeper.sh


Dari skrip saya membutuhkan pemberitahuan masalah secara otomatis, memantau jumlah buncis di kedua ujungnya dan kontrol kecepatan. Dari skrip yang jatuh ke tangan saya, tidak ada skrip yang memuaskan saya. Di bawah ini saya akan memberikan beberapa skrip yang saya ulas sebelum melakukan ini. Untuk menerima pemberitahuan melalui email, ganti data saya di fungsi send_error_to_mail () Anda dengan

bantuan zfskeeper.sh Anda akan menunjukkan kepada Anda contoh penggunaan
zfskeeper.sh prep akan memberi tahu Anda prosedur tindakan persiapan (disarankan)
bank zfskeeper.sh / terenkripsi / subvol-100-disk-0 10 akan mengambil snapshot saat ini dan meninggalkan 10 snapshot
terakhir bank zfskeeper.sh / terenkripsi / subvol-100-disk-0 10 Remotehost 22 10m bank replikator / rtl / subvol-100-disk-0 20Kirim data yang tidak terenkripsi ke remotehost: 22 di bawah replikator pengguna dengan kecepatan hingga 10 MB / s dan meninggalkan 10 gambar pada sumber dan 20 pada host remote
zfskeeper.sh bank / terenkripsi / subvol-100-disk-0 10 Remotehost 22 bank 10m replikator / rtl / subvol -100-disk-0 20 -w hal yang sama, tetapi data akan dienkripsi

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


Untuk menjaga agar beberapa bagian tetap kencang, Anda memerlukan skrip kontrol. Semua orang sudah bisa membuatnya sesuai selera dan warna, tergantung pada konfigurasi. Tes saya terlihat seperti ini:

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

Solusi yang ada


Saya menemukannya pertama kali, atas dasar itu saya memeriksa keseluruhan operabilitas mekanisme. Terima kasih kepada penulis, tetapi gaya penulisan agak kotor, harus ditulis ulang dengan jelas.

zfs-auto-snapshot.sh hanyalah sebuah blok. Ada sesuatu untuk dipinjam, indah, rapi, tapi besar dan fungsional

rendah zfsbackup.sh - juga

PS yang rapi, tapi rendah fungsional. Saya menggigit zfs dari ketiga kalinya, setiap kali saya menggigiti sekitar sebulan. Saya tidak bisa membuatnya bekerja dengan cepat, dan gagal sepenuhnya. Secara umum, situasi berubah setelah menginstal disk SAS (setidaknya 7200, setidaknya NL).

Damai untuk semua orang! Terima kasih telah membaca!

All Articles