ฉันมีสองเซิร์ฟเวอร์ A และ B ซึ่งใช้ Ubuntu 16.04 และระบบไฟล์ RAID1 ZFS สำหรับ LXD ในขณะนี้ มีคอนเทนเนอร์สองสามตัวที่ทำงานบนเซิร์ฟเวอร์ A ตอนนี้ ความคิดของฉันที่จะสำรองข้อมูลทุกคืนจากแต่ละคอนเทนเนอร์บนเซิร์ฟเวอร์ A ไปยังเซิร์ฟเวอร์ B ด้วยวิธีนี้ ฉันต้องการที่จะสามารถเริ่มคอนเทนเนอร์บนเซิร์ฟเวอร์ B หากเซิร์ฟเวอร์ A ขัดข้อง ฉันยังสามารถใช้สแน็ปช็อตในเครื่องบนเซิร์ฟเวอร์ A เพื่อกู้คืนคอนเทนเนอร์ได้อย่างรวดเร็ว เช่น หากมีคนลบไฟล์โดยไม่ตั้งใจ

วิธีที่ง่ายที่สุดคือหยุดคอนเทนเนอร์ C บนเซิร์ฟเวอร์ A สร้างสแน็ปช็อต Snap0 แล้วเริ่มใหม่อีกครั้ง จากนั้นใช้lxc copy C/Snap0 serverB:Cเพื่อคัดลอกสแน็ปช็อตไปยังเซิร์ฟเวอร์ B สมมติว่าฉันได้เพิ่มเซิร์ฟเวอร์ B เป็นโฮสต์ระยะไกลไปยังเซิร์ฟเวอร์ A แล้ว ปัญหาที่นี่คือใช้งานได้ในครั้งแรกเท่านั้น สำหรับข้อมูลสำรองอื่น ฉันจะต้องลบคอนเทนเนอร์ C บนเซิร์ฟเวอร์ B ก่อนจึงจะคัดลอกซ้ำได้ และปัญหาที่สองคือคอนเทนเนอร์กำลังเติบโตจากการสำรองข้อมูลไปจนถึงการสำรองข้อมูลและในที่สุดก็มีข้อมูลจำนวนมากที่จะถ่ายโอนไปยังเซิร์ฟเวอร์ B ซึ่งบริการทั้งหมดที่ทำงานอยู่บนนั้นจะมีแบนด์วิดท์ไม่เพียงพอ

ดังนั้น วิธีแก้ไขคือโอนเฉพาะความแตกต่างระหว่างสแนปชอตตอนกลางคืนเท่านั้น หนึ่งสามารถบรรลุสิ่งzfs send/receiveที่ร่วมกับ ssh ที่สามารถส่งความแตกต่างระหว่างสแน็ปช็อตบนเซิร์ฟเวอร์ A ไปยังเซิร์ฟเวอร์ B บน ssh แล้วเพิ่มความแตกต่างเหล่านี้ให้กับระบบไฟล์ของเซิร์ฟเวอร์ B แต่มีปัญหาอีกแล้ว มันไม่ทำงานถ้าฉันสร้างระบบไฟล์เริ่มต้นของคอนเทนเนอร์ C โดยใช้lxc copyเพราะคำสั่งนี้ไม่ได้ใช้zfs send/receiveภายใน แต่สร้างระบบไฟล์ใหม่บนเซิร์ฟเวอร์ B ซึ่งจะมีการตรวจสอบที่แตกต่างจากระบบไฟล์ดั้งเดิมบนเซิร์ฟเวอร์ A ดังนั้นความแตกต่าง ไม่สามารถสำรองข้อมูลได้ และzfs receiveจะส่งคืนพร้อมข้อผิดพลาดเมื่อเปรียบเทียบผลรวมเช็คซัมของระบบไฟล์

แนวคิดต่อไปของฉันคือใช้เพียงzfs send/receiveเพื่อถ่ายโอนระบบไฟล์ทั้งหมดของคอนเทนเนอร์ C จากเซิร์ฟเวอร์ A ไปยังเซิร์ฟเวอร์ B โดยไม่ต้องสร้างคอนเทนเนอร์โดยใช้lxc copy/init. หลังจากนั้นจะไม่มีปัญหาในการส่งความแตกต่างระหว่างสแนปชอตสองภาพต่อเนื่องกันทุกคืนเนื่องจากเช็คซัมตรงกัน แต่มีปัญหาที่ฉันไม่สามารถเริ่มต้นสำเนาของคอนเทนเนอร์ C บนเซิร์ฟเวอร์ B ในกรณีฉุกเฉินเพราะไม่มีรายการในฐานข้อมูลของ LXD อยู่ที่/var/lib/lxd/lxd.dbดังนั้นlxc start Cจะไม่ทำงาน ฉันเดาว่าฉันสามารถคัดลอกรายการที่เกี่ยวข้องของฐานข้อมูล LXD ของเซิร์ฟเวอร์ A ไปยังฐานข้อมูล LXD ของเซิร์ฟเวอร์ B เพื่อให้ทำงานได้ แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้ บางทีคุณสามารถช่วยฉันที่นี่ ฉันไม่ต้องการทำลายอะไรในฐานข้อมูลเหล่านี้

ข้อมูลเบื้องหลังบางประการ: อันที่จริงทั้งเซิร์ฟเวอร์ A และ B กำลังเรียกใช้คอนเทนเนอร์ แต่แต่ละเซิร์ฟเวอร์ควรมีข้อมูลสำรองของคอนเทนเนอร์ของเซิร์ฟเวอร์อื่น

อาจมีกลยุทธ์การสำรองข้อมูลที่ใช้งานได้อยู่แล้วโดยใช้โฮสต์ LXD สองตัวหรือมากกว่านั้น แต่ฉันหามันไม่เจอ มีเพียงrsyncกลยุทธ์การสำรองข้อมูลที่คล้ายคลึงกันหรือคัดลอกทั้งคอนเทนเนอร์ทุกคืนที่นั่น

อัปเดต: ฉันเพิ่งได้รับคำแนะนำในการคอมมิต githubซึ่งใช้คำสั่งย่อยใหม่สำหรับคำสั่ง lxd คือlxd import. ดังนั้นฉันจึงจำเป็นต้องอัพเกรด lxd บนเซิร์ฟเวอร์ทั้งสองโดยใช้แบ็คพอร์ตของ Ubuntu โดยใช้apt-get install -t xenial-backports lxd lxd-client.

ไม่ควรมีใครนำเข้าคอนเทนเนอร์จากระบบไฟล์ที่มีอยู่ ฉันลองแล้ว ไปที่เซิร์ฟเวอร์ A ก่อน แล้วถ่ายภาพนิ่ง

lxc snapshot C Snap0

ส่งสแน็ปช็อตไปยังเซิร์ฟเวอร์ B โดยzfs send/receiveใช้อาร์กิวเมนต์พิเศษ-pบนไซต์ของผู้ส่งเพื่อรวมคุณสมบัติของระบบไฟล์ด้วย

zfs send -p lxd/containers/[email protected] | ssh serverB zfs receive lxd/containers/C

เปลี่ยนเป็นเซิร์ฟเวอร์ B และสร้างลิงก์สัญลักษณ์:

ln -s /var/lib/lxd/containers/C.zfs /var/lib/lxd/containers/C

และตอนนี้ฉันควรจะนำเข้าได้แล้ว:

lxd import C

แต่ฉันได้รับข้อผิดพลาดแทน:

error: open /var/lib/lxd/containers/C/backup.yaml: no such file or directory

เพราะฉันไม่รู้ว่าbackup.yamlไฟล์นี้ควรมาจากไหน ฉันพยายามคัดลอกไฟล์ที่มีอยู่metadata.yawlไปยังbackup.yaml. หลังจากลองอีกครั้งฉันได้รับข้อผิดพลาดนี้:

error: no response!

และตอนนี้ฉันไม่รู้ว่าต้องทำอย่างไรเพราะไม่มีคำแนะนำว่าสิ่งนี้backup.yamlควรมาจากไหน

อัปเดต 2: ตามที่กล่าวไว้ข้างต้น คุณสามารถรับbackup.yamlไฟล์นี้ได้โดยการหยุดและเริ่มคอนเทนเนอร์อีกครั้ง หรือเพียงแค่ถ่ายภาพสแนปชอตอื่นหลังจากอัปเกรดเป็น lxc 2.7+

ในที่สุดสคริปต์ของฉันก็ทำงานได้ดี ตอนนี้มีประเด็นเล็กอยู่เรื่องเดียว หลังจากนำเข้าคอนเทนเนอร์ด้วยlxc importฉันไม่สามารถเอาออกได้อีกต่อไปโดยไม่ทำลายระบบไฟล์ทั้งหมดของคอนเทนเนอร์ ผมคิดว่าคำสั่งที่ชอบlxc import --update <container>หรือlxc delete --keep-root-fsหรือคล้ายกัน ฉันได้ยื่นคำขอคุณลักษณะเกี่ยวกับแนวคิดนี้แล้ว

อัปเดต 3: และที่นี่ คุณสามารถดูความคืบหน้า: ปรับปรุงการจัดการการสำรองข้อมูล LXD #3005

answer

Nicolas

ฉันพบปัญหาเดียวกันกับที่คุณเผชิญ ในการทดสอบของฉัน ฉันต้องอัปเกรดจาก lxd 2.0.8 เป็น 2.7 ขึ้นไป และต้องหยุด lxc (ซึ่งสร้างหรือเริ่มจาก 2.0.x) จากนั้นเริ่ม lxc อีกครั้ง คุณจะเห็น backup.yaml และสามารถคัดลอกไปยังปลายทางได้ ใช้การนำเข้า lxd (ก่อนนำเข้าอย่าลืมตั้งค่าจุดเชื่อมต่อ zfs และสร้างชื่อคอนเทนเนอร์ลิงก์ไปยังจุดเชื่อมต่อ)

หวังว่านี่จะช่วยได้