कैसे एक तरह से पूरे zfs पूल के लिए एक और zfs पूल का दर्पण


16

मेरे पास एक zfs पूल है जिसमें कई zvols और डेटासेट हैं जिनमें से कुछ नेस्टेड भी हैं। सभी डेटासेट और zvols समय-समय पर zfs-auto-snapshot द्वारा स्नैपशॉट किए जाते हैं। सभी डेटासेट और zvols में कुछ मैन्युअल रूप से बनाए गए स्नैपशॉट भी हैं।

मेरे पास एक दूरस्थ पूल है, जिस पर समय की कमी के कारण, zfs सेंड के माध्यम से स्थानीय हाई स्पीड नेटवर्क पर प्रारंभिक प्रतिलिपि पूरी नहीं हुई (कुछ डेटासेट गायब हैं, कुछ डेटासेट पुराने या गायब स्नैपशॉट हैं)।

अब पूल शारीरिक रूप से एक धीमी गति के कनेक्शन पर दूरस्थ है और मुझे समय-समय पर दूरस्थ पूल को स्थानीय पूल के साथ सिंक करने की आवश्यकता होती है, जिसका अर्थ है कि स्थानीय पूल में मौजूद डेटा को दूरस्थ पूल में कॉपी किया जाना चाहिए, स्थानीय पूल से गए डेटा को दूरस्थ पूल से हटा दिया जाना चाहिए, और रिमोट पूल में मौजूद डेटा लेकिन लोकल पूल में मौजूद डेटा को 'zvols', 'डेटासेट' या 'स्नैपशॉट्स' द्वारा रिमोट पूल से डिलीट नहीं किया जाना चाहिए।

अगर मैं rsync का उपयोग करते हुए दो नियमित फाइल सिस्टम के बीच कर रहा था, तो यह "-axPHAX --delete" होगा (यह वही है जो मैं वास्तव में कुछ सिस्टम का बैकअप लेने के लिए करता हूं)।

मैं एक सिंक्रोनाइज़िंग कार्य को कैसे सेट करूं ताकि रिमोट पूल zvols & डेटासेट (उनके स्नैपशॉट सहित) स्थानीय zvols, डेटासेट और स्नैपशॉट के साथ सिंक हो सके?

मैं ssh के स्थानांतरण से बचना चाहूँगा, क्योंकि ssh का प्रदर्शन कम होता है; मैं इसके बजाय mbuffer या iscsi पसंद करूंगा।


आपने अपना प्रारंभिक कार्य कैसे किया zfs send -R ...? यदि आपने आउटपुट को पाइप sshकिया है, तो क्या आपने भागने के पात्रों को निष्क्रिय कर दिया है zfs send -R ... | ssh -e none ...?
एंड्रयू हेनले

इसके अलावा - आपको यह सुनिश्चित करने की आवश्यकता है कि आपके धीमे कनेक्शन में दूरस्थ कॉपी अप-टू-डेट रखने के लिए पर्याप्त बैंडविड्थ है। यदि आप रिमोट सिस्टम को भेज सकते हैं, तो आप स्थानीय सिस्टम में अधिक परिवर्तन कर रहे हैं, आप कभी भी रिमोट कॉपी को अप-टू-डेट नहीं रख पाएंगे। वृद्धिशील zfs प्रतिकृति स्ट्रीम लें और इसे किसी फ़ाइल में सहेजें। यदि फ़ाइल स्नैपशॉट के बीच की राशि में दूरस्थ साइट पर भेजे जाने वाले डेटा की मात्रा से बड़ी है, तो आप कभी भी अपडेट नहीं करेंगे। zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
एंड्रयू हेनले

आप इसे स्वचालित रूप से करने के लिए इस स्क्रिप्ट का उपयोग करने का प्रयास कर सकते हैं: github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting

जवाबों:


12

अस्वीकरण: जैसा कि मैंने कभी zvols का उपयोग नहीं किया है, मैं नहीं कह सकता कि क्या वे सामान्य फाइलसिस्टम या स्नैपशॉट की तुलना में प्रतिकृति में भिन्न हैं। मुझे लगता है कि वे हैं, लेकिन इसके लिए मेरे शब्द नहीं लेते हैं।


आपका प्रश्न वास्तव में कई प्रश्न हैं, मैं उन्हें अलग से उत्तर देने का प्रयास करता हूं:

दूरस्थ स्थान के लिए पूर्ण पूल को दोहराने / दर्पण कैसे करें

आपको कार्य को दो भागों में विभाजित करने की आवश्यकता है: पहला, प्रारंभिक प्रतिकृति को पूरा करना होगा, इसके बाद वृद्धिशील प्रतिकृति संभव है, जब तक आप अपने प्रतिकृति स्नैपशॉट के साथ गड़बड़ नहीं करते । वृद्धिशील प्रतिकृति को सक्षम करने के लिए, आपको अंतिम प्रतिकृति स्नैपशॉट को संरक्षित करने की आवश्यकता है, इससे पहले कि सब कुछ हटाया जा सकता है। यदि आप पिछले स्नैपशॉट को हटाते हैं, zfs recvतो प्रतिकृति को शिकायत और निरस्त कर देगा। इस मामले में आपको फिर से शुरू करना होगा, इसलिए कोशिश करें कि ऐसा न करें।

यदि आपको सही विकल्पों की आवश्यकता है, तो वे हैं:

  • zfs send:
    • -R: दिए गए पूल या डेटासेट (पुनरावर्ती प्रतिकृति, हर समय आवश्यक, शामिल है -p) के तहत सब कुछ भेजें । इसके अलावा, प्राप्त करते समय, सभी हटाए गए स्रोत स्नैपशॉट गंतव्य पर हटा दिए जाते हैं।
    • -I: अंतिम प्रतिकृति स्नैपशॉट और वर्तमान प्रतिकृति स्नैपशॉट के बीच सभी मध्यवर्ती स्नैपशॉट शामिल करें (केवल वृद्धिशील भेजने के साथ आवश्यक)
  • zfs recv:
    • -F: स्रोत पर हटाए गए मौजूदा डेटासेट को हटाने सहित लक्ष्य पूल का विस्तार करें
    • -d: स्रोत पूल के नाम को छोड़ दें और इसे गंतव्य पूल के नाम से बदल दें (बाकी फ़ाइल सिस्टम पथ संरक्षित किए जाएंगे, और यदि आवश्यक हो तो भी बनाया जाएगा)
    • -u: गंतव्य पर फ़ाइल सिस्टम माउंट न करें

यदि आप एक पूर्ण उदाहरण पसंद करते हैं, तो यहां एक छोटी स्क्रिप्ट है:

#!/bin/sh

# Setup/variables:

# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"

# Incremental sends:

# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
    zfs destroy "$snap"
done

SSH की तुलना में तेजी से कुछ का उपयोग करें

यदि आपके पास पर्याप्त रूप से सुरक्षित कनेक्शन है, उदाहरण के लिए IPSec या OpenVPN सुरंग और एक अलग वीएलएएन जो केवल प्रेषक और रिसीवर के बीच मौजूद है, तो आप SSH से अनएन्क्रिप्टेड विकल्प जैसे कि mbuffer के रूप में यहां बताए गए हैं , या आप SSH का उपयोग कमजोर / बिना एन्क्रिप्शन के कर सकते हैं। और अक्षम संपीड़न, जो यहां विस्तृत है । SSH को फिर से तेज़ करने के बारे में एक वेबसाइट भी थी, लेकिन दुर्भाग्य से मुझे URL याद नहीं है - अगर मुझे यह मिला तो बाद में इसे संपादित करूँगा।

बहुत बड़े डेटासेट और धीमे कनेक्शन के लिए, यह हार्ड डिस्क के माध्यम से पहले ट्रांसमिशन के लिए भी उपयोगी हो सकता है (ज़ूल को स्टोर करने के लिए एन्क्रिप्टेड डिस्क का उपयोग करें और इसे कूरियर, मेल या व्यक्ति के माध्यम से सील पैकेज में प्रसारित करें)। चूंकि ट्रांसमिशन का तरीका सेंड / रिकव के लिए मायने नहीं रखता है, आप डिस्क में सब कुछ पाइप कर सकते हैं, पूल को एक्सपोर्ट कर सकते हैं, डिस्क को उसके गंतव्य पर भेज सकते हैं, पूल को इंपोर्ट कर सकते हैं और फिर SSH के माध्यम से सभी इंक्रीमेंटल सेंड को ट्रांसमिट कर सकते हैं।

गड़बड़ फोटो के साथ समस्या

जैसा कि पहले कहा गया था, यदि आप अपने प्रतिकृति स्नैपशॉट को हटाते / संशोधित करते हैं, तो आपको त्रुटि संदेश प्राप्त होगा

cannot send 'pool/fs@name': not an earlier snapshot from the same fs

जिसका अर्थ है कि या तो आपकी आज्ञा गलत थी या आप एक असंगत स्थिति में हैं, जहां आपको स्नैपशॉट को निकालना होगा और सभी पर शुरू करना होगा।

इसके कई नकारात्मक प्रभाव हैं:

  1. जब तक नया प्रतिकृति स्नैपशॉट सफलतापूर्वक स्थानांतरित नहीं हो जाता, तब तक आप प्रतिकृति स्नैपशॉट को हटा नहीं सकते। जैसा कि इन प्रतिकृति स्नैपशॉट में अन्य सभी (पुराने) स्नैपशॉट की स्थिति शामिल है, हटाए गए फ़ाइलों और स्नैपशॉट की खाली जगह केवल तभी पुनर्प्राप्त की जाएगी यदि प्रतिकृति समाप्त हो जाती है। यह आपके पूल पर अस्थायी या स्थायी अंतरिक्ष समस्याओं को जन्म दे सकता है जिसे आप केवल पूरी प्रतिकृति प्रक्रिया को पुनरारंभ या समाप्त करके ठीक कर सकते हैं।
  2. आपके पास कई अतिरिक्त स्नैपशॉट होंगे, जो सूची कमांड को धीमा कर देते हैं (ओरेकल सोलारिस 11 को छोड़कर, जहां यह तय किया गया था)।
  3. आपको स्क्रिप्ट को छोड़कर, (आकस्मिक) हटाने के खिलाफ स्नैपशॉट की सुरक्षा करने की आवश्यकता हो सकती है।

उन समस्याओं का एक संभावित समाधान मौजूद है, लेकिन मैंने इसे स्वयं करने की कोशिश नहीं की है। आप zfs bookmarkइस कार्य के लिए विशेष रूप से बनाए गए OpenSolaris / illumos में एक नई सुविधा का उपयोग कर सकते हैं । यह आपको स्नैपशॉट प्रबंधन से मुक्त करेगा। केवल नकारात्मक पक्ष यह है कि वर्तमान में, यह केवल एकल डेटासेट के लिए काम करता है, न कि पुनरावर्ती। आपको अपने सभी पुराने और नए डेटासेट की एक सूची को सहेजना होगा और फिर उन पर लूप करना होगा, बुकमार्क करना, उन्हें भेजना और प्राप्त करना होगा, और फिर सूची को अपडेट करना होगा (या छोटा डेटाबेस, यदि आप चाहें)।

यदि आप बुकमार्क रूट की कोशिश करते हैं, तो मुझे यह सुनने में दिलचस्पी होगी कि यह आपके लिए कैसे काम करता है!


इस विस्तृत उत्तर के लिए बहुत-बहुत धन्यवाद। मैं सिर्फ भेज रहा हूं..सचिव-आईएनजी ए zpool
घबराना

1
अच्छी पटकथा। मैं खोज गहराई को सीमित करने के -d 1लिए दोनों zfs listआदेशों को जोड़ूंगा (पूल नाम के नीचे खोज करने की कोई आवश्यकता नहीं है)। यह बहुत सारे स्नैपशॉट के साथ पूल पर देरी से बचाता है (उदाहरण के लिए मेरे "बैकअप" पूल में 320000 स्नैपशॉट हैं, और zfs list -r -t snapshot backupचलाने में 13 मिनट लगते हैं। इसमें केवल 0.06 सेकंड का समय लगता है -d 1)। zfs destroyपाश के लिए में आदेश तो जरूरत -rरिकर्सिवली ही snapname के साथ सभी स्नैपशॉट हटाने का विकल्प।
कैस

5

व्यक्तिगत रूप से, मैं अपने आप को zvols की एक सूची बनाना होगा, डेटासेट आदि दूरस्थ सर्वर पर है कि नहीं है स्नैपशॉट अप-टू-डेट है, और फिर उन स्नैपशॉट के साथ तारीख तक लाने के zfs sendलिए, भले ही इस समय लेने वाली है और एक बहुत का उपयोग करता है बैंडविड्थ की।

तब मैं बस zfs sendतब से उपयोग करना जारी रख सकता था और मुझे अपना सिंक्रनाइज़ेशन कोड लिखकर पहिया को फिर से मजबूत नहीं करना था। rsyncपुराने फाइल सिस्टम के लिए अच्छा है, लेकिन zfs sendzfs के लिए बहुत बेहतर है - यह जानता है कि कौन से ब्लॉक स्नैपशॉट में बदल गए हैं और केवल उन्हें भेजता है, जबकि rsync को स्थानीय और दूरस्थ सर्वर के बीच व्यक्तिगत फ़ाइलों और / या टाइमस्टैम्प की तुलना करनी होती है। वही btrfs sendbtrfs पूल के लिए लागू होता है ।

यदि आपके पास केवल बहुत कम स्नैपशॉट हैं जिन्हें अप-टू-डेट लाने की आवश्यकता है, तो यह मैन्युअल रूप से किया जा सकता है। अन्यथा इसे स्वचालित रूप से करने के लिए, आपको नवीनतम स्थानीय स्नैपशॉट बनाम दूरस्थ स्नैपशॉट की एक सूची और संस्करणों की तुलना करने के लिए एक स्क्रिप्ट की आवश्यकता होती है और फिर zfs sendस्थानीय स्नैपशॉट जो कि rmeote सर्वर पर पुराने हैं।

यदि आप केवल प्रत्येक डेटासेट के लिए नवीनतम स्नैपशॉट की परवाह करते हैं तो यह पर्याप्त होगा। यदि आप पिछले सभी स्नैपशॉट्स की परवाह करते हैं, तो जाहिर है कि आपकी स्क्रिप्ट को उन्हें भी संभालना होगा .... और यह बहुत अधिक जटिल हो जाता है। कुछ मामलों में, आपको दूरस्थ सर्वर पर रोलबैक करना पड़ सकता है ताकि आप मध्यवर्ती / लापता स्नैपशॉट को फिर से भेज सकें।

यदि आप दूरस्थ सर्वर के लिए एक सुरक्षित कनेक्शन चाहते हैं, तो आपको वास्तव में उपयोग करने के लिए बहुत कम विकल्प sshमिलेंगे - या शायद openvpnया कुछ और उपयोग के साथ एक सुरंग स्थापित करें netcat


Zrep का उपयोग करने के बारे में क्या? bolthole.com/solaris/zrep
Xdg

dunno, यह कभी नहीं इस्तेमाल किया। ऐसा लगता है कि यह एक अच्छा जवाब होगा, हालांकि अगर किसी को थोड़ा शोध और परीक्षण करना था और इसे लिखना (यह एक संकेत है)।
कैस

मैंने इसे उबंटू (लिनक्स पर जेडएफएस) पर परीक्षण किया है और यह गहरे डेटासेट (टैंक / कुछ / कुछ उपकरण) पर काम नहीं कर रहा था। मैं इस पोर्ट को शेल - लिंक का उपयोग कर रहा था । पुनरावर्ती ध्वज export ZREP_R=-Rबिल्कुल काम नहीं कर रहा था। :(
Xdg

1

FreeBSD पर `zrepl 'पर एक नज़र डालें, जो आपके जीवन और उस मामले के लिए किसी को भी आसान बना सकता है। इसे कुछ दिनों पहले ओटावा में BSDCan2018 के दौरान पेश किया गया था। यह आशाजनक लग रहा है और आपकी समस्याओं का समाधान हो सकता है



प्रश्न में प्रश्न यह है: "मैं एक सिंक्रोनाइज़िंग टास्क को कैसे सेटअप करता हूं ताकि रिमोट पूल zvols & डेटासेट (उनके स्नैपशॉट सहित) स्थानीय zvols, डेटासेट और स्नैपशॉट के साथ सिंक हो सके?"
जेफ स्कालर

0

zrep एक अच्छा ऑल-इन-वन सॉल्यूशन है, और इसमें प्रलेखन + हुक है कि कैसे तेज ट्रांसफर की तुलना में केवल सादे JH स्थानान्तरण

https://github.com/bolthole/zrep

यह भी crossplatform है: Linux, freebsd और Solaris / illumos पर समर्थित



1
प्रश्न में प्रश्न यह है: "मैं एक सिंक्रोनाइज़िंग टास्क को कैसे सेटअप करता हूं ताकि रिमोट पूल zvols & डेटासेट (उनके स्नैपशॉट सहित) स्थानीय zvols, डेटासेट और स्नैपशॉट के साथ सिंक हो सके?"
जेफ स्कालर

जेफ, क्या आप सुझाव दे रहे हैं कि सबसे अच्छा "उत्तर" होगा, केवल zrep का संदर्भ देने के बजाय zrep प्रलेखन से बिट्स को n-पेस्ट करना होगा?
फिलिप ब्राउन

1
मुझे नहीं पता कि सबसे अच्छा जवाब क्या होगा, लेकिन सॉफ्टवेयर का लिंक समाधान नहीं है। यह पहले से ही उल्लेख किया गया है, वास्तव में। सवाल पूछता है: "मैं एक सिंक्रोनाइज़िंग टास्क को कैसे सेटअप करूं ताकि रिमोट ज़्वॉल्स और डेटासेट (उनके स्नैपशॉट सहित) स्थानीय ज़्वॉल्स, डेटासेट्स और स्नैपशॉट्स के साथ सिंक हो सकें?"
जेफ स्कालर

हाँ, यह सवाल है। हालाँकि, WELL कार्य को पूरा करने के लिए, यहां वेबपेज पर एक छोटे से राइटअप की तुलना में बहुत अधिक की आवश्यकता होती है। यही कारण है कि zrep 2000 लाइन शेलस्क्रिप्ट है। यहां तक ​​कि अगर किसी को उन सभी हिस्सों को हटाने की आवश्यकता होती है जो मूल समस्या की आवश्यकता नहीं थी, तब भी स्क्रिप्ट की एक दो सौ पंक्तियां होंगी जो इसे करना आवश्यक है।
फिलिप ब्राउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.