ข้อจำกัดความรับผิดชอบ: เนื่องจากฉันไม่เคยใช้ 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 และ VLAN แยกต่างหากที่มีอยู่ระหว่างผู้ส่งและผู้รับเท่านั้นคุณสามารถเปลี่ยนจาก SSH เป็นทางเลือกที่ไม่ได้เข้ารหัสเช่น mbuffer ตามที่อธิบายไว้ที่นี่หรือคุณสามารถใช้ SSH ด้วยการเข้ารหัสอ่อนแอ และการบีบอัดคนพิการ, ซึ่งเป็นรายละเอียดที่นี่ นอกจากนี้ยังมีเว็บไซต์เกี่ยวกับการแนะนำ SSH ให้เร็วขึ้นมาก แต่น่าเสียดายที่ฉันจำ URL ไม่ได้ - ฉันจะแก้ไขในภายหลังหากพบ
สำหรับชุดข้อมูลที่มีขนาดใหญ่มากและการเชื่อมต่อที่ช้าอาจเป็นประโยชน์ในการส่งข้อมูลครั้งแรกผ่านทางฮาร์ดดิสก์ (ใช้ดิสก์เข้ารหัสเพื่อจัดเก็บ zpool และส่งในแพ็คเกจที่ปิดผนึกผ่านทางไปรษณีย์หรือด้วยตนเอง) เนื่องจากวิธีการส่งไม่สำคัญสำหรับการส่ง / recv คุณสามารถไปป์ทุกอย่างไปยังดิสก์ส่งออกกลุ่มส่งดิสก์ไปยังปลายทางนำเข้ากลุ่มแล้วส่งผ่านการส่งที่เพิ่มขึ้นทั้งหมดผ่าน SSH
ปัญหาเกี่ยวกับสแนปชอตของ messed up
ตามที่ระบุไว้ก่อนหน้านี้ถ้าคุณลบ / ปรับเปลี่ยนภาพรวมการจำลองแบบของคุณคุณจะได้รับข้อความแสดงข้อผิดพลาด
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
ซึ่งหมายความว่าคำสั่งของคุณผิดหรือคุณอยู่ในสถานะไม่สอดคล้องซึ่งคุณต้องลบสแนปชอตและเริ่มต้นใหม่ทั้งหมด
สิ่งนี้มีความหมายเชิงลบหลายประการ:
- คุณไม่สามารถลบสแนปชอตของการจำลองแบบได้จนกว่าสแน็ปช็อตการจำลองแบบใหม่จะถูกถ่ายโอนสำเร็จ เนื่องจากสแน็ปช็อตการจำลองแบบเหล่านี้รวมถึงสถานะของสแน็ปช็อตอื่น ๆ (เก่ากว่า) ทั้งหมดพื้นที่ว่างของไฟล์ที่ถูกลบและสแน็ปช็อตจะถูกเรียกคืนเฉพาะเมื่อการจำลองเสร็จสิ้น ซึ่งอาจนำไปสู่ปัญหาพื้นที่ชั่วคราวหรือถาวรบนพูลของคุณซึ่งคุณสามารถแก้ไขได้โดยการรีสตาร์ทหรือทำขั้นตอนการจำลองแบบให้เสร็จสมบูรณ์เท่านั้น
- คุณจะมีสแน็ปช็อตเพิ่มเติมจำนวนมากซึ่งจะทำให้คำสั่ง list ช้าลง (ยกเว้นใน Oracle Solaris 11 ซึ่งได้รับการแก้ไขแล้ว)
- คุณอาจต้องปกป้องสแนปชอตจากการลบ (โดยไม่ตั้งใจ) ยกเว้นโดยสคริปต์เอง
มีวิธีแก้ไขที่เป็นไปได้สำหรับปัญหาเหล่านั้น แต่ฉันไม่ได้ลองเอง คุณสามารถใช้zfs bookmark
คุณลักษณะใหม่ใน OpenSolaris / illumos ที่สร้างขึ้นสำหรับงานนี้โดยเฉพาะ สิ่งนี้จะทำให้คุณไม่ต้องเสียเวลาจัดการสแน็ปช็อต ข้อเสียเพียงอย่างเดียวคือในปัจจุบันมันใช้งานได้กับชุดข้อมูลเดียวเท่านั้นไม่เรียกซ้ำ คุณจะต้องบันทึกรายการชุดข้อมูลเก่าและใหม่ทั้งหมดของคุณจากนั้นวนซ้ำชุดบุ๊คมาร์คการส่งและรับจากนั้นอัปเดตรายการ (หรือฐานข้อมูลขนาดเล็กหากคุณต้องการ)
หากคุณลองเส้นทางบุ๊กมาร์กฉันสนใจที่จะรับฟังว่ามันทำงานอย่างไรสำหรับคุณ!
zfs send -R ...
อย่างไร หากคุณไพพ์เอาท์พุตผ่านทางssh
คุณปิดใช้งานอักขระเลี่ยงด้วยzfs send -R ... | ssh -e none ...
หรือไม่