วิธีการทำมิเรอร์พูล zfs ทั้งหมดไปยังพูล zfs อื่น


16

ฉันมีหนึ่ง zfs pool ที่มี zvols และชุดข้อมูลหลายตัวซึ่งบางตัวยังซ้อนอยู่ ชุดข้อมูลและ zvols ทั้งหมดถูกรวบรวมเป็นระยะโดย zfs-auto-snapshot ชุดข้อมูลและ zvols ทั้งหมดมีสแน็ปช็อตที่สร้างขึ้นด้วยตนเองบางส่วน

ฉันได้ติดตั้งรีโมตพูลเนื่องจากไม่มีเวลาคัดลอกเริ่มต้นบนเครือข่ายความเร็วสูงผ่าน zfs send -R ไม่สมบูรณ์ (ชุดข้อมูลบางชุดหายไปบางชุดข้อมูลมีสแนปชอตที่ล้าสมัยหรือขาดหายไป)

ตอนนี้สระว่ายน้ำทางกายภาพระยะไกลผ่านการเชื่อมต่อความเร็วต่ำและฉันจำเป็นต้องซิงค์สระว่ายน้ำระยะไกลเป็นระยะกับสระว่ายน้ำในท้องถิ่นหมายถึงข้อมูลที่มีอยู่ในสระว่ายน้ำในท้องถิ่นจะต้องคัดลอกไปยังสระว่ายน้ำระยะไกล ข้อมูลที่แสดงอยู่ในรีโมตพูล ​​แต่ไม่ได้อยู่ในพูลโลคัลต้องถูกลบออกจากพูลแบบรีโมตโดยความหมายของข้อมูล 'zvols', 'datasets' หรือ 'snapshots'

ถ้าฉันทำสิ่งนี้ระหว่างสองระบบไฟล์ปกติโดยใช้ rsync มันจะเป็น "-axPHAX --delete" (นั่นคือสิ่งที่ฉันทำเพื่อสำรองข้อมูลบางระบบ)

ฉันจะตั้งค่างานการซิงโครไนซ์เพื่อให้พูล zvols & ชุดข้อมูลระยะไกล (รวมถึงสแน็ปช็อต) สามารถซิงค์กับ zvols ชุดข้อมูลและสแน็ปช็อตในท้องถิ่นได้อย่างไร

ฉันต้องการหลีกเลี่ยงการถ่ายโอนผ่าน ssh เนื่องจากประสิทธิภาพการทำงานที่ต่ำของ ssh; ฉันต้องการ mbuffer หรือ iscsi แทน


คุณเริ่มต้นzfs send -R ...อย่างไร หากคุณไพพ์เอาท์พุตผ่านทางsshคุณปิดใช้งานอักขระเลี่ยงด้วยzfs send -R ... | ssh -e none ...หรือไม่
Andrew Henle

นอกจากนี้ - คุณต้องตรวจสอบให้แน่ใจว่าการเชื่อมต่อที่ช้าของคุณมีแบนด์วิดท์เพียงพอที่จะทำให้สำเนาระยะไกลเป็นปัจจุบัน หากคุณได้รับการเปลี่ยนแปลงในระบบภายในมากกว่าที่คุณสามารถส่งไปยังระบบระยะไกลคุณจะไม่สามารถเก็บสำเนาระยะไกลได้ทัน ใช้สตรีมการจำลองแบบ zfs ที่เพิ่มขึ้นและบันทึกลงในไฟล์ หากไฟล์มีขนาดใหญ่กว่าปริมาณข้อมูลที่คุณสามารถส่งไปยังไซต์ระยะไกลในระยะเวลาระหว่างสแน็ปช็อตคุณจะไม่มีทางรักษา zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Andrew Henle

คุณสามารถลองใช้สคริปต์นี้เพื่อดำเนินการโดยอัตโนมัติ: 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 และ VLAN แยกต่างหากที่มีอยู่ระหว่างผู้ส่งและผู้รับเท่านั้นคุณสามารถเปลี่ยนจาก SSH เป็นทางเลือกที่ไม่ได้เข้ารหัสเช่น mbuffer ตามที่อธิบายไว้ที่นี่หรือคุณสามารถใช้ SSH ด้วยการเข้ารหัสอ่อนแอ และการบีบอัดคนพิการ, ซึ่งเป็นรายละเอียดที่นี่ นอกจากนี้ยังมีเว็บไซต์เกี่ยวกับการแนะนำ SSH ให้เร็วขึ้นมาก แต่น่าเสียดายที่ฉันจำ URL ไม่ได้ - ฉันจะแก้ไขในภายหลังหากพบ

สำหรับชุดข้อมูลที่มีขนาดใหญ่มากและการเชื่อมต่อที่ช้าอาจเป็นประโยชน์ในการส่งข้อมูลครั้งแรกผ่านทางฮาร์ดดิสก์ (ใช้ดิสก์เข้ารหัสเพื่อจัดเก็บ zpool และส่งในแพ็คเกจที่ปิดผนึกผ่านทางไปรษณีย์หรือด้วยตนเอง) เนื่องจากวิธีการส่งไม่สำคัญสำหรับการส่ง / recv คุณสามารถไปป์ทุกอย่างไปยังดิสก์ส่งออกกลุ่มส่งดิสก์ไปยังปลายทางนำเข้ากลุ่มแล้วส่งผ่านการส่งที่เพิ่มขึ้นทั้งหมดผ่าน SSH

ปัญหาเกี่ยวกับสแนปชอตของ messed up

ตามที่ระบุไว้ก่อนหน้านี้ถ้าคุณลบ / ปรับเปลี่ยนภาพรวมการจำลองแบบของคุณคุณจะได้รับข้อความแสดงข้อผิดพลาด

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

ซึ่งหมายความว่าคำสั่งของคุณผิดหรือคุณอยู่ในสถานะไม่สอดคล้องซึ่งคุณต้องลบสแนปชอตและเริ่มต้นใหม่ทั้งหมด

สิ่งนี้มีความหมายเชิงลบหลายประการ:

  1. คุณไม่สามารถลบสแนปชอตของการจำลองแบบได้จนกว่าสแน็ปช็อตการจำลองแบบใหม่จะถูกถ่ายโอนสำเร็จ เนื่องจากสแน็ปช็อตการจำลองแบบเหล่านี้รวมถึงสถานะของสแน็ปช็อตอื่น ๆ (เก่ากว่า) ทั้งหมดพื้นที่ว่างของไฟล์ที่ถูกลบและสแน็ปช็อตจะถูกเรียกคืนเฉพาะเมื่อการจำลองเสร็จสิ้น ซึ่งอาจนำไปสู่ปัญหาพื้นที่ชั่วคราวหรือถาวรบนพูลของคุณซึ่งคุณสามารถแก้ไขได้โดยการรีสตาร์ทหรือทำขั้นตอนการจำลองแบบให้เสร็จสมบูรณ์เท่านั้น
  2. คุณจะมีสแน็ปช็อตเพิ่มเติมจำนวนมากซึ่งจะทำให้คำสั่ง list ช้าลง (ยกเว้นใน Oracle Solaris 11 ซึ่งได้รับการแก้ไขแล้ว)
  3. คุณอาจต้องปกป้องสแนปชอตจากการลบ (โดยไม่ตั้งใจ) ยกเว้นโดยสคริปต์เอง

มีวิธีแก้ไขที่เป็นไปได้สำหรับปัญหาเหล่านั้น แต่ฉันไม่ได้ลองเอง คุณสามารถใช้zfs bookmarkคุณลักษณะใหม่ใน OpenSolaris / illumos ที่สร้างขึ้นสำหรับงานนี้โดยเฉพาะ สิ่งนี้จะทำให้คุณไม่ต้องเสียเวลาจัดการสแน็ปช็อต ข้อเสียเพียงอย่างเดียวคือในปัจจุบันมันใช้งานได้กับชุดข้อมูลเดียวเท่านั้นไม่เรียกซ้ำ คุณจะต้องบันทึกรายการชุดข้อมูลเก่าและใหม่ทั้งหมดของคุณจากนั้นวนซ้ำชุดบุ๊คมาร์คการส่งและรับจากนั้นอัปเดตรายการ (หรือฐานข้อมูลขนาดเล็กหากคุณต้องการ)

หากคุณลองเส้นทางบุ๊กมาร์กฉันสนใจที่จะรับฟังว่ามันทำงานอย่างไรสำหรับคุณ!


ขอบคุณมากสำหรับคำตอบอย่างละเอียด ฉันเพียงแค่ zpoolsend..receive-ไอเอ็นจี
กระวนกระวายใจ

1
สคริปต์ที่ดี ฉันต้องการเพิ่ม-d 1ทั้งสองzfs listคำสั่งเพื่อจำกัดความลึกของการค้นหา (ไม่จำเป็นต้องค้นหาใต้ชื่อกลุ่ม) วิธีนี้จะช่วยหลีกเลี่ยงความล่าช้าในพูลที่มีสแนปชอตจำนวนมาก (เช่นพูล "สำรอง" ของฉันมีสแน็ปช็อต 320000 และzfs list -r -t snapshot backupใช้เวลา 13 นาทีในการทำงานใช้เวลาเพียง 0.06 วินาที-d 1เท่านั้น) zfs destroyคำสั่งในการห่วงแล้วต้องการ-rเลือกที่จะซ้ำลบภาพรวมทั้งหมดที่มี snapname เดียวกัน
cas

5

โดยส่วนตัวแล้วฉันจะสร้างรายชื่อ zvols ชุดข้อมูลและอื่น ๆ บนเซิร์ฟเวอร์ระยะไกลที่ไม่มีสแน็ปช็อตที่ทันสมัยแล้วนำสแน็ปช็อตเหล่านั้นมาใช้ด้วยzfs sendแม้ว่าจะใช้เวลานานและใช้จำนวนมาก ของแบนด์วิดธ์

จากนั้นฉันก็สามารถใช้ต่อzfs sendจากนี้ไปและไม่ต้องสร้างวงล้อใหม่ด้วยการเขียนรหัสการซิงโครไนซ์ของตัวเอง rsyncดีสำหรับระบบไฟล์รุ่นเก่า แต่zfs sendดีกว่าสำหรับ zfs - มันรู้ได้อย่างชัดเจนว่าบล็อกใดที่มีการเปลี่ยนแปลงในสแน็ปช็อตและส่งเฉพาะในขณะที่ rsync จะต้องเปรียบเทียบแต่ละไฟล์และ / หรือเวลาประทับระหว่างเซิร์ฟเวอร์ท้องถิ่นและระยะไกล เช่นเดียวกับbtrfs sendสำหรับพูล btrfs

หากคุณมีสแน็ปช็อตจำนวนน้อยที่ต้องนำมาอัพเดทเป็นปัจจุบันสิ่งนี้สามารถทำได้ด้วยตนเอง ไม่เช่นนั้นโดยอัตโนมัติคุณต้องมีรายการสแน็ปช็อตในพื้นที่ล่าสุดเทียบกับสแน็ปช็อตระยะไกลและสคริปต์เพื่อเปรียบเทียบเวอร์ชันจากนั้นสzfs sendแน็ปช็อตในเครื่องที่ล้าสมัยบนเซิร์ฟเวอร์ rmeote

นั่นจะเพียงพอหากคุณสนใจเฉพาะสแน็ปช็อตล่าสุดสำหรับแต่ละชุดข้อมูล หากคุณใส่ใจกับสแนปชอตก่อนหน้านี้ทั้งหมดเห็นได้ชัดว่าสคริปต์ของคุณจะต้องจัดการกับพวกเขาด้วย .... และนั่นจะกลายเป็นเรื่องที่ซับซ้อนมากขึ้น ในบางกรณีคุณอาจต้องย้อนกลับไปที่เซิร์ฟเวอร์ระยะไกลเพื่อให้คุณสามารถส่งภาพรวมกลาง / หายไป

หากคุณต้องการเชื่อมต่อที่ปลอดภัยกับเซิร์ฟเวอร์ระยะไกลคุณจะได้มีทางเลือกน้อยจริงๆ แต่เพื่อให้การใช้งานssh- หรือตั้งค่าอุโมงค์ที่มีบางทีหรือบางสิ่งบางอย่างและการใช้งานopenvpnnetcat


จะใช้ Zrep ได้อย่างไร? bolthole.com/solaris/zrep
Xdg

Dunno ไม่เคยใช้มัน ดูเหมือนว่ามันจะเป็นคำตอบที่ดี แต่ถ้ามีคนทำวิจัยและทดสอบเล็กน้อยและเขียนมันขึ้นมา (นั่นเป็นคำใบ้)
cas

ฉันได้ทำการทดสอบบน Ubuntu (ZFS บน linux) และมันไม่ได้ทำงานกับชุดข้อมูลที่ลึกกว่า (แท็งก์ / บางอย่าง / บางอย่าง) ผมใช้พอร์ตนี้จะเปลือก - การเชื่อมโยง ธงแบบเรียกซ้ำexport ZREP_R=-Rไม่ทำงานเลย :(
Xdg

1

ดูที่ `zrepl 'บน FreeBSD ซึ่งอาจทำให้ชีวิตของคุณและทุกคนในเรื่องนั้นง่ายขึ้นมาก มันถูกนำเสนอไม่กี่วันที่ผ่านมาในช่วง BSDCan2018 ในออตตาวา มันดูมีแนวโน้มและอาจเป็นทางออกสำหรับปัญหาของคุณ



คำถามในคำถามคือ: "ฉันจะตั้งค่างานการซิงโครไนซ์ได้อย่างไรเพื่อให้พูล zvols และชุดข้อมูลระยะไกล (รวมถึงสแนปชอตของพวกเขา) สามารถซิงค์กับ zvols ชุดข้อมูลและสแนปชอตในท้องถิ่นได้"
Jeff Schaller

0

zrep เป็นโซลูชัน all-in-one ที่ดีและมีเอกสาร + hooks เกี่ยวกับวิธีการถ่ายโอนที่รวดเร็วกว่าการถ่ายโอน SSH ธรรมดา

https://github.com/bolthole/zrep

มันยังเป็นแพลตฟอร์มข้ามแพลตฟอร์ม: สนับสนุนบน linux, freebsd และ solaris / illumos



1
คำถามในคำถามคือ: "ฉันจะตั้งค่างานการซิงโครไนซ์ได้อย่างไรเพื่อให้พูล zvols และชุดข้อมูลระยะไกล (รวมถึงสแนปชอตของพวกเขา) สามารถซิงค์กับ zvols ชุดข้อมูลและสแนปชอตในท้องถิ่นได้"
Jeff Schaller

Jeff คุณแนะนำว่า "คำตอบ" ที่ดีที่สุดคือการตัดบิต n-paste จากเอกสาร zrep แทนที่จะให้การอ้างอิงไปยัง zrep หรือไม่
Philip Brown

1
ฉันไม่รู้ว่าคำตอบที่ดีที่สุดจะเป็นอย่างไร แต่การเชื่อมโยงไปยังซอฟต์แวร์ไม่ใช่วิธีแก้ปัญหา มันถูกกล่าวถึงแล้วในความเป็นจริง คำถามถามว่า:“ ฉันจะตั้งค่างานการซิงโครไนซ์ได้อย่างไรเพื่อให้ zvols พูลระยะไกลและชุดข้อมูล (รวมถึงสแนปชอตของพวกเขา) สามารถซิงค์กับ zvols ชุดข้อมูลและสแนปชอตในท้องถิ่นได้”
Jeff Schaller

ใช่นั่นคือคำถาม อย่างไรก็ตามในการทำงานให้สำเร็จ WELL นั้นต้องการมากกว่าการเขียนเพียงเล็กน้อยบนหน้าเว็บที่นี่ นั่นคือเหตุผลที่ zrep เป็น 2000 บรรทัด shellscript แม้ว่าจะมีการลบส่วนทั้งหมดที่ปัญหาเดิมไม่ต้องการ แต่ก็ยังคงมีสคริปต์สองร้อยบรรทัดที่ต้องใช้ในการทำมันให้ดี
Philip Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.