MongoDB Sharding: การสอนทีละขั้นตอนพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

MongoDB การแบ่งส่วนข้อมูล (Sharding) คือการแบ่งชุดข้อมูลขนาดใหญ่เป็นชุดข้อมูลย่อยขนาดเล็กที่กระจายอยู่ทั่วหลายแหล่ง MongoDB ตัวอย่างเช่น คลัสเตอร์แบบชาร์ดจะลดภาระการทำงานของ CPU บนเซิร์ฟเวอร์แต่ละเครื่อง คลัสเตอร์แบบชาร์ดจะรวมชาร์ด เซิร์ฟเวอร์การกำหนดค่า และเราเตอร์เข้าด้วยกันเพื่อขยายขนาดพื้นที่จัดเก็บข้อมูลและปริมาณงานการค้นหาในแนวนอน

  • 🧩 แนวคิดหลัก: การแบ่งส่วนข้อมูล (Sharding) จะแบ่งชุดข้อมูลเชิงตรรกะหนึ่งชุดออกเป็นหลายส่วนย่อย (shard) แต่การค้นหาข้อมูลยังคงถือว่าข้อมูลนั้นเป็นชุดข้อมูลเดียว
  • 🏗️ Cluster องค์ประกอบ คลัสเตอร์แบบชาร์ด (Sharded Cluster) ต้องการชาร์ดสำหรับข้อมูล เซิร์ฟเวอร์การกำหนดค่าสำหรับเมตาเดตา และเราเตอร์เพื่อกำหนดทิศทางคำสั่งของไคลเอ็นต์
  • ⚙️ ขั้นตอนการดำเนินการ: เริ่มเซิร์ฟเวอร์การกำหนดค่า เรียกใช้เราเตอร์ MongoDB เพิ่มชาร์ด จากนั้นเปิดใช้งานการแบ่งชาร์ดบนฐานข้อมูลและคอลเลกชัน
  • 🔑 รหัสลับ: คีย์ชาร์ดเป็นตัวกำหนดวิธีการกระจายเอกสาร ดังนั้นความหลากหลายของข้อมูลและรูปแบบการเข้าถึงที่สม่ำเสมอจึงมีความสำคัญอย่างยิ่ง
  • 📈 ผลประโยชน์หลัก: การแบ่งส่วนข้อมูล (Sharding) ช่วยให้สามารถขยายขนาดในแนวนอนได้ โดยกระจายพื้นที่จัดเก็บข้อมูลและปริมาณงานแทนที่จะอัปเกรดเซิร์ฟเวอร์เพียงเครื่องเดียว

MongoDB Sharding: การสอนทีละขั้นตอนพร้อมตัวอย่าง

Sharding คืออะไร MongoDB?

Sharding เป็นแนวคิดใน MongoDBซึ่งแบ่งชุดข้อมูลขนาดใหญ่ออกเป็นชุดข้อมูลขนาดเล็กออกเป็นหลายชุด MongoDB ตัวอย่าง.

บางครั้งข้อมูลภายใน MongoDB จะมีขนาดใหญ่มากจนการเรียกใช้ข้อมูลจำนวนมากอาจทำให้ CPU บนเซิร์ฟเวอร์ทำงานหนักมาก เพื่อแก้ไขปัญหานี้ MongoDB มีแนวคิดเรื่อง Sharding ซึ่งโดยพื้นฐานแล้วคือการแบ่งชุดข้อมูลออกเป็นหลาย ๆ ชุด MongoDB ตัวอย่าง.

ชุดข้อมูลนี้ ซึ่งอาจมีขนาดใหญ่มากนั้น แท้จริงแล้วถูกแบ่งออกเป็นหลายชุดข้อมูลย่อย หรือที่เรียกว่า "ชาร์ด" โดยหลักการแล้ว ชาร์ดทั้งหมดทำงานเสมือนเป็นชุดข้อมูลเดียว

ข้อดีของการแบ่งส่วนข้อมูล (Sharding) ใน MongoDB

ก่อนที่จะนำคลัสเตอร์แบบแบ่งส่วน (sharded cluster) มาใช้งาน ควรทำความเข้าใจก่อนว่าทำไมทีมต่างๆ จึงเลือกใช้การแบ่งส่วน ประโยชน์หลักๆ มีดังนี้:

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

ข้อดีเหล่านี้รวมกันทำให้การแบ่งส่วนข้อมูล (sharding) กลายเป็นวิธีการมาตรฐานสำหรับการขยายขนาดระบบ MongoDB เกินขีดจำกัดของเซิร์ฟเวอร์ตัวเดียว

วิธีการใช้ Sharding

ชาร์ดถูกนำไปใช้โดยใช้คลัสเตอร์ ซึ่งก็คือกลุ่มของข้อมูลนั่นเอง MongoDB ตัวอย่าง.

ส่วนประกอบของชาร์ดประกอบด้วย:

  1. เศษ – นี่คือสิ่งพื้นฐาน และนี่ไม่ใช่อะไรนอกจากก MongoDB อินสแตนซ์ที่เก็บชุดย่อยของข้อมูล ในสภาพแวดล้อมการใช้งานจริง ชิ้นส่วนทั้งหมดจะต้องเป็นส่วนหนึ่งของชุดการจำลอง
  2. กำหนดค่าเซิร์ฟเวอร์ - มันคือ MongoDB อินสแตนซ์ที่เก็บข้อมูลเมตาเกี่ยวกับคลัสเตอร์ โดยพื้นฐานแล้วคือข้อมูลเกี่ยวกับส่วนต่างๆ MongoDB อินสแตนซ์ที่จะเก็บข้อมูลชาร์ดไว้
  3. เราเตอร์ - มันคือ 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) ตอบโจทย์ความต้องการด้านความพร้อมใช้งาน และการใช้งานที่มีประสิทธิภาพจะผสานทั้งสองอย่างเข้าด้วยกัน

คำถามที่พบบ่อย

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

ใช่ การตรวจสอบโดยใช้ AI สามารถทำได้ tracใช้ข้อมูลการเติบโตของข้อมูล โหลด CPU และความหน่วงในการสืบค้นเพื่อคาดการณ์ว่าเมื่อใดที่เซิร์ฟเวอร์เดียวจะรับมือไม่ไหว เครื่องมือนี้จะแจ้งเตือนช่วงเวลาที่เหมาะสมในการแบ่งเซิร์ฟเวอร์ออกเป็นส่วนๆ (sharding) อย่างไรก็ตาม วิศวกรควรตรวจสอบแผนความจุให้แน่ใจก่อนดำเนินการ

การแบ่งข้อมูลแบบช่วง (Ranged sharding) จะแบ่งข้อมูลออกเป็นช่วงค่าที่ต่อเนื่องกัน ซึ่งเหมาะสำหรับการค้นหาตามช่วงค่า แต่มีความเสี่ยงที่จะได้ข้อมูลที่แบ่งเป็นส่วนๆ ไม่เท่ากัน ส่วนการแบ่งข้อมูลแบบแฮช (Hashed sharding) จะทำการแฮชคีย์เพื่อกระจายการเขียนข้อมูลอย่างสม่ำเสมอไปยังแต่ละส่วน ทำให้การกระจายการเขียนข้อมูลดีขึ้น แต่แลกมาด้วยประสิทธิภาพในการสแกนช่วงค่าที่ลดลง

ใช่แล้ว เปิดใช้งานการแบ่งส่วนข้อมูล (sharding) บนฐานข้อมูล ตรวจสอบให้แน่ใจว่ามีดัชนีอยู่บนคีย์การแบ่งส่วนที่เลือก จากนั้นเรียกใช้ sh.shardCollection() บนเนมสเปซ MongoDB เริ่มกระจายเอกสารที่มีอยู่เป็นส่วน ๆ ไปยังชาร์ดที่มีอยู่โดยอัตโนมัติ

สรุปโพสต์นี้ด้วย: