MongoDB Sharding: การสอนทีละขั้นตอนพร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
MongoDB การแบ่งส่วนข้อมูล (Sharding) คือการแบ่งชุดข้อมูลขนาดใหญ่เป็นชุดข้อมูลย่อยขนาดเล็กที่กระจายอยู่ทั่วหลายแหล่ง MongoDB ตัวอย่างเช่น คลัสเตอร์แบบชาร์ดจะลดภาระการทำงานของ CPU บนเซิร์ฟเวอร์แต่ละเครื่อง คลัสเตอร์แบบชาร์ดจะรวมชาร์ด เซิร์ฟเวอร์การกำหนดค่า และเราเตอร์เข้าด้วยกันเพื่อขยายขนาดพื้นที่จัดเก็บข้อมูลและปริมาณงานการค้นหาในแนวนอน
Sharding คืออะไร MongoDB?
Sharding เป็นแนวคิดใน MongoDBซึ่งแบ่งชุดข้อมูลขนาดใหญ่ออกเป็นชุดข้อมูลขนาดเล็กออกเป็นหลายชุด MongoDB ตัวอย่าง.
บางครั้งข้อมูลภายใน MongoDB จะมีขนาดใหญ่มากจนการเรียกใช้ข้อมูลจำนวนมากอาจทำให้ CPU บนเซิร์ฟเวอร์ทำงานหนักมาก เพื่อแก้ไขปัญหานี้ MongoDB มีแนวคิดเรื่อง Sharding ซึ่งโดยพื้นฐานแล้วคือการแบ่งชุดข้อมูลออกเป็นหลาย ๆ ชุด MongoDB ตัวอย่าง.
ชุดข้อมูลนี้ ซึ่งอาจมีขนาดใหญ่มากนั้น แท้จริงแล้วถูกแบ่งออกเป็นหลายชุดข้อมูลย่อย หรือที่เรียกว่า "ชาร์ด" โดยหลักการแล้ว ชาร์ดทั้งหมดทำงานเสมือนเป็นชุดข้อมูลเดียว
ข้อดีของการแบ่งส่วนข้อมูล (Sharding) ใน MongoDB
ก่อนที่จะนำคลัสเตอร์แบบแบ่งส่วน (sharded cluster) มาใช้งาน ควรทำความเข้าใจก่อนว่าทำไมทีมต่างๆ จึงเลือกใช้การแบ่งส่วน ประโยชน์หลักๆ มีดังนี้:
- ความสามารถในการขยายขนาดในแนวนอน: ข้อมูลถูกกระจายไปยังเซิร์ฟเวอร์ทั่วไปหลายเครื่องแทนที่จะบังคับให้เครื่องเดียวมีขนาดใหญ่ขึ้นเรื่อยๆ
- ปริมาณงานที่สูงขึ้น: การอ่านและการเขียนข้อมูลจะดำเนินการแบบขนานกันในแต่ละชาร์ด ทำให้คลัสเตอร์สามารถรองรับคำขอได้มากขึ้นต่อวินาที
- ความจุในการจัดเก็บที่มากขึ้น: ดิสก์ที่รวมกันของชาร์ดทั้งหมดสามารถจัดเก็บชุดข้อมูลที่มีขนาดใหญ่กว่าที่เซิร์ฟเวอร์เดียวจะจัดเก็บได้มาก
- ความพร้อมใช้งานสูง: เมื่อแต่ละชาร์ดถูกใช้งานในรูปแบบชุดจำลอง การที่โหนดใดโหนดหนึ่งล้มเหลวจะไม่ทำให้คลัสเตอร์ล่มไปด้วย
- โหลดสมดุล: การขอ MongoDB ตัวปรับสมดุลจะกระจายกลุ่มข้อมูลโดยอัตโนมัติเพื่อป้องกันไม่ให้ชาร์ดใดชาร์ดหนึ่งกลายเป็นจุดที่มีการใช้งานสูง
ข้อดีเหล่านี้รวมกันทำให้การแบ่งส่วนข้อมูล (sharding) กลายเป็นวิธีการมาตรฐานสำหรับการขยายขนาดระบบ MongoDB เกินขีดจำกัดของเซิร์ฟเวอร์ตัวเดียว
วิธีการใช้ Sharding
ชาร์ดถูกนำไปใช้โดยใช้คลัสเตอร์ ซึ่งก็คือกลุ่มของข้อมูลนั่นเอง MongoDB ตัวอย่าง.
ส่วนประกอบของชาร์ดประกอบด้วย:
- เศษ – นี่คือสิ่งพื้นฐาน และนี่ไม่ใช่อะไรนอกจากก MongoDB อินสแตนซ์ที่เก็บชุดย่อยของข้อมูล ในสภาพแวดล้อมการใช้งานจริง ชิ้นส่วนทั้งหมดจะต้องเป็นส่วนหนึ่งของชุดการจำลอง
- กำหนดค่าเซิร์ฟเวอร์ - มันคือ MongoDB อินสแตนซ์ที่เก็บข้อมูลเมตาเกี่ยวกับคลัสเตอร์ โดยพื้นฐานแล้วคือข้อมูลเกี่ยวกับส่วนต่างๆ MongoDB อินสแตนซ์ที่จะเก็บข้อมูลชาร์ดไว้
- เราเตอร์ - มันคือ MongoDB อินสแตนซ์ซึ่งโดยพื้นฐานแล้วมีหน้าที่ในการส่งต่อคำสั่งที่ส่งมาจากไคลเอ็นต์ไปยังเซิร์ฟเวอร์ที่ถูกต้อง
การแบ่งส่วนทีละขั้นตอน Cluster ตัวอย่าง
ขั้นตอน 1) สร้างฐานข้อมูลแยกต่างหากสำหรับเซิร์ฟเวอร์การกำหนดค่า
mkdir /data/configdb
ขั้นตอน 2) เริ่มต้น MongoDB ตัวอย่างเช่น ในโหมดการกำหนดค่า สมมติว่าเรามีเซิร์ฟเวอร์ชื่อ Server D ซึ่งจะเป็นเซิร์ฟเวอร์สำหรับการกำหนดค่า เราจะต้องเรียกใช้คำสั่งด้านล่างเพื่อกำหนดค่าเซิร์ฟเวอร์ให้เป็นเซิร์ฟเวอร์สำหรับการกำหนดค่า
mongod --configdb ServerD:27019
ขั้นตอน 3) เริ่มต้นใช้งาน MongoDB โดยระบุเซิร์ฟเวอร์การกำหนดค่า
mongos --configdb ServerD:27019
ขั้นตอน 4) จากเชลล์ mongo ให้เชื่อมต่อกับอินสแตนซ์ mongos
mongo --host ServerD --port 27017
ขั้นตอน 5) หากคุณมีเซิร์ฟเวอร์ A และเซิร์ฟเวอร์ B ที่ต้องการเพิ่มเข้าไปในคลัสเตอร์ ให้ใช้คำสั่งด้านล่างนี้
sh.addShard("ServerA:27017") sh.addShard("ServerB:27017")
ขั้นตอน 6) เปิดใช้งานการแบ่งส่วนฐานข้อมูล (Sharding) ดังนั้นหากเราต้องการแบ่งส่วนฐานข้อมูล Employeedb ให้ใช้คำสั่งด้านล่างนี้
sh.enableSharding("Employeedb")
ขั้นตอน 7) เปิดใช้งานการแบ่งส่วนข้อมูล (sharding) สำหรับคอลเลกชัน ดังนั้นหากเราต้องการแบ่งส่วนข้อมูลคอลเลกชันพนักงาน ให้ใช้คำสั่งด้านล่างนี้
sh.shardCollection("Employeedb.Employee", { "Employeeid": 1, "EmployeeName": 1 })
วิธีการเลือกคีย์ชาร์ดใน MongoDB
คีย์ชาร์ดคือฟิลด์ที่มีดัชนี หรือชุดของฟิลด์ ที่ MongoDB คีย์ใช้ในการตัดสินใจว่าชาร์ดใดจะจัดเก็บเอกสารแต่ละฉบับ เนื่องจากคีย์เป็นตัวกำหนดการกระจายข้อมูล การเลือกคีย์ที่ดีจึงเป็นการตัดสินใจที่สำคัญที่สุดในการใช้งานแบบชาร์ด คีย์ที่ไม่ดีจะทำให้ข้อมูลและการรับส่งข้อมูลกระจุกตัวอยู่ในชาร์ดเดียว ซึ่งจะทำให้ประโยชน์ของการแบ่งชาร์ดหมดไป
โดยทั่วไปแล้ว คีย์ชาร์ดที่แข็งแกร่งจะมีลักษณะดังต่อไปนี้:
- จำนวนสมาชิกสูง: ฟิลด์ควรมีค่าที่เป็นไปได้หลายค่า เพื่อให้สามารถแบ่งข้อมูลออกเป็นส่วนย่อยๆ ได้หลายส่วน
- ความถี่ต่ำ: ไม่ควรมีค่าใดค่าหนึ่งเด่นกว่าค่าอื่น มิเช่นนั้นเอกสารที่ใช้ค่าเดียวกันจะกระจุกตัวอยู่ในส่วนข้อมูลเดียว
- การเปลี่ยนแปลงที่ไม่เป็นไปตามลำดับ: คีย์ที่มีค่าเพิ่มขึ้นเรื่อยๆ เช่น ไทม์สแตมป์ จะส่งข้อมูลที่เขียนใหม่ทุกครั้งไปยังชาร์ดเดียวกัน ทำให้เกิดฮอตสปอตขึ้น
MongoDB รองรับกลยุทธ์การแบ่งข้อมูลสองแบบโดยอิงตามคีย์ การแบ่งข้อมูลแบบช่วง (Ranged sharding) จะแบ่งข้อมูลออกเป็นช่วงที่ต่อเนื่องกันและเหมาะสำหรับการค้นหาแบบช่วง ในขณะที่การแบ่งข้อมูลแบบแฮช (Hashed sharding) จะใช้ฟังก์ชันแฮชเพื่อกระจายการเขียนอย่างสม่ำเสมอไปยังชาร์ดต่างๆ ทีมงานมักเริ่มต้นด้วยการแบ่งข้อมูลแบบแฮชเมื่อมีการเขียนข้อมูลจำนวนมาก และเปลี่ยนไปใช้การแบ่งข้อมูลแบบช่วงเมื่อการอ่านข้อมูลแบบช่วงเป็นหลัก ไม่ว่าคุณจะเลือกกลยุทธ์ใดก็ตาม ควรทดสอบคีย์กับรูปแบบการค้นหาที่สมจริงก่อนที่จะยืนยัน เพราะคีย์ชาร์ดไม่สามารถเปลี่ยนแปลงได้ง่ายเมื่อโหลดข้อมูลแล้ว
การแบ่งส่วนข้อมูล (Sharding) กับการจำลองข้อมูล (Replication) ใน MongoDB
การแบ่งส่วนข้อมูล (Sharding) และการจำลองข้อมูล (Replication) เป็นคุณสมบัติที่เสริมกันแต่ก็แตกต่างกัน ตารางด้านล่างแสดงให้เห็นถึงความแตกต่างเพื่อให้คุณสามารถใช้งานแต่ละอย่างได้อย่างถูกต้อง และในทางปฏิบัติคลัสเตอร์ที่ใช้งานจริงจะใช้ทั้งสองอย่างร่วมกัน
| แง่มุม | sharding | การทำซ้ำ |
|---|---|---|
| จุดมุ่งหมาย | ปรับขนาดในแนวนอนโดยการแบ่งข้อมูล | ปกป้องข้อมูลและทำให้ข้อมูลพร้อมใช้งานอยู่เสมอ |
| ข้อมูลเกี่ยวกับแต่ละโหนด | ชุดย่อย (หนึ่งส่วนย่อย) ของข้อมูล | สำเนาข้อมูลฉบับเต็ม |
| ประโยชน์หลัก | พื้นที่จัดเก็บและปริมาณการรับส่งข้อมูลที่มากขึ้น | ความทนทานต่อข้อผิดพลาดและการปรับขนาดการอ่าน |
| ส่วนประกอบสำคัญ | ชาร์ด, เซิร์ฟเวอร์การกำหนดค่า, เราเตอร์ MongoDB | สมาชิกหลักและสมาชิกรอง |
กล่าวโดยสรุป การแบ่งส่วนข้อมูล (sharding) ตอบโจทย์ความต้องการด้านการขยายขนาด ในขณะที่การจำลองข้อมูล (replication) ตอบโจทย์ความต้องการด้านความพร้อมใช้งาน และการใช้งานที่มีประสิทธิภาพจะผสานทั้งสองอย่างเข้าด้วยกัน

