Ceph ผ่าน iSCSI - หรือเล่นสกีขณะยืนอยู่บนเปลญวน

ในหมู่พวกเรา (tsefovodov) มีคนที่ไม่ชอบ "มืออาชีพสุดขั้ว" หรือไม่?

ไม่น่าเป็นไปได้ - ไม่เช่นนั้นเราคงไม่กลิ้งไปมากับผลิตภัณฑ์ที่น่าสนใจและตลกอย่างยิ่งนี้

หลายๆ คนที่มีส่วนร่วมในการดำเนินงานของ Ceph ได้พบกับการเชื่อมต่อ Ceph ผ่าน iSCSI หรือ FC ที่ไม่บ่อยนัก (หรือค่อนข้างไม่บ่อยนัก) แต่บางครั้งก็เป็นกรณีที่มีความต้องการ เพื่ออะไร? ตัวอย่างเช่น ส่งรูปภาพจาก Ceph ไปยังเซิร์ฟเวอร์ Windows หรือ Solaris ที่ยังไม่ได้ทำการจำลองเสมือนด้วยเหตุผลบางประการ หรือแบบเวอร์ช่วลไลซ์ แต่ใช้ไฮเปอร์ไวเซอร์ที่ไม่สามารถทำ Ceph ได้ และอย่างที่เราทราบก็มีไฮเปอร์ไวเซอร์มากมาย ตัวอย่างเช่น? ตัวอย่างเช่น HyperV หรือ ESXi ซึ่งใช้งานอยู่ และหากงานเกิดขึ้นจากการให้บริการอิมเมจจาก Ceph ไปยังเครื่องรับแขก นี่จะกลายเป็นงานที่น่าตื่นเต้นมาก

ดังนั้นให้:

  1. คลัสเตอร์ Ceph ที่ทำงานอยู่แล้ว
  2. รูปภาพที่มีอยู่แล้วซึ่งจะต้องให้บริการผ่าน iSCSI
  3. ชื่อสระน้ำ มายพูล, ชื่อภาพ มายอิมเมจ

เริ่ม?

ก่อนอื่น เมื่อเราพูดถึง FC หรือ iSCSI เรามีหน่วยงานเช่นผู้ริเริ่มและเป้าหมาย เป้าหมายคือเซิร์ฟเวอร์จริงๆ ตัวเริ่มต้นคือไคลเอ็นต์ หน้าที่ของเราคือการส่งอิมเมจ Ceph ไปยังผู้ริเริ่มโดยใช้ความพยายามเพียงเล็กน้อย ซึ่งหมายความว่าเราต้องขยายเป้าหมาย แต่ที่ไหนบนคอมพิวเตอร์เครื่องไหน?

โชคดีที่ในคลัสเตอร์ Ceph เรามีองค์ประกอบอย่างน้อยหนึ่งรายการซึ่งมีที่อยู่ IP คงที่ และมีการกำหนดค่าองค์ประกอบที่สำคัญที่สุดรายการหนึ่งของ Ceph และส่วนประกอบนั้นคือจอภาพ ดังนั้นเราจึงติดตั้งเป้าหมาย iSCSI บนจอภาพ (และตัวเริ่มต้นในเวลาเดียวกัน อย่างน้อยก็สำหรับการทดสอบ) ฉันทำสิ่งนี้บน CentOS แต่โซลูชันนี้เหมาะสำหรับการแจกจ่ายอื่น ๆ คุณเพียงแค่ต้องติดตั้งแพ็คเกจในลักษณะที่เป็นที่ยอมรับในการแจกจ่ายของคุณ

# yum -y install iscsi-initiator-utils targetcli

วัตถุประสงค์ของแพ็คเกจที่ติดตั้งคืออะไร?

  • เป้าหมายcli — ยูทิลิตี้สำหรับจัดการเป้าหมาย SCSI ที่สร้างไว้ในเคอร์เนล Linux
  • iscsi-initiator-utils — แพ็คเกจพร้อมยูทิลิตี้ที่ใช้จัดการ iSCSI Initiator ที่สร้างไว้ในเคอร์เนล Linux

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

หากเราใช้การกระจายที่ค่อนข้างเสถียรและมีรอบการสนับสนุนที่ยาวนาน ดังนั้นเคอร์เนลที่เรามีก็คือเวอร์ชันโบราณบางรุ่น ตัวอย่างเช่น ใน CentOS7 คือ 3.10.* ใน CentOS8 คือ 4.19 และเราสนใจเคอร์เนลอย่างน้อย 5.3 (หรือมากกว่า 5.4) และใหม่กว่า ทำไม เนื่องจากโดยค่าเริ่มต้น อิมเมจ Ceph จะมีชุดตัวเลือกที่เปิดใช้งานซึ่งเข้ากันไม่ได้กับเคอร์เนลรุ่นเก่า ซึ่งหมายความว่าเราเชื่อมต่อพื้นที่เก็บข้อมูลกับเคอร์เนลใหม่เพื่อการแจกจ่ายของเรา (ตัวอย่างเช่น สำหรับ CentOS นี่คือ elrepo) ติดตั้งเคอร์เนลใหม่และรีบูตระบบเพื่อทำงานกับเคอร์เนลใหม่:

  • เชื่อมต่อกับจอภาพที่เลือกสำหรับการทดสอบ
  • เราเชื่อมต่อที่เก็บ elrepo ตามคำแนะนำ - elrepo.org/tiki/tiki-index.php
  • ติดตั้งเคอร์เนล: yum -y —enablerepo=elrepo-kernel ติดตั้ง kernel-ml
  • รีบูทเซิร์ฟเวอร์ด้วยมอนิเตอร์ (เรามีมอนิเตอร์สามตัวใช่ไหม?)

การเชื่อมต่อภาพเป็นอุปกรณ์บล็อก

# rbd map mypool/myimage
/dev/rbd0

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

สร้างแบ็คเอนด์ชื่อ disk1 ที่เชื่อมโยงกับไฟล์ /dev/rbd/mypool/myimage ไฟล์ที่ระบุเป็นลิงก์สัญลักษณ์ที่สร้างขึ้นโดยอัตโนมัติโดย udev daemon ไปยัง /dev/rbd0 เราใช้ลิงก์สัญลักษณ์เนื่องจากชื่อของอุปกรณ์ rbd สามารถเปลี่ยนแปลงได้ขึ้นอยู่กับลำดับที่อิมเมจ Ceph เชื่อมต่อกับโฮสต์

สร้างแบ็กเอนด์:

# targetcli /backstores/block create disk1 /dev/rbd/mypool/myimage

สร้างเป้าหมาย iSCSI:

# targetcli /iscsi create iqn.2020-01.demo.ceph:mypool

เราเชื่อมต่อแบ็กเอนด์เป็น LUN กับเป้าหมาย:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/luns create /backstores/block/disk1

มากำหนดค่าเป้าหมายสำหรับโหมดสาธิต:

# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute demo_mode_write_protect=0
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute generate_node_acls=1
# targetcli /iscsi/iqn.2020-01.demo.ceph:mypool/tpg1/ set
> attribute cache_dynamic_acls=1

บันทึกการกำหนดค่า:

# targetcli saveconfig

การตรวจสอบการมีอยู่ของเป้าหมาย:

# iscsiadm -m discovery -t st -p 127.0.0.1:3260
127.0.0.1:3260,1 iqn.2020-01.demo.ceph:mypool

เราเชื่อมต่อเป้าหมาย:

# iscsiadm -m node --login
Logging in to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] (multiple)
Login to [iface: default, target: iqn.2020-01.demo.ceph:mypool, portal: 127.0.0.1,3260] successful.

หากคุณทำทุกอย่างถูกต้อง ดิสก์ใหม่จะปรากฏบนเซิร์ฟเวอร์ซึ่งดูเหมือนอุปกรณ์ SCSI แต่จริงๆ แล้วเป็นรูปภาพจาก Ceph ซึ่งเข้าถึงได้ผ่านเป้าหมาย iSCSI เพื่อหลีกเลี่ยงปัญหาการบู๊ต ควรลบดิสก์ที่เชื่อมต่อและเป้าหมายที่ตรวจพบออกจากตัวเริ่มต้นโลคัล:

# iscsiadm -m node --logout
# iscsiadm -m discoverydb -o delete -t st -p 127.0.0.1:3260

สิ่งที่เหลืออยู่คือต้องคงการกำหนดค่าไว้เพื่อให้รูปภาพเชื่อมต่อโดยอัตโนมัติ และหลังจากการเชื่อมต่อ เป้าหมายจะถูกแบ่งชั้น การเปิดตัวเป้าหมายประกอบด้วยสองขั้นตอน - การเชื่อมต่อ RBD และการเปิดตัวเป้าหมายจริง

ขั้นแรก มากำหนดค่าการเชื่อมต่ออัตโนมัติของอิมเมจ RBD กับโฮสต์ ซึ่งทำได้โดยการเพิ่มบรรทัดต่อไปนี้ในไฟล์ /etc/ceph/rbdmap:

# cat /etc/ceph/rbdmap
# RbdDevice Parameters
mypool/myimage id=admin
# systemctl enable rbdmap

การคืนค่าการกำหนดค่าเป้าหมายนั้นซับซ้อนกว่าเล็กน้อย - เราจำเป็นต้องเขียนหน่วยสำหรับ systemd ที่จะกู้คืนการกำหนดค่า:

# cat /usr/lib/systemd/system/scsi-target.service
[Unit] Description=Start iSCSI target

After=network-online.target rbdmap.service
Before=remote-fs-pre.target
Wants=network-online.target remote-fs-pre.target

[Service] Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/targetcli restoreconfig

[Install] WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl enable scsi-target

การทดสอบขั้นสุดท้ายคือการรีบูตจอภาพของเราอีกครั้ง (ตอนนี้เป็นเป้าหมายของ iSCSI) ควรสังเกตว่าหากเราไม่ได้ล้างฐานข้อมูลของผู้เริ่มต้นด้วยคำสั่ง iscsiadm -n Discoverydb -o ลบ ... คุณอาจพบว่าเซิร์ฟเวอร์ไม่โหลดหรือใช้เวลาโหลดนาน

มีอะไรเหลือบ้าง?

กำหนดค่าตัวเริ่มต้นบนเซิร์ฟเวอร์ที่เราต้องการส่งเป้าหมาย

จะรับประกันความทนทานต่อความผิดพลาดของเป้าหมายของเราได้อย่างไร?

คุณสามารถกำหนดค่าเป้าหมายบนจอภาพอื่นและตั้งค่าหลายเส้นทางในทำนองเดียวกัน (vmware จะเข้าใจสิ่งนี้และใช้งานได้ Hyper-V จะไม่เข้าใจ - ต้องใช้การล็อค SCSI) เนื่องจากไคลเอ็นต์ Ceph จากเคอร์เนลไม่ได้ใช้แคช จึงค่อนข้างใช้งานได้ หรืออีกทางเลือกหนึ่งคือการสร้างทรัพยากรคลัสเตอร์ที่มีสามองค์ประกอบ - ที่อยู่ IP เป้าหมายเฉพาะและบริการ rbdmap และ scsi-target และจัดการทรัพยากรนี้ผ่านเครื่องมือการทำคลัสเตอร์ (ใครบอกว่าเครื่องกระตุ้นหัวใจ?)

แทนที่จะเป็นคำทับศัพท์

ตามที่ชัดเจนบทความนี้เป็นเรื่องตลกเล็กน้อย - แต่ในนั้นฉันพยายาม "อย่างรวดเร็วและมีตัวอย่าง" พิจารณาหัวข้อที่ได้รับความนิยมหลายหัวข้อในเวลาเดียวกัน - เป้าหมาย iSCSI ซึ่งอาจไม่จำเป็นต้องส่งออกรูปภาพ Ceph - แต่ตัวอย่างเช่น ส่งออกวอลุ่ม LVM พื้นฐานของการทำงานกับตัวเริ่มต้น iSCSI ( วิธีสแกนเป้าหมาย วิธีเชื่อมต่อกับเป้าหมาย ตัดการเชื่อมต่อ ลบรายการเป้าหมายออกจากฐานข้อมูล) การเขียนหน่วยของคุณเองสำหรับ systemd และอื่น ๆ

ฉันหวังว่าแม้ว่าคุณจะไม่ทำการทดลองทั้งหมดนี้ซ้ำทั้งหมด แต่อย่างน้อยบางสิ่งจากบทความนี้ก็มีประโยชน์สำหรับคุณ

ที่มา: will.com

เพิ่มความคิดเห็น