النسخ الاحتياطية الإضافية لـ ZFS. أسهل من أي مكان

قم بتأمين أخيك ، آمن ...


ZFS 0.8 لديه القدرة على إرسال لقطات إضافية للبيانات المشفرة دون فك تشفيرها. أي ، بعد وجود مصفوفة مشفرة ، يمكنك تنظيم نسخة طبق الأصل منها على جهاز بعيد ، دون الوثوق بمالك المبنى البعيد. لا تترك البيانات الرئيسية والبيانات التي تم فك تشفيرها المباني الموثوقة.

لا يوجد لدى أي من عملائي (المتحكمون الدقيقون) أكثر من غرفة خادم واحدة ، إذا حدث حريق هناك ، على سبيل المثال ، نجمة. بعد الاتفاق مع زميلك في نشاط إداري خطير ، يمكنك تأمين بعضكما البعض دون خوف من استخدام البيانات.

يتم تثبيت أي خدمة على شكل جهاز افتراضي على Proxmox ، حيث توجد البيانات على ZFS ، وستتاح لك دائمًا فرصة تخزين نسخة عن بُعد من الجهاز الظاهري. هناك فرصة أنه في يوم ما بدلاً من الوقوع في اليأس ، ستذهب إلى غرفة نائية ، وتلتقط قطعة من الحديد وتدير جميع الخدمات بصحة جيدة. لقد نقلت بالفعل جميع خدماتي تقريبًا إلى Proxmox منذ حوالي عامين وليس لدي أي ندم ، كل شيء يعمل بشكل جيد. في ZFS ، لدي خادم طرفي لـ 30 شخصًا ، مرتبطًا بالعملاء الرقيقين (أي 30 وظيفة كاملة). بالإضافة إلى النسخة الحالية ، سيكون لديك أيضًا لقطات للأيام x الأخيرة محليًا وعن بُعد.

نعم ، ستفقد الإنتاجية من استخدام zfs ومن التشفير ، لكني توصلت إلى استنتاج مفاده أنني كنت مستعدًا لدفع هذا السعر مقابل هذه الوظيفة.

ملعقة من القطران


في معالجة أنت تطير على الفور في المرهم. نعم ، ZFS أبطأ. بشكل أساسي. ولكن لا يمكنك استخدامه كسرية منتظمة. يجب أن تعمل في مجموعة من الأقراص ، حيث تكون الزيادة في عدد الأقراص مرحب بها ، يفضل أن تكون الأقراص SAS ، يجب أن تعمل وحدة التحكم في وضع HBA (وليس raid0 كأقراص فردية) ، يجب أن يكون هناك ECC RAM ويجب أن يكون هناك العديد ، يجب أن يكون هناك واحد يمكن أن يكون SSD (PCI-E الأفضل) كذاكرة تخزين مؤقت لقراءة المستوى الثاني (صغير ، العربات من 64) وواحد SSD لـ ZIL صغيرًا جدًا ، ولكن يفضل MLC.

فيما يتعلق SSD ، وضعت هذه التوصيات واشتريت 2 PCI-E SSDs من 128 وكل منها مقسم إلى 16 العربات والباقي. أطلقت جزأين بسعة 16 غيغابايت في ZIL كمرآة وأطلقت الأجزاء المتبقية تحت ذاكرة التخزين المؤقت من المستوى الثاني كخط. تحت رحمة zfs أعطى 16 العربات من الأوبرا. (تبين أن فتحة واحدة على الأم التي تم شراؤها باستخدام موقع ئي باي كانت غير عاملة ؛ إذا نجحت ، فستعطي 32)

zfskeeper.sh


من النص ، كنت بحاجة إلى إشعار تلقائي بالمشكلات ، ومراقبة عدد اللقطات في كلا الطرفين والتحكم في السرعة. من النصوص التي سقطت في يدي ، لم تكن هناك نصوص ترضيني. أدناه سأقدم بعض النصوص التي راجعتها قبل القيام بذلك. لتلقي الإشعارات عن طريق البريد الإلكتروني، واستبدال البيانات الخاصة بي في send_error_to_mail الخاص بك () وظيفة مع يدكم

zfskeeper.sh مساعدة سوف تظهر لك أمثلة على استخدام
zfskeeper.sh تحضير سوف اقول لكم إجراءات الإجراءات التحضيرية (موصى به)
البنك zfskeeper.sh / مشفرة / subvol-100-قرص-0 سيأخذ 10 اللقطة الحالية ويترك آخر 10 لقطات
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol-100-disk-0 20إرسال بيانات غير مشفرة إلى remotehost: 22 تحت وحدة النسخ المتماثل للمستخدم بسرعة تصل إلى 10 ميجابايت / ثانية وترك 10 صور على المصدر و 20 على المضيف البعيد
zfskeeper.sh bank / encrypted / subvol-100-disk-0 10 Remotehost 22 10m replicator bank / rtl / subvol -100-disk-0 20 -w نفس الشيء ، ولكن سيتم تشفير البيانات

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


من أجل الحفاظ على تناغم عدة أقسام ، تحتاج إلى برنامج نصي للتحكم. يمكن للجميع الوصول إلى مذاقهم ولونهم ، اعتمادًا على التكوين. يبدو اختباري كما يلي:

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

الحلول الحالية


لقد وجدتها أولاً ، وعلى أساسها راجعت قابلية التشغيل الإجمالية للآلية. بفضل المؤلفين ، لكن أسلوب الكتابة متسخ إلى حد ما ، كان يجب إعادة كتابته بشكل لا لبس فيه.

zfs-auto-snapshot.sh هو مجرد كتلة. هناك شيء ما يمكن استعارته ، جميل ، أنيق ، ولكن

zfsbackup.sh كبير الحجم ومنخفض الوظائف - وهو أيضًا أنيق ، ولكن

منخفض الوظائف PS I بت zfs من المرة الثالثة ، في كل مرة يقضم فيها لمدة شهر تقريبًا. لم أستطع حملها على العمل بسرعة ، وفشلت على أكمل وجه. بشكل عام ، تغير الوضع بعد تثبيت أقراص SAS (على الأقل 7200 ، على الأقل NL).

سلام للجميع! شكرا لقرائتك!

All Articles