การใช้ Ceph เป็นที่จัดเก็บข้อมูลเครือข่ายในโปรเจ็กต์ที่มีโหลดต่างกัน เราอาจเผชิญกับงานต่างๆ ที่เมื่อมองแวบแรกดูเหมือนจะไม่ง่ายหรือไม่สำคัญ ตัวอย่างเช่น:
- การโยกย้ายข้อมูลจาก Ceph เก่าไปยังใหม่โดยใช้เซิร์ฟเวอร์ก่อนหน้าบางส่วนในคลัสเตอร์ใหม่
- วิธีแก้ปัญหาการจัดสรรพื้นที่ดิสก์ใน Ceph
เมื่อจัดการกับปัญหาดังกล่าว เรากำลังเผชิญกับความจำเป็นในการลบ OSD อย่างถูกต้องโดยไม่สูญเสียข้อมูล ซึ่งมีความสำคัญอย่างยิ่งเมื่อต้องจัดการกับข้อมูลจำนวนมาก เรื่องนี้จะมีการหารือในบทความ
วิธีการที่อธิบายไว้ด้านล่างนี้เกี่ยวข้องกับ Ceph ทุกเวอร์ชัน นอกจากนี้ ความจริงที่ว่า Ceph สามารถจัดเก็บข้อมูลจำนวนมากได้จะถูกนำมาพิจารณาด้วย: เพื่อป้องกันข้อมูลสูญหายและปัญหาอื่นๆ การดำเนินการบางอย่างจะถูก "แยก" ออกเป็นหลายๆ การกระทำ
คำนำเกี่ยวกับ OSD
เนื่องจากสองในสามสูตรอาหารที่กล่าวถึงนั้นมีไว้สำหรับ OSD โดยเฉพาะ (
ก่อนอื่น ควรกล่าวว่าคลัสเตอร์ Ceph ทั้งหมดประกอบด้วย OSD จำนวนมาก ยิ่งมีจำนวนข้อมูลว่างใน Ceph มากเท่าใด เข้าใจง่ายจากที่นี่ ฟังก์ชั่น OSD หลัก: จัดเก็บข้อมูลออบเจ็กต์ Ceph บนระบบไฟล์ของโหนดคลัสเตอร์ทั้งหมดและให้การเข้าถึงเครือข่าย (สำหรับการอ่าน การเขียน และคำขออื่นๆ)
ในระดับเดียวกัน พารามิเตอร์การจำลองจะถูกตั้งค่าโดยการคัดลอกอ็อบเจ็กต์ระหว่าง OSD ที่แตกต่างกัน และที่นี่คุณจะพบกับปัญหาต่าง ๆ ซึ่งจะกล่าวถึงแนวทางแก้ไขด้านล่างนี้
คดีหมายเลข 1 ลบ OSD ออกจากคลัสเตอร์ Ceph อย่างปลอดภัยโดยไม่สูญเสียข้อมูล
ความจำเป็นในการลบ OSD อาจเกิดจากการลบเซิร์ฟเวอร์ออกจากคลัสเตอร์ - ตัวอย่างเช่นเพื่อแทนที่ด้วยเซิร์ฟเวอร์อื่น - ซึ่งเป็นสิ่งที่เกิดขึ้นกับเราทำให้เกิดการเขียนบทความนี้ ดังนั้นเป้าหมายสูงสุดของการจัดการคือการแยก OSD และมอนทั้งหมดบนเซิร์ฟเวอร์ที่กำหนดเพื่อให้สามารถหยุดได้
เพื่อความสะดวกและเพื่อหลีกเลี่ยงสถานการณ์ที่ในขณะที่ดำเนินการคำสั่ง เราทำผิดพลาดในการระบุ OSD ที่ต้องการ เราจะตั้งค่าตัวแปรแยกต่างหาก โดยค่าจะเป็นตัวเลขของ OSD ที่จะลบ มาโทรหาเธอกันเถอะ ${ID}
— ที่นี่และด้านล่าง ตัวแปรดังกล่าวจะแทนที่หมายเลข OSD ที่เรากำลังทำงานอยู่
มาดูสภาพก่อนเริ่มงานกัน:
root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.46857 root default
-3 0.15619 host hv-1
-5 0.15619 host hv-2
1 ssd 0.15619 osd.1 up 1.00000 1.00000
-7 0.15619 host hv-3
2 ssd 0.15619 osd.2 up 1.00000 1.00000
เพื่อเริ่มต้นการลบ OSD คุณจะต้องดำเนินการอย่างราบรื่น reweight
ให้เป็นศูนย์ วิธีนี้เราจะลดจำนวนข้อมูลใน OSD โดยการปรับสมดุลกับ OSD อื่นๆ เมื่อต้องการทำเช่นนี้ ให้รันคำสั่งต่อไปนี้:
ceph osd reweight osd.${ID} 0.98
ceph osd reweight osd.${ID} 0.88
ceph osd reweight osd.${ID} 0.78
... และต่อ ๆ ไปจนเป็นศูนย์
ต้องการความสมดุลที่ราบรื่นเพื่อไม่ให้ข้อมูลสูญหาย โดยเฉพาะอย่างยิ่งหาก OSD มีข้อมูลจำนวนมาก เพื่อให้แน่ใจว่าหลังจากรันคำสั่งแล้ว reweight
ทุกอย่างเป็นไปด้วยดี คุณทำมันให้สำเร็จได้ ceph -s
หรือเรียกใช้ในหน้าต่างเทอร์มินัลแยกต่างหาก ceph -w
เพื่อสังเกตการเปลี่ยนแปลงได้แบบเรียลไทม์
เมื่อ OSD “ว่างเปล่า” คุณสามารถดำเนินการตามขั้นตอนมาตรฐานเพื่อลบออกได้ เมื่อต้องการทำเช่นนี้ ให้โอน OSD ที่ต้องการไปยังสถานะ down
:
ceph osd down osd.${ID}
ลอง “ดึง” OSD ออกจากคลัสเตอร์:
ceph osd out osd.${ID}
มาหยุดบริการ OSD และถอนติดตั้งพาร์ติชันใน FS:
systemctl stop ceph-osd@${ID}
umount /var/lib/ceph/osd/ceph-${ID}
ลบ OSD ออกจาก
ceph osd crush remove osd.${ID}
มาลบผู้ใช้ OSD:
ceph auth del osd.${ID}
และสุดท้าย เรามาลบ OSD กัน:
ceph osd rm osd.${ID}
หมายเหตุ: หากคุณใช้เวอร์ชัน Ceph Luminous หรือสูงกว่า ขั้นตอนการลบ OSD ข้างต้นสามารถลดลงเหลือเพียงสองคำสั่ง:
ceph osd out osd.${ID}
ceph osd purge osd.${ID}
หากหลังจากทำตามขั้นตอนที่อธิบายไว้ข้างต้นแล้ว คุณรันคำสั่ง ceph osd tree
ดังนั้นควรชัดเจนว่าบนเซิร์ฟเวอร์ที่ดำเนินงานนั้นไม่มี OSD อีกต่อไปซึ่งดำเนินการข้างต้น:
root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.46857 root default
-3 0.15619 host hv-1
-5 0.15619 host hv-2
-7 0.15619 host hv-3
2 ssd 0.15619 osd.2 up 1.00000 1.00000
ระหว่างทางสังเกตว่าสถานะของคลัสเตอร์ Ceph จะไป HEALTH_WARN
และเราจะเห็นจำนวน OSD และจำนวนพื้นที่ว่างในดิสก์ที่ลดลงด้วย
ต่อไปนี้จะอธิบายขั้นตอนที่จำเป็นหากคุณต้องการหยุดเซิร์ฟเวอร์โดยสมบูรณ์ และลบออกจาก Ceph ตามลำดับ ในกรณีนี้ สิ่งสำคัญคือต้องจำไว้ว่า ก่อนที่จะปิดเซิร์ฟเวอร์ คุณต้องลบ OSD ทั้งหมดออก บนเซิร์ฟเวอร์นี้
หากไม่มี OSD เหลืออยู่บนเซิร์ฟเวอร์นี้แล้ว หลังจากลบออกแล้ว คุณจะต้องแยกเซิร์ฟเวอร์ออกจากแมป OSD hv-2
โดยรันคำสั่งต่อไปนี้:
ceph osd crush rm hv-2
ลบ mon
จากเซิร์ฟเวอร์ hv-2
โดยการรันคำสั่งด้านล่างบนเซิร์ฟเวอร์อื่น (เช่น ในกรณีนี้ เปิด hv-1
):
ceph-deploy mon destroy hv-2
หลังจากนี้ คุณสามารถหยุดเซิร์ฟเวอร์และเริ่มดำเนินการตามมาได้ (ปรับใช้ใหม่ ฯลฯ)
คดีหมายเลข 2 การกระจายพื้นที่ดิสก์ในคลัสเตอร์ Ceph ที่สร้างไว้แล้ว
ฉันจะเริ่มเรื่องที่สองด้วยคำนำเกี่ยวกับ PG (
ดังนั้น: หนึ่งในปัญหาทั่วไปเมื่อใช้ Ceph คือจำนวน OSD และ PG ที่ไม่สมดุลระหว่างพูลใน Ceph
ประการแรก ด้วยเหตุนี้ สถานการณ์จึงอาจเกิดขึ้นเมื่อระบุ PG มากเกินไปในพูลขนาดเล็ก ซึ่งโดยพื้นฐานแล้วเป็นการใช้พื้นที่ดิสก์ในคลัสเตอร์อย่างไม่มีเหตุผล ประการที่สอง ในทางปฏิบัติมีปัญหาร้ายแรงกว่านั้น: ข้อมูลล้นใน OSD อันใดอันหนึ่ง สิ่งนี้ทำให้คลัสเตอร์เปลี่ยนไปเป็นสถานะก่อน HEALTH_WARN
และจากนั้น HEALTH_ERR
. เหตุผลก็คือ Ceph เมื่อคำนวณจำนวนข้อมูลที่มีอยู่ (คุณสามารถค้นหาได้โดย MAX AVAIL
ในเอาต์พุตคำสั่ง ceph df
สำหรับแต่ละพูลแยกกัน) ขึ้นอยู่กับจำนวนข้อมูลที่มีอยู่ใน OSD หากมีพื้นที่ไม่เพียงพอใน OSD อย่างน้อยหนึ่งรายการ จะไม่สามารถเขียนข้อมูลได้อีกจนกว่าข้อมูลจะถูกกระจายอย่างเหมาะสมไปยัง OSD ทั้งหมด
เป็นเรื่องที่ควรชี้แจงว่าปัญหาเหล่านี้ ส่วนใหญ่จะได้รับการตัดสินใจในขั้นตอนการกำหนดค่าคลัสเตอร์ Ceph. หนึ่งในเครื่องมือที่คุณสามารถใช้ได้คือ
ลองจินตนาการถึงภาพต่อไปนี้: คลัสเตอร์มีสถานะ HEALTH_WARN
เนื่องจาก OSD อันใดอันหนึ่งหมดพื้นที่ สิ่งนี้จะถูกระบุด้วยข้อผิดพลาด HEALTH_WARN: 1 near full osd
. ด้านล่างนี้เป็นอัลกอริทึมสำหรับการออกจากสถานการณ์นี้
ก่อนอื่น คุณต้องกระจายข้อมูลที่มีอยู่ระหว่าง OSD ที่เหลือ เราได้ดำเนินการที่คล้ายกันแล้วในกรณีแรกเมื่อเรา "ระบาย" โหนด - มีความแตกต่างเพียงอย่างเดียวที่ตอนนี้เราจะต้องลดลงเล็กน้อย reweight
. ตัวอย่างเช่น สูงถึง 0.95:
ceph osd reweight osd.${ID} 0.95
ซึ่งจะช่วยเพิ่มพื้นที่ว่างในดิสก์ใน OSD และแก้ไขข้อผิดพลาดในการทำงานของ Ceph อย่างไรก็ตาม ดังที่ได้กล่าวไปแล้ว ปัญหานี้ส่วนใหญ่เกิดขึ้นเนื่องจากการกำหนดค่า Ceph ที่ไม่ถูกต้องในระยะเริ่มแรก: สิ่งสำคัญมากคือต้องทำการกำหนดค่าใหม่เพื่อไม่ให้ปรากฏขึ้นอีกในอนาคต
ในกรณีเฉพาะของเรา ทุกอย่างขึ้นอยู่กับ:
- มูลค่าสูงเกินไป
replication_count
ในสระน้ำแห่งหนึ่ง - PG มากเกินไปในกลุ่มหนึ่ง และน้อยเกินไปในอีกกลุ่มหนึ่ง
ลองใช้เครื่องคิดเลขที่กล่าวไปแล้ว มันแสดงให้เห็นอย่างชัดเจนถึงสิ่งที่ต้องป้อนและโดยหลักการแล้วไม่มีอะไรซับซ้อน เมื่อตั้งค่าพารามิเตอร์ที่จำเป็นแล้วเราได้รับคำแนะนำดังต่อไปนี้:
หมายเหตุ: หากคุณกำลังตั้งค่าคลัสเตอร์ Ceph ตั้งแต่เริ่มต้น ฟังก์ชันที่มีประโยชน์อีกอย่างหนึ่งของเครื่องคิดเลขคือการสร้างคำสั่งที่จะสร้างพูลตั้งแต่เริ่มต้นด้วยพารามิเตอร์ที่ระบุในตาราง
คอลัมน์สุดท้ายช่วยคุณนำทาง - จำนวน PG ที่แนะนำ. ในกรณีของเรา อันที่สองก็มีประโยชน์เช่นกัน โดยมีการระบุพารามิเตอร์การจำลอง เนื่องจากเราตัดสินใจเปลี่ยนตัวคูณการจำลอง
ดังนั้นก่อนอื่นคุณต้องเปลี่ยนพารามิเตอร์การจำลอง - สิ่งนี้คุ้มค่าที่จะทำก่อนเนื่องจากเราจะเพิ่มพื้นที่ว่างในดิสก์ด้วยการลดตัวคูณ เมื่อคำสั่งทำงาน คุณจะสังเกตเห็นว่าพื้นที่ว่างในดิสก์จะเพิ่มขึ้น:
ceph osd pool $pool_name set $replication_size
และหลังจากเสร็จสิ้นเราจะเปลี่ยนค่าพารามิเตอร์ pg_num
и pgp_num
ดังต่อไปนี้:
ceph osd pool set $pool_name pg_num $pg_number
ceph osd pool set $pool_name pgp_num $pg_number
มันเป็นสิ่งสำคัญ: เราต้องเปลี่ยนจำนวน PG ตามลำดับในแต่ละพูลและไม่เปลี่ยนค่าในพูลอื่นจนกว่าคำเตือนจะหายไป “ลดความซ้ำซ้อนของข้อมูล” и "n-จำนวน pgs ลดลง".
คุณยังสามารถตรวจสอบได้ว่าทุกอย่างเป็นไปด้วยดีโดยใช้เอาต์พุตคำสั่ง ceph health detail
и ceph -s
.
คดีหมายเลข 3 การย้ายเครื่องเสมือนจาก LVM ไปยัง Ceph RBD
ในสถานการณ์ที่โปรเจ็กต์ใช้เครื่องเสมือนที่ติดตั้งบนเซิร์ฟเวอร์ Bare-Metal ที่เช่ามา ปัญหาของพื้นที่จัดเก็บข้อมูลที่ทนทานต่อข้อผิดพลาดมักเกิดขึ้น เป็นที่พึงปรารถนาอย่างยิ่งว่ามีพื้นที่เพียงพอในที่เก็บข้อมูลนี้... อีกสถานการณ์ทั่วไป: มีเครื่องเสมือนพร้อมที่เก็บข้อมูลในเครื่องบนเซิร์ฟเวอร์และคุณต้องขยายดิสก์ แต่ไม่มีที่ไหนให้ไปเพราะไม่มี พื้นที่ว่างบนดิสก์ที่เหลืออยู่บนเซิร์ฟเวอร์
ปัญหาสามารถแก้ไขได้หลายวิธี - ตัวอย่างเช่นโดยการย้ายไปยังเซิร์ฟเวอร์อื่น (ถ้ามี) หรือเพิ่มดิสก์ใหม่ไปยังเซิร์ฟเวอร์ แต่ก็ไม่สามารถทำได้เสมอไป ดังนั้นการย้ายจาก LVM ไปยัง Ceph จึงเป็นวิธีแก้ปัญหาที่ยอดเยี่ยม ด้วยการเลือกตัวเลือกนี้ เรายังทำให้กระบวนการโยกย้ายระหว่างเซิร์ฟเวอร์เพิ่มเติมง่ายขึ้น เนื่องจากไม่จำเป็นต้องย้ายที่เก็บข้อมูลในเครื่องจากไฮเปอร์ไวเซอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง สิ่งเดียวที่จับได้คือคุณจะต้องหยุด VM ในขณะที่กำลังดำเนินการงาน
สูตรต่อไปนี้นำมาจาก
เรามาดูส่วนที่ใช้งานได้จริงกันดีกว่า ในตัวอย่าง เราใช้ virsh และ libvirt ตามลำดับ ขั้นแรก ตรวจสอบให้แน่ใจว่าพูล Ceph ที่จะย้ายข้อมูลนั้นเชื่อมต่อกับ libvirt:
virsh pool-dumpxml $ceph_pool
คำอธิบายพูลต้องมีข้อมูลการเชื่อมต่อกับ Ceph พร้อมข้อมูลการอนุญาต
ขั้นตอนต่อไปคืออิมเมจ LVM จะถูกแปลงเป็น Ceph RBD เวลาในการดำเนินการขึ้นอยู่กับขนาดของภาพเป็นหลัก:
qemu-img convert -p -O rbd /dev/main/$vm_image_name rbd:$ceph_pool/$vm_image_name
หลังจากการแปลง อิมเมจ LVM จะยังคงอยู่ ซึ่งจะเป็นประโยชน์หากการย้าย VM ไปยัง RBD ล้มเหลว และคุณต้องย้อนกลับการเปลี่ยนแปลง นอกจากนี้ เพื่อให้สามารถย้อนกลับการเปลี่ยนแปลงได้อย่างรวดเร็ว มาสร้างการสำรองข้อมูลไฟล์การกำหนดค่าเครื่องเสมือน:
virsh dumpxml $vm_name > $vm_name.xml
cp $vm_name.xml $vm_name_backup.xml
... และแก้ไขต้นฉบับ (vm_name.xml
). มาหาบล็อกที่มีคำอธิบายของดิสก์ (เริ่มต้นด้วยบรรทัด <disk type='file' device='disk'>
และลงท้ายด้วย </disk>
) และลดขนาดให้อยู่ในรูปแบบต่อไปนี้:
<disk type='network' device='disk'>
<driver name='qemu'/>
<auth username='libvirt'>
<secret type='ceph' uuid='sec-ret-uu-id'/>
</auth>
<source protocol='rbd' name='$ceph_pool/$vm_image_name>
<host name='10.0.0.1' port='6789'/>
<host name='10.0.0.2' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
มาดูรายละเอียดกันดีกว่า:
- ไปที่โปรโตคอล
source
ระบุที่อยู่ไปยังที่เก็บข้อมูลใน Ceph RBD (นี่คือที่อยู่ที่ระบุชื่อพูล Ceph และอิมเมจ RBD ซึ่งถูกกำหนดในขั้นตอนแรก) - ในบล็อค
secret
มีการระบุประเภทceph
รวมถึง UUID ของข้อมูลลับที่จะเชื่อมต่อด้วย คุณสามารถค้นหา uuid ได้โดยใช้คำสั่งvirsh secret-list
. - ในบล็อค
host
ที่อยู่ไปยังจอภาพ Ceph จะถูกระบุ
หลังจากแก้ไขไฟล์การกำหนดค่าและแปลง LVM เป็น RBD เสร็จแล้ว คุณสามารถใช้ไฟล์การกำหนดค่าที่แก้ไขแล้วและเริ่มเครื่องเสมือนได้:
virsh define $vm_name.xml
virsh start $vm_name
ถึงเวลาตรวจสอบว่าเครื่องเสมือนเริ่มต้นอย่างถูกต้อง: คุณสามารถค้นหาได้โดยการเชื่อมต่อผ่าน SSH หรือทาง virsh
.
หากเครื่องเสมือนทำงานอย่างถูกต้องและคุณไม่พบปัญหาอื่นใด คุณสามารถลบอิมเมจ LVM ที่ไม่ได้ใช้อีกต่อไปได้:
lvremove main/$vm_image_name
ข้อสรุป
เราพบกรณีที่อธิบายไว้ทั้งหมดในทางปฏิบัติ - เราหวังว่าคำแนะนำนี้จะช่วยให้ผู้ดูแลระบบรายอื่นแก้ไขปัญหาที่คล้ายกัน หากคุณมีความคิดเห็นหรือเรื่องราวอื่นที่คล้ายคลึงกันจากประสบการณ์การใช้ Ceph เรายินดีที่จะเห็นความคิดเห็นเหล่านั้นในความคิดเห็น!
PS
อ่านเพิ่มเติมในบล็อกของเรา:
- «
มือของเราไม่น่าเบื่อ: ฟื้นฟูคลัสเตอร์ Rook ใน K8 "; - «
จะโกงหรือไม่โกง - นั่นคือคำถาม "; - «
Rook - คลังข้อมูล "บริการตนเอง" สำหรับ Kubernetes "; - «
การสร้างพื้นที่เก็บข้อมูลถาวรด้วยการจัดเตรียมใน Kubernetes ตาม Ceph '
ที่มา: will.com