มีวิธีในการสร้างสำเนาวัวใน ZFS หรือไม่


14

ฉันพยายามทำสำเนาวัวของบางไฟล์ / ไดเรกทอรี แต่หลายวิธีที่ฉันรู้ทั้งหมดดูเหมือนจะย่อยที่ดีที่สุด

ตัวอย่างเช่น btrfs สามารถด้วยการใช้งานการcp --reflink=autoสร้างสำเนาของไฟล์ได้อย่างรวดเร็ว

สิ่งที่ฉันได้ลอง:

  1. Symlinks: ไม่ดี ไฟล์ที่ถูกเปลี่ยนชื่อลิงค์เสีย
  2. Hardlinks: ดีกว่า แต่ก็ยังไม่ดี การเปลี่ยนแปลงในไฟล์หนึ่งจะเป็นการเปลี่ยนแปลงไฟล์อื่นและฉันไม่ต้องการให้ไฟล์อื่นเปลี่ยนแปลง
  3. สร้างสแน็ปช็อตของชุดข้อมูลจากนั้นโคลนสแน็ปช็อต: สิ่งนี้สามารถทำงานได้ แต่ไม่ดี บ่อยครั้งที่ฉันไม่ได้มองหาสำเนาของชุดข้อมูลทั้งหมดหรือเพื่อให้สำเนาทำหน้าที่เหมือนชุดข้อมูลอื่น จากนั้นก็มีความสัมพันธ์ระหว่างผู้ปกครอง / เด็กระหว่างโคลน / สแนปชอต / ต้นฉบับซึ่งฉันเข้าใจว่ามันยากหากไม่สามารถแยกได้
  4. การใช้zfs send/receiveและเปิดใช้งานการลดจำนวนการทำซ้ำชุดข้อมูลไปยังชุดข้อมูลใหม่: นี่เป็นการหลีกเลี่ยงความสัมพันธ์ระหว่างผู้ปกครอง / เด็กในการใช้โคลน แต่ยังคงสร้างชุดข้อมูลอื่นโดยไม่จำเป็นและยังคงต้องทนทุกข์จากความช้า บล็อกอ้างอิงอีกครั้งแทนที่จะเขียน
  5. คัดลอกไฟล์และให้ dedup ทำงาน: มันใช้งานได้ แต่ช้าเพราะไฟล์จะต้องอ่าน 100% แล้วบล็อกอ้างอิงอีกครั้งแทนที่จะเขียน

ความช้าของ zfs การส่ง / รับและการคัดลอกหรือ rsyncing ทางกายภาพนั้นเลวร้ายยิ่งขึ้นเพราะสิ่งต่าง ๆ ส่วนใหญ่จะถูกเก็บไว้บีบอัดและจะต้องมีการบีบอัดในระหว่างการอ่านแล้วบีบอัดก่อนที่จะเตะซ้ำเพื่ออ้างอิงบล็อกซ้ำ

ในการวิจัยทั้งหมดของฉันฉันไม่สามารถหาสิ่งที่คล้ายกับความเรียบง่ายของ --reflink ใน btrfs ได้จากระยะไกล

ดังนั้นมีวิธีการสร้างสำเนาวัวใน ZFS หรือไม่ หรือ "การคัดลอก" และปล่อยให้การทำสำเนาเป็นเพียงตัวเลือกจริงเท่านั้น?

คำตอบ:


4

ฉันคิดว่าตัวเลือก 3 ตามที่คุณได้อธิบายไว้ข้างต้นอาจเป็นทางออกที่ดีที่สุดของคุณ ปัญหาที่ใหญ่ที่สุดกับสิ่งที่คุณต้องการคือ ZFS จัดการกับการคัดลอกเมื่อเขียนนี้ที่ระดับชุดข้อมูล / สแนปชอตเท่านั้น

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

กลับไปที่ตัวเลือก 3 คุณจะต้องตั้งค่าชุดข้อมูลเฉพาะเพื่อเก็บแผนผังระบบไฟล์แต่ละรายการที่คุณต้องการจัดการด้วยวิธีนี้ เมื่อคุณตั้งค่าและใส่ข้อมูลเริ่มต้นแล้วให้จับภาพหน้าจอของคุณ (หนึ่งชุดข้อมูลต่อชุดข้อมูลที่จะแตกต่างกันเล็กน้อย) และโปรโมตเป็นโคลน อย่าแตะชุดข้อมูลดั้งเดิมอีกครั้ง

ใช่วิธีนี้มีปัญหา ฉันไม่ได้บอกว่ามันไม่ได้ แต่ด้วยข้อ จำกัด ของ ZFS มันอาจจะเป็นสิ่งที่ดีที่สุด ฉันพบการอ้างอิงนี้กับคนที่ใช้โคลนอย่างมีประสิทธิภาพ: http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

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


นี่คืออาหารที่ดีสำหรับความคิด หาก "นายใหญ่" (และเด็ก ๆ ) ต้องการการเปลี่ยนแปลงที่มีขนาดใหญ่พอโคลนของนายอาจจะได้รับการปรับปรุงปรับปรุงเลื่อนตำแหน่งเป็นตำแหน่งหัวหน้าใหม่ดังนั้นการโคลนในเครือใด ๆ ที่แตกต่างกันมากพออาจมีความแปรปรวนที่กำหนดโดย rsync นอกเหนือจากนั้นโคลนก็ถูกทำลายและถูกร่างใหม่จากต้นแบบใหม่และการเปลี่ยนแปลงก็ดึงกลับมาจากวัสดุที่ถูกยึดไว้ นี่ไม่ใช่วิธีการแก้ปัญหาที่ยอดเยี่ยม แต่เริ่มมีลักษณะเป็นโซลูชันที่ดีและช่วยประหยัดค่าใช้จ่ายในการเปิดใช้งานการขจัดข้อมูลซ้ำซ้อน ต้องคิดเรื่องนี้มากกว่านี้
killermist

ใช่มันไม่ใช่ทางออกที่ดี แต่ดูเหมือนจะเจ็บปวดน้อยที่สุดกับสิ่งที่คุณได้อธิบายไว้และฉันไม่สามารถคิดถึงคนอื่นได้
jlp

บทสรุปของการจุดของคุณจะแสดงโดยgithub.com/zfsonlinux/zfs/issues/405โดยทั่วไป ZFS ไม่สนับสนุนวัวแฟ้มเท่านั้น COW ชุดจึงมีไม่เทียบเท่ากับ cp --reflink=autoBTRFS
mtalexan

1

ตัวเลือกที่ 5 คือสิ่งที่ดีที่สุด

สำหรับชุดข้อมูล parent / child ในอ็อพชัน 3 คุณสามารถเลื่อนระดับโคลนและจะไม่เป็นชุดย่อยของชุดข้อมูลที่ถูกโคลนอีกต่อไป มันยังคงไม่ใช้บล็อคพิเศษ แก้ไข: ตั้งข้อสังเกตว่าสิ่งนี้ตรงกันข้ามความสัมพันธ์หลัก / ลูกความสัมพันธ์เท่านั้นไม่ทำลายมัน

ในส่วนที่เกี่ยวกับสิ่งต่าง ๆ ที่ถูกบีบอัด / เข้ารหัสและการทำสำเนาให้ช้าลงนั่นเป็นความจริงโดยสมบูรณ์ โปรเซสเซอร์ของคุณเร็วกว่าอุปกรณ์บล็อกของคุณมาก (แม้ว่าจะใช้ SSD) สำหรับตัวเลขตัวอย่างบางตัวสมมติว่าใช้เวลา 10 วินาทีในการอ่านบล็อก แต่ใช้เวลาเพียงหนึ่งวินาทีในการคลายมันและ 2 วินาทีในการถอดรหัส Block 1 จะถูกอ่านภายใน 10 วินาทีและส่งไปยัง CPU CPU เริ่มคลายการบีบอัดและถอดรหัสในขณะที่ดิสก์เริ่มอ่านบล็อก 2 CPU จะทำงานให้เสร็จภายใน 3 วินาทีจากนั้นใช้เวลาอีก 7 วินาทีในการรอแผ่นดิสก์ ขณะที่ดิสก์ใช้เวลาเท่ากันในการอ่านทั้งสองช่วงเวลา (20 วินาที) โดยไม่คำนึงว่าบล็อกนั้นถูกบีบอัดหรือไม่

ในขณะเดียวกันการเขียนเฉพาะบล็อกแรกเท่านั้นที่ล่าช้า CPU บีบอัด / เข้ารหัสบล็อก 1 และส่งไปยังดิสก์ ในขณะที่ดิสก์กำลังเขียนบล็อก 1 CPU จะเริ่มบีบอัด / เข้ารหัสบล็อกที่ตามมา CPU จะเคี้ยวผ่านบล็อกเร็วกว่าดิสก์สามารถเขียนได้ดังนั้นจึงไม่ใช่ปัญหา (ใช่มันซับซ้อนกว่านี้ แต่นี่เป็นส่วนสำคัญ)

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


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

นอกจากนี้ในสระที่เปิดใช้งานการหักข้อมูลฉันต้องไม่เห็นด้วยกับข้อสรุปในการบีบอัดข้อมูลที่ช้าลง การคัดลอกจากชุดข้อมูลที่เปิดใช้งานการบีบอัดไปยังชุดข้อมูลที่เปิดใช้งานการบีบอัดความเร็วไม่เกิน 5Mb / วินาที หากชุดข้อมูลหนึ่งหรือชุดข้อมูลอื่นถูกปิดใช้งานการบีบอัดความเร็วจะสูงถึง 10-15Mb / วินาทีโดยเฉลี่ย เมื่อปิดการใช้งานการบีบอัดทั้งสองด้านฉันเห็น 20Mb / วินาทีได้อย่างง่ายดายโดยมีหนามแหลมสูงกว่านั้น (อาจเป็นเพราะบางส่วนกดปุ่ม dedup ใน RAM แทนการดึงจากสื่อที่ช้ากว่า)
killermist

1
ฉันปรับปรุงคำตอบของฉันเกี่ยวกับการโคลน สำหรับการบีบอัด / เข้ารหัส / ลดความซ้ำซ้อนการชะลอตัวนั้นเกิดจากการอัพเดท DDT มากกว่าการบีบอัดหรือการเข้ารหัส จากประสบการณ์ของฉันผลกระทบของการบีบอัดและการเข้ารหัสมีน้อยมาก ฉันเดาว่า YMMV
บาฮามาต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.