เล่น MongoDB ถ้าไม่ได้ลอง Sharding เดี๋ยวจะสนุกไม่ครบครับ แนวคิดเรื่อง Sharding คือการกระจายข้อมูลไปเก็บยัง MongoDB หลายๆ เครื่อง เพื่อเพิ่มขนาด storage ในการเก็บข้อมูล เพิ่มประสิทธิภาพในการทำงานและรองรับ Horizontal Scaling การแบ่งข้อมูลสามารถแบ่งได้หลายแบบไม่ว่าจะเป็น Rank Based และ Hash Based ตามที่คุณต้องการ การทำ Sharding ใน MongoDB ต้องมีส่วนประกอบ 3 ส่วนได้แก่
- Query Router - เป็นตัวเชื่อมต่อกับ Client หรือ Application
- Config Server - เก็บข้อมูล Meta Data ของ Shard Cluster
- Shard - เก็บข้อมูล
เราจะมาลองเล่น Sharding แบบง่ายๆ เพื่อทดลองกันครับ สิ่งที่เราต้องมี คือเครื่องเซิร์ฟเวอร์ 4 เครื่อง สำหรับ Router 1 เครื่อง, Config 1 เครื่อง และ Shard 2 เครื่อง สำหรับ Production ต้องใช้เครื่องอย่างน้อย 7 เครื่อง คือ Router 2 เครื่อง, Config 3 เครื่อง และ Shard 2 เครื่อง แต่เราไม่มีเครื่องเยอะมากขนาดนั้นครับ ลองแค่พอหอมปากหอมคอ ลองแค่ 4 เครื่องก็พอ :)
มาลงมือกันเลย ติดตั้ง MongoDB ลงในเครื่องทั้ง 4 เครื่อง
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.1.tgz
tar zxvf mongodb-linux-x86_64-2.6.1.tgz -C /opt/
export PATH=$PATH:/opt/mongodb-linux-x86_64-2.6.1/bin
สร้างที่เก็บข้อมูลดังนี้
mkdir -p /data/db
เริ่ม start service ของ MongoDB ในแต่ละเครื่องด้วยคำสั่งดังนี้
เครื่อง Shard (192.168.2.169, 192.168.2.171)
mongod --dbpath /data/db
เครื่อง Config (192.168.2.150)
mongod --configsvr --dbpath /data/db
เครื่อง Router (192.168.2.170)
mongos --configdb 192.168.2.150:27019
เมื่อ start service ทั้งหมดครบ Shard Cluster ยังไม่ทำงาน ต้องเพิ่ม Shard เข้าไปในระบบก่อน เชื่อมต่อไปยังเครื่อง Router
mongo --host 192.168.2.170
จากนั้นเพิ่ม Shard เครื่องแรกเข้าไปดังนี้
sh.addShard( "192.168.2.169:27017")
หลังจากเพิ่ม Shard แล้วให้ใช้คำสั่ง sh.status() เพื่อดูสถานะของ Shard Cluster
กำหนดให้ database test เป็น Shard Database
sh.enableSharding("test")
ให้ลองสร้างข้อมูลตัวอย่างโดยใช้คำสั่งดังนี้
use test
for (var i = 1; i <= 10; i++) db.testSample.insert({ x : i })
กำหนด Shard Key ดังนี้
db.testSample.ensureIndex({ _id: "hashed" })
กำหนด Shard Collection ให้ testSample โดยใช้ _id ซึ่งเป็นช่วงของค่า Hash เป็นตัวแบ่ง
sh.shardCollection("test.testSample",{ "_id": "hashed" });
ใช้คำสั่ง sh.status() จะพบว่า testSample บันทึกอยู่ใน shard0000 เพราะเรามีอยู่ Shard เดียว ให้คุณเพิ่ม Shard เข้าไปโดยใช้คำสั่งดังนี้
sh.addShard( "192.168.2.171:27017")
จากนั้นเพิ่มข้อมูลเข้าไปอีก แล้วใช้คำสั่ง sh.status() ดูอีกครั้ง เราจะพบว่า Sharding เริ่มทำงานแล้วให้ดูตรง จำนวน chunks ซึ่งจะแบ่งข้อมูลออกเป็น 2 ส่วน ตามจำนวน Shard Server ที่มี และเริ่มย้ายข้อมูลไปยัง Shard Server ที่เราเพิ่มเข้ามา