अस्वीकरण: जैसा कि मैंने कभी 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
जिसका अर्थ है कि या तो आपकी आज्ञा गलत थी या आप एक असंगत स्थिति में हैं, जहां आपको स्नैपशॉट को निकालना होगा और सभी पर शुरू करना होगा।
इसके कई नकारात्मक प्रभाव हैं:
- जब तक नया प्रतिकृति स्नैपशॉट सफलतापूर्वक स्थानांतरित नहीं हो जाता, तब तक आप प्रतिकृति स्नैपशॉट को हटा नहीं सकते। जैसा कि इन प्रतिकृति स्नैपशॉट में अन्य सभी (पुराने) स्नैपशॉट की स्थिति शामिल है, हटाए गए फ़ाइलों और स्नैपशॉट की खाली जगह केवल तभी पुनर्प्राप्त की जाएगी यदि प्रतिकृति समाप्त हो जाती है। यह आपके पूल पर अस्थायी या स्थायी अंतरिक्ष समस्याओं को जन्म दे सकता है जिसे आप केवल पूरी प्रतिकृति प्रक्रिया को पुनरारंभ या समाप्त करके ठीक कर सकते हैं।
- आपके पास कई अतिरिक्त स्नैपशॉट होंगे, जो सूची कमांड को धीमा कर देते हैं (ओरेकल सोलारिस 11 को छोड़कर, जहां यह तय किया गया था)।
- आपको स्क्रिप्ट को छोड़कर, (आकस्मिक) हटाने के खिलाफ स्नैपशॉट की सुरक्षा करने की आवश्यकता हो सकती है।
उन समस्याओं का एक संभावित समाधान मौजूद है, लेकिन मैंने इसे स्वयं करने की कोशिश नहीं की है। आप zfs bookmark
इस कार्य के लिए विशेष रूप से बनाए गए OpenSolaris / illumos में एक नई सुविधा का उपयोग कर सकते हैं । यह आपको स्नैपशॉट प्रबंधन से मुक्त करेगा। केवल नकारात्मक पक्ष यह है कि वर्तमान में, यह केवल एकल डेटासेट के लिए काम करता है, न कि पुनरावर्ती। आपको अपने सभी पुराने और नए डेटासेट की एक सूची को सहेजना होगा और फिर उन पर लूप करना होगा, बुकमार्क करना, उन्हें भेजना और प्राप्त करना होगा, और फिर सूची को अपडेट करना होगा (या छोटा डेटाबेस, यदि आप चाहें)।
यदि आप बुकमार्क रूट की कोशिश करते हैं, तो मुझे यह सुनने में दिलचस्पी होगी कि यह आपके लिए कैसे काम करता है!
zfs send -R ...
? यदि आपने आउटपुट को पाइपssh
किया है, तो क्या आपने भागने के पात्रों को निष्क्रिय कर दिया हैzfs send -R ... | ssh -e none ...
?