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

Comments are closed.