in How-to

มาเล่น MongoDB Sharding กัน

เล่น 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 ที่เราเพิ่มเข้ามา