เฮ้ ฮับ!
วันนี้ผมอยากจะพูดถึงประสบการณ์ของเราในการสำรองข้อมูลขนาดใหญ่จากพื้นที่เก็บข้อมูล Nextcloud ในรูปแบบต่างๆ โดยอัตโนมัติ ฉันทำงานเป็นสถานีบริการที่ Molniya AK ซึ่งเราทำการจัดการการกำหนดค่าของระบบ IT โดยมี Nextcloud ใช้สำหรับจัดเก็บข้อมูล รวมถึงมีโครงสร้างแบบกระจายพร้อมความซ้ำซ้อน
ปัญหาที่เกิดจากฟีเจอร์การติดตั้งคือมีข้อมูลจำนวนมาก การกำหนดเวอร์ชันที่จัดทำโดย Nextcloud ความซ้ำซ้อน เหตุผลส่วนตัว และอื่นๆ ทำให้เกิดการซ้ำกันจำนวนมาก
ประวัติศาสตร์
เมื่อดูแลระบบ Nextcloud ปัญหาในการจัดระเบียบการสำรองข้อมูลที่มีประสิทธิภาพก็เกิดขึ้น ซึ่งจะต้องได้รับการเข้ารหัส เนื่องจากข้อมูลมีคุณค่า
เราเสนอทางเลือกในการจัดเก็บข้อมูลสำรองในสถานที่ของเราหรือของลูกค้าบนเครื่องที่แยกจาก Nextcloud ซึ่งต้องใช้แนวทางการบริหารจัดการแบบอัตโนมัติที่ยืดหยุ่น
มีไคลเอนต์จำนวนมาก ซึ่งทั้งหมดมีการกำหนดค่าที่แตกต่างกัน และทั้งหมดอยู่ในไซต์ของตนเองและมีลักษณะเฉพาะของตนเอง นี่เป็นเทคนิคมาตรฐานเมื่อทั้งไซต์เป็นของคุณและการสำรองข้อมูลทำจากครอบฟัน มันไม่พอดีกัน
ขั้นแรกเรามาดูข้อมูลอินพุตกันก่อน พวกเราต้องการ:
- ความสามารถในการปรับขนาดในแง่ของหนึ่งโหนดหรือหลายโหนด สำหรับการติดตั้งขนาดใหญ่ เราใช้ minio เป็นที่เก็บข้อมูล
- ค้นหาเกี่ยวกับปัญหาในการสำรองข้อมูล
- คุณต้องสำรองข้อมูลไว้กับลูกค้าของคุณและ/หรือกับเรา
- จัดการกับปัญหาอย่างรวดเร็วและง่ายดาย
- ลูกค้าและการติดตั้งแตกต่างกันมาก - ไม่สามารถบรรลุความสม่ำเสมอได้
- ความเร็วในการกู้คืนควรน้อยที่สุดในสองสถานการณ์: การกู้คืนแบบเต็ม (ความเสียหาย) โฟลเดอร์หนึ่งถูกลบโดยไม่ได้ตั้งใจ
- จำเป็นต้องมีฟังก์ชันการขจัดข้อมูลซ้ำซ้อน
เพื่อแก้ปัญหาในการจัดการข้อมูลสำรอง เราได้ติดตั้ง GitLab รายละเอียดเพิ่มเติมโดยแท็กเกิล
แน่นอนว่าเราไม่ใช่คนแรกที่แก้ไขปัญหาดังกล่าว แต่สำหรับเราแล้วดูเหมือนว่าประสบการณ์ที่หามาได้ยากและใช้งานได้จริงของเรานั้นน่าสนใจ และเราพร้อมที่จะแบ่งปัน
เนื่องจากบริษัทของเรามีนโยบายโอเพ่นซอร์ส เราจึงมองหาโซลูชันโอเพ่นซอร์ส ในทางกลับกัน เราจะแบ่งปันการพัฒนาของเราและโพสต์ไว้ ตัวอย่างเช่น บน GitHub ก็มี
เครื่องมือสำรองข้อมูล
เราเริ่มค้นหาวิธีการแก้ไขโดยเลือกเครื่องมือสร้างการสำรองข้อมูล
tar + gzip ปกติทำงานได้ไม่ดี - ข้อมูลถูกทำซ้ำ การเพิ่มขึ้นมักจะมีการเปลี่ยนแปลงจริงเพียงเล็กน้อย และข้อมูลส่วนใหญ่ในไฟล์เดียวจะถูกทำซ้ำ
มีปัญหาอื่น - ความซ้ำซ้อนของการจัดเก็บข้อมูลแบบกระจาย เราใช้ minio และข้อมูลของมันก็ซ้ำซ้อน หรือคุณต้องทำการสำรองข้อมูลผ่าน minio เอง - โหลดมันและใช้ตัวเว้นวรรคทั้งหมดระหว่างระบบไฟล์ และที่สำคัญไม่น้อยคือมีความเสี่ยงที่จะลืมที่เก็บข้อมูลและข้อมูลเมตาบางส่วน หรือใช้การขจัดข้อมูลซ้ำซ้อน
เครื่องมือสำรองข้อมูลที่มีการทำซ้ำนั้นมีอยู่ในโอเพ่นซอร์ส (บนHabréก็มี
การจัดการการสำรองข้อมูล
Borg และ Restic นั้นดี แต่ไม่มีผลิตภัณฑ์ใดที่มีกลไกการควบคุมแบบรวมศูนย์ เพื่อวัตถุประสงค์ในการจัดการและการควบคุม เราเลือกเครื่องมือที่เราใช้งานอยู่แล้ว โดยที่เราไม่สามารถจินตนาการถึงงานของเราได้ รวมถึงระบบอัตโนมัติ - นี่คือ CI/CD - GitLab ที่รู้จักกันดี
แนวคิดมีดังนี้: มีการติดตั้ง gitlab-runner บนแต่ละโหนดที่จัดเก็บข้อมูล Nextcloud รันเนอร์รันสคริปต์ตามกำหนดเวลาที่ตรวจสอบกระบวนการสำรองข้อมูล และเปิดตัว Borg หรือ Retic
เราได้อะไร? ผลตอบรับจากการดำเนินการ ควบคุมการเปลี่ยนแปลงได้สะดวก รายละเอียดในกรณีที่เกิดข้อผิดพลาด
ที่นี่
ยังไม่มีวิธีเปลี่ยนการหมดเวลา CI/CD ใน Gitlab API ได้ แต่มีขนาดเล็ก มันต้องเพิ่มขึ้นนะบอกเลย 1d
.
โชคดีที่ GitLab สามารถเปิดตัวได้ไม่เพียงแต่ตามการคอมมิตเท่านั้น แต่ยังตามกำหนดเวลาเท่านั้น นี่คือสิ่งที่เราต้องการจริงๆ
ตอนนี้เกี่ยวกับสคริปต์ตัวตัดคำ
เรากำหนดเงื่อนไขต่อไปนี้สำหรับสคริปต์นี้:
- ควรเปิดตัวทั้งโดยนักวิ่งและด้วยมือจากคอนโซลที่มีฟังก์ชันการทำงานเหมือนกัน
- จะต้องมีตัวจัดการข้อผิดพลาด:
- รหัสส่งคืน
- ค้นหาสตริงในบันทึก ตัวอย่างเช่นสำหรับเราข้อผิดพลาดอาจเป็นข้อความที่โปรแกรมไม่ถือว่าร้ายแรง
- หมดเวลาการประมวลผล เวลานำจะต้องสมเหตุสมผล
- เราต้องการบันทึกที่ละเอียดมาก แต่เฉพาะในกรณีที่เกิดข้อผิดพลาดเท่านั้น
- มีการทดสอบหลายครั้งก่อนที่จะเริ่ม
- โบนัสเล็กน้อยเพื่อความสะดวกที่เราพบว่ามีประโยชน์ในระหว่างกระบวนการสนับสนุน:
- จุดเริ่มต้นและจุดสิ้นสุดจะถูกบันทึกไว้ในบันทึกระบบของเครื่องโลคัล ซึ่งจะช่วยเชื่อมต่อข้อผิดพลาดของระบบและการดำเนินการสำรองข้อมูล
- ส่วนหนึ่งของบันทึกข้อผิดพลาด (ถ้ามี) จะส่งออกไปยัง stdout บันทึกทั้งหมดจะถูกเขียนลงในไฟล์แยกต่างหาก สะดวกในการดู CI ทันทีและประเมินข้อผิดพลาดหากเป็นเรื่องเล็กน้อย
- โหมดการดีบัก
บันทึกแบบเต็มจะถูกบันทึกเป็นสิ่งประดิษฐ์ใน GitLab หากไม่มีข้อผิดพลาด บันทึกจะถูกลบ เราเขียนสคริปต์ด้วยทุบตี
เรายินดีที่จะพิจารณาข้อเสนอแนะและความคิดเห็นเกี่ยวกับโอเพ่นซอร์ส - ยินดีต้อนรับ
Какэтоработает
นักวิ่งที่มี Bash executor จะเปิดตัวบนโหนดสำรอง ตามกำหนดการ งาน CI/CD จะเปิดตัวในหัวผักกาดแบบพิเศษ Runner เปิดตัวสคริปต์ wrapper สากลสำหรับงานดังกล่าว โดยจะตรวจสอบความถูกต้องของที่เก็บข้อมูลสำรอง จุดเชื่อมต่อ และทุกสิ่งที่เราต้องการ จากนั้นสำรองข้อมูลและล้างข้อมูลเก่า ข้อมูลสำรองที่เสร็จแล้วจะถูกส่งไปยัง S3
เราทำงานตามแผนนี้ - เป็นผู้ให้บริการ AWS ภายนอกหรือเทียบเท่าในรัสเซีย (เร็วกว่าและข้อมูลไม่ออกจากสหพันธรัฐรัสเซีย) หรือเราติดตั้งคลัสเตอร์ขนาดเล็กแยกต่างหากสำหรับลูกค้าบนเว็บไซต์ของเขาเพื่อวัตถุประสงค์เหล่านี้ โดยปกติแล้วเราทำเช่นนี้ด้วยเหตุผลด้านความปลอดภัย เมื่อลูกค้าไม่ต้องการให้ข้อมูลออกจากวงจรเลย
เราไม่ได้ใช้คุณสมบัติในการส่งข้อมูลสำรองผ่าน ssh สิ่งนี้ไม่ได้เพิ่มความปลอดภัย และความสามารถด้านเครือข่ายของผู้ให้บริการ S3 นั้นสูงกว่าเครื่อง ssh เครื่องเดียวของเรามาก
เพื่อปกป้องเครื่องของคุณจากแฮกเกอร์ เนื่องจากแฮ็กเกอร์สามารถลบข้อมูลบน S3 ได้ คุณต้องเปิดใช้งานการกำหนดเวอร์ชัน
ข้อมูลสำรองจะเข้ารหัสข้อมูลสำรองเสมอ
Borg มีโหมดที่ไม่ได้เข้ารหัส none
แต่เราไม่แนะนำให้เปิดอย่างยิ่ง ในโหมดนี้ ไม่เพียงแต่จะไม่มีการเข้ารหัสเท่านั้น แต่การตรวจสอบผลรวมของสิ่งที่กำลังเขียนจะไม่ถูกคำนวณ ซึ่งหมายความว่าสามารถตรวจสอบความสมบูรณ์ได้ทางอ้อมเท่านั้น โดยใช้ดัชนี
ตัวกำหนดเวลาแยกต่างหากจะตรวจสอบการสำรองข้อมูลเพื่อความสมบูรณ์ของดัชนีและเนื้อหา การตรวจสอบช้าและใช้เวลานาน ดังนั้นเราจึงดำเนินการแยกกันเดือนละครั้ง อาจใช้เวลาหลายวัน
อ่านเป็นภาษารัสเซีย
หน้าที่หลัก
prepare
การอบรมtestcheck
ตรวจสอบความพร้อมmaincommand
ทีมงานหลักforcepostscript
ฟังก์ชั่นที่ถูกดำเนินการในท้ายที่สุดหรือโดยข้อผิดพลาด เราใช้มันเพื่อยกเลิกการต่อเชื่อมพาร์ติชัน
ฟังก์ชั่นการบริการ
cleanup
เราบันทึกข้อผิดพลาดหรือลบไฟล์บันทึกchecklog
แยกวิเคราะห์บันทึกการเกิดขึ้นของบรรทัดที่มีข้อผิดพลาดret
ตัวจัดการทางออกchecktimeout
ตรวจสอบการหมดเวลา
สิ่งแวดล้อม
VERBOSE=1
เราแสดงข้อผิดพลาดบนหน้าจอทันที (stdout)SAVELOGSONSUCCES=1
บันทึกบันทึกเมื่อสำเร็จINIT_REPO_IF_NOT_EXIST=1
สร้างพื้นที่เก็บข้อมูลหากไม่มีอยู่ ปิดใช้งานตามค่าเริ่มต้นTIMEOUT
เวลาสูงสุดสำหรับการดำเนินการหลัก คุณสามารถตั้งค่าเป็น 'm', 'h' หรือ 'd' ในตอนท้ายได้
โหมดการจัดเก็บข้อมูลสำหรับสำเนาเก่า ค่าเริ่มต้น:
KEEP_DAILY=7
KEEP_WEEKLY=4
KEEP_MONTHLY=6
ตัวแปรภายในสคริปต์
ERROR_STRING
— สตริงสำหรับบันทึกการเช็คอินเพื่อดูข้อผิดพลาดEXTRACT_ERROR_STRING
— นิพจน์สำหรับแสดงสตริงหากเกิดข้อผิดพลาดKILL_TIMEOUT_SIGNAL
— สัญญาณสำหรับการฆ่าหากหมดเวลาTAIL
— จำนวนสายที่มีข้อผิดพลาดบนหน้าจอCOLORMSG
— สีของข้อความ (สีเหลืองเริ่มต้น)
สคริปต์นั้นซึ่งเรียกว่าเวิร์ดเพรสนั้นมีชื่อแบบมีเงื่อนไข เคล็ดลับก็คือมันสำรองฐานข้อมูล mysql ด้วย ซึ่งหมายความว่าสามารถใช้สำหรับการติดตั้ง Nexcloud แบบโหนดเดียว ซึ่งคุณสามารถสำรองฐานข้อมูลได้ด้วย ความสะดวกไม่เพียงแต่ว่าทุกอย่างอยู่ในที่เดียวเท่านั้น แต่ยังรวมถึงเนื้อหาของฐานข้อมูลใกล้กับเนื้อหาของไฟล์ด้วย เนื่องจากเวลาต่างกันน้อยมาก
เรสติค vs บอร์ก
นอกจากนี้ยังมีการเปรียบเทียบระหว่าง Borg และ Retic
เกณฑ์การคัดเลือกของเรา นอกเหนือจากที่กล่าวไปแล้ว (การขจัดข้อมูลซ้ำซ้อน การกู้คืนอย่างรวดเร็ว ฯลฯ):
- ความต้านทานต่องานที่ยังไม่เสร็จ ตรวจสอบการฆ่า -9
- ขนาดบนดิสก์
- ข้อกำหนดสำหรับทรัพยากร (CPU, หน่วยความจำ)
- ขนาดของหยดที่เก็บไว้
- ทำงานกับ S3
- การตรวจสอบความสมบูรณ์
สำหรับการทดสอบ เราใช้ไคลเอนต์หนึ่งรายที่มีข้อมูลจริงและมีขนาดรวม 1,6 TB
เงื่อนไข
บอร์กไม่ทราบวิธีทำงานโดยตรงกับ S3 และเราติดตั้งดิสก์เป็นฟิวส์ผ่าน
Goofys ทำงานได้อย่างรวดเร็วและดีอีกด้วย
เพื่อลดอิทธิพลของเครือข่าย เราใช้ผู้ให้บริการในพื้นที่ - Yandex Cloud
ผลการทดสอบเปรียบเทียบ
- Kill -9 ด้วยการรีสตาร์ทอีกครั้งก็ประสบความสำเร็จทั้งคู่
- ขนาดบนดิสก์ บอร์กอัดได้ผลลัพธ์ก็เป็นไปตามคาด
ตัวสำรอง
ขนาด
แอนเดอ
562Gb
พักผ่อน
628Gb
- โดยซีพียู
ตัว Borg เองกินเพียงเล็กน้อยด้วยการบีบอัดเริ่มต้น แต่ต้องได้รับการประเมินร่วมกับกระบวนการที่โง่เขลา โดยรวมแล้วสามารถเปรียบเทียบได้และใช้ประมาณ 1,2 คอร์บนเครื่องเสมือนทดสอบเดียวกัน - หน่วยความจำ. Retic มีขนาดประมาณ 0,5GB Borg มีขนาดประมาณ 200MB แต่ทั้งหมดนี้ไม่มีนัยสำคัญเลยเมื่อเทียบกับแคชไฟล์ระบบ ดังนั้นจึงแนะนำให้จัดสรรหน่วยความจำเพิ่มเติม
- ความแตกต่างของขนาดหยดนั้นน่าทึ่งมาก
ตัวสำรอง
ขนาด
แอนเดอ
ประมาณ 500MB
พักผ่อน
ประมาณ 5MB
- ประสบการณ์ S3 ของ Retic นั้นยอดเยี่ยมมาก การทำงานกับ Borg ผ่าน goofys ไม่ได้ทำให้เกิดคำถามใด ๆ แต่มีข้อสังเกตว่าขอแนะนำให้ทำการติดตั้งหลังจากการสำรองข้อมูลเสร็จสิ้นเพื่อรีเซ็ตแคชโดยสมบูรณ์ ลักษณะเฉพาะของ S3 คือชิ้นส่วนที่มีการสูบน้อยจะไม่ถูกส่งไปยังบัคเก็ต ซึ่งหมายความว่าข้อมูลที่เติมไม่ครบถ้วนจะนำไปสู่ความเสียหายร้ายแรง
- การตรวจสอบความสมบูรณ์ทำงานได้ดีในทั้งสองกรณี แต่ความเร็วแตกต่างกันอย่างมาก
เรสติค ชั่วโมง 3,5.
Borg พร้อมแคชไฟล์ SSD ขนาด 100GB – ชั่วโมง 5. ผลลัพธ์จะมีความเร็วเท่ากันโดยประมาณหากข้อมูลอยู่ในดิสก์ภายในเครื่อง
Borg อ่านโดยตรงจาก S3 โดยไม่มีแคช ชั่วโมง 33. ยาวอย่างน่ากลัว
สิ่งสำคัญที่สุดคือ Borg สามารถบีบอัดและมี blobs ที่ใหญ่ขึ้น ซึ่งทำให้การจัดเก็บและการดำเนินการ GET/PUT ใน S3 ถูกลง แต่สิ่งนี้ต้องแลกมาด้วยการตรวจสอบที่ซับซ้อนและช้าลง สำหรับความเร็วในการฟื้นตัว เราไม่ได้สังเกตเห็นความแตกต่างใดๆ Retic จะใช้เวลาในการสำรองข้อมูลครั้งต่อไป (หลังจากการสำรองข้อมูลครั้งแรก) นานขึ้นเล็กน้อย แต่ไม่มากนัก
สุดท้ายแต่ไม่ท้ายสุดในตัวเลือกคือขนาดของชุมชน
และเราเลือกบอร์ก
คำไม่กี่คำเกี่ยวกับการบีบอัด
Borg มีอัลกอริธึมการบีบอัดใหม่ที่ยอดเยี่ยมในคลังแสง - zstd คุณภาพการบีบอัดไม่ได้แย่ไปกว่า gzip แต่เร็วกว่ามาก และเทียบความเร็วได้กับ lz4 ที่เป็นค่าเริ่มต้น
ตัวอย่างเช่น ดัมพ์ฐานข้อมูล MySQL ถูกบีบอัดได้ดีกว่า lz4 สองเท่าที่ความเร็วเท่ากัน อย่างไรก็ตาม ประสบการณ์กับข้อมูลจริงแสดงให้เห็นว่าอัตราส่วนการบีบอัดของโหนด Nextcloud มีความแตกต่างกันน้อยมาก
บอร์กมีโหมดการบีบอัดโบนัสค่อนข้าง - หากไฟล์มีเอนโทรปีสูง การบีบอัดจะไม่ถูกนำไปใช้เลย ซึ่งจะเพิ่มความเร็ว เปิดใช้งานโดยตัวเลือกเมื่อสร้าง
-C auto,zstd
สำหรับอัลกอริทึม zstd
ด้วยตัวเลือกนี้ เมื่อเปรียบเทียบกับการบีบอัดเริ่มต้น เราก็ได้
560Gb และ 562Gb ตามลำดับ ข้อมูลจากตัวอย่างข้างต้น ผมขอเตือนคุณว่า หากไม่มีการบีบอัด ผลลัพธ์ที่ได้คือ 628Gb ผลลัพธ์ของความแตกต่าง 2GB ค่อนข้างทำให้เราประหลาดใจ แต่เราคิดว่าจะเลือกมันในที่สุด auto,zstd
.
วิธีการตรวจสอบการสำรองข้อมูล
ตามตัวกำหนดตารางเวลา เครื่องเสมือนจะถูกเปิดใช้งานโดยตรงจากผู้ให้บริการหรือจากไคลเอนต์ ซึ่งจะช่วยลดภาระของเครือข่ายได้อย่างมาก อย่างน้อยก็ถูกกว่าการเลี้ยงเองและดึงดูดปริมาณการเข้าชม
goofys --cache "--free:5%:/mnt/cache" -o allow_other --endpoint https://storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com /mnt/goofys
export BORG_PASSCOMMAND="cat /home/borg/.borg-passphrase"
borg list /mnt/goofys/borg1/
borg check --debug -p --verify-data /mnt/goofys/borg1/
โดยใช้รูปแบบเดียวกัน เราจะตรวจสอบไฟล์ด้วยโปรแกรมป้องกันไวรัส (หลังจากนั้น) ท้ายที่สุดแล้ว ผู้ใช้อัปโหลดสิ่งต่าง ๆ ไปยัง Nextcloud และไม่ใช่ทุกคนที่มีโปรแกรมป้องกันไวรัส การตรวจสอบในขณะที่เทใช้เวลานานเกินไปและเป็นอุปสรรคต่อการดำเนินธุรกิจ
ความสามารถในการปรับขนาดทำได้โดยการรันรันเนอร์บนโหนดที่แตกต่างกันด้วยแท็กที่แตกต่างกัน
การตรวจสอบของเราจะรวบรวมสถานะการสำรองข้อมูลผ่าน GitLab API ในหน้าต่างเดียว หากจำเป็น ปัญหาจะสังเกตได้ง่ายและแปลเป็นภาษาท้องถิ่นได้ง่ายเช่นกัน
ข้อสรุป
เป็นผลให้เรารู้แน่ว่าเราทำการสำรองข้อมูลว่าการสำรองข้อมูลของเราถูกต้อง ปัญหาที่เกิดขึ้นใช้เวลาน้อยและได้รับการแก้ไขในระดับหน้าที่ผู้ดูแลระบบ การสำรองข้อมูลใช้พื้นที่น้อยมากเมื่อเทียบกับ tar.gz หรือ Bacula
ที่มา: will.com