โดยทั่วไปเราอาจจะคุ้นเคยกับการดูแล และตรวจสอบระบบ (monitoring) ผ่านซอฟต์แวร์อย่าง Nagios (หรือซอฟต์แวร์อื่นๆ ที่อยู่ในกลุ่มเดียวกัน) ซึ่งนั่นก็แปลว่าคุณได้เข้าใจถึงความสำคัญของการตรวจสอบเป็นอย่างดี แต่ ณ ขณะนี้ทาง 10gen ได้ทำการ build บริการสำหรับ MongoDB ขึ้นมาที่ชื่อว่า Mongo Monitoring Service หรือเรียกสั้นๆ ว่า MMS โดยบริการตัวนี้ จะช่วยลดความยุ่งยากในการดูแล และตรวจสอบ MongoDB

MMS นั้นทำได้มากกว่าการบอกว่า MongoDB กำลังทำงานอยู่ ซึ่งตัว agent ที่อยู่บน MongoDB server จะทำการรายงานข้อมูลกลับมาอย่างเช่น ข้อมูล Memory, opcounters, จำนวน connection, network in/out, ขนาดของฐานข้อมูล ฯลฯ และที่สำคัญที่สุดข้อมูลที่แสดงกลับมาเหล่านี้ แสดงผลให้เราเห็นในรูปแบบของ chart ซึ่งเราสามารถ zoom และ expand ชุดข้อมูลที่เราต้องการจะดูได้โดยง่าย และที่จะไม่พูดถึงไม่ได้เลยคือขณะนี้ OpenShift ได้ประกาศการสนับสนุน MMS ซึ่งทำให้เราสามารถใช้งานบริการส่วนนี้ได้อย่างง่ายดาย

ขั้นตอนแรกให้เราเข้าไป sign up MMS ก่อน ที่ https://mms.10gen.com โดยคุณจะต้องระบุกลุ่ม สำหรับการจัดการสำหรับผู้ใช้หลายคนด้วย ถัดไปให้เราเข้าไปดาวน์โหลด Agent โดยลิงค์ดาวน์โหลดจะอยู่ในหน้า Host page โดยจะต้อง Log in ก่อน


Continue reading

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

เนื่องจากกลับมาเล่น MongoDB แบบติดตั้งเองอีกรอบ ก็เลยมาลองเล่น relication ดูบ้าง เพราะ MongoDB รองรับ replication ด้วย ซึ่งการตั้งค่านั้นง่ายมากๆ หลักการของ replication คือการทำสำเนาข้อมูลให้เท่ากันทุกเครื่อง กรณีที่มีเครื่องใดเครื่องหนึ่งไม่สามารถให้บริการได้ MongoDB จะยังสามารถให้บริการได้จาก relicaset ที่เหลือได้ด้วยความสามารถในเรื่อง Automatic Failover อีกด้วย

replicaset

automatic failover

จากภาพเราจะมีเซิร์ฟเวอร์อยู่ 3 เครื่องทำหน้าที่เป็น Primary และ Secondary ซึ่งเครื่อง Primary ทำหน้าที่รับ request ที่มาจาก client ในส่วน Secondary ทำหน้าที่ replicate การทำงานต่างๆ จาก Primary มาและอาจทำหน้าที่เป็น Primary แทนในกรณีที่ Primary ไม่สามารถทำงานได้

เพื่อความเข้าใจ มาลองติดตั้ง MongoDB repication ดู มีเครื่อง 3 เครื่อง

  1. rep0 (Primary)
  2. rep1 (Secondary)
  3. rep2 (Secondary)

    ทุกเครื่องมองเห็นกันได้ในเครือข่าย ลองทดสอบ ping ชื่อเครื่องดู และติดตั้ง MongoDB ไปยังทุกเครื่องดังนี้

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/rs0-0 /data/rs0-1 /data/rs0-2

เริ่ม start service ของ MongoDB ในแต่ละเครื่องด้วยคำสั่งดังนี้

เครื่อง rep0

mongod --dbpath /data/rs0-0 --replSet rs0 --smallfiles --oplogSize 128

เครื่อง rep1

mongod --dbpath /data/rs0-1 --replSet rs0 --smallfiles --oplogSize 128

เครื่อง rep2

mongod --dbpath /data/rs0-2 --replSet rs0 --smallfiles --oplogSize 128

จากนั้นในคำสั่ง mongo เรียกใช้งานเครื่อง rep0 ดังนี้

mongo --host rep0

จากนั้นสั่งให้ตั้งค่า relicaset ดังนี้

rs.initiate()

ใช้คำสั่ง rs.conf() เพื่อดูว่ามีข้อมูลการตั้งค่าเริ่มต้น repicaset แล้วหรือยัง

rs.conf()

ให้สังเกตว่า shell ของ MongoDB จะเปลี่ยนเป็น rs0:PRIMARY> และจะมีข้อมูลเริ่มต้นของ replicaset แล้ว ให้เพิ่ม host เข้าไปดังนี้

rs.add("rep1:27017")

rs.add("rep2:27017")

ลองใช้คำสั่ง rs.conf() ดูจะพบว่า rs0 ของเรามี host เพิ่มเข้ามารวมเป็น 3 host แล้ว

ใช้คำสั่ง rs.status() เพิ่อดูสถานะของ Repication Cluster

rs.status()

จะพบว่าเรามี 3 เครื่องที่ผูกกันใน repicaset ชื่อ rs0 และ 2 เครื่องที่เพิ่มเข้ามาถูกกำหนดให้เป็น Secondary อัตโนมัติ

ให้ลอง load data เข้าไป ให้สังเกต log จะพบว่าเครื่อง Primary จะส่งข้อมูลไปเขียนที่ Secondary ตลอด แต่เวลา query จะสลับกันระหว่างเครื่องเป็นลักษณะ round robbin ให้ลอง shutdown เครื่อง Primary ดู จะพบว่าเครื่อง Secondary ทั้ง 2 ตัวจะโหวดกัน แล้วได้ Primary ใหม่มา 1 ตัว จากนั้นให้ลอง query ข้อมูลจาก Primary ตัวใหม่ ก็จะพบว่าข้อมูลยังอยู่ครบ ;)

สำหรับท่านที่สนใจทำ MongoDB Replication ให้ลองศึกษาเพิ่มเติมที่ MongoDB Document ในส่วน Replication เพิ่มเติมครับ

Thai MongoDB เปิดบริการ MongoDB as a Service รายแรกของประเทศไทย ให้บริการ MongoDB บน SSD Serverv ให้ความเร็วในการการเข้าถึงข้อมูลได้รวดเร็ว พร้อมบริการสำรองข้อมูลรายวัน (Daily Backup) และสามารถเรียกคืนข้อมูลได้คลอดเวลา (Restore) บริการพิเศษสำหรับผู้ที่ต้องการแยกผู้ใช้บริการออกจากกันด้วย Dedicate MongoDB Instance ไม่ต้องแชร์กับผู้ใช้รายอื่น และบริการช่วยเหลือเมื่อเกิดปัญหาในการใช้งานระบบ

บริการดีๆ แบบนี้ห้ามพลาด ติดต่อสอบถามรายละเอียดได้ที่ Thai MongoDB

ทีม RedHat OpenShift ได้นำเสนอ Video พัฒนา Foursquare ของตัวเองด้วย MongoDB บน OpenShift ซึ่ง Video นี้นำเสนอความสามารถในเรื่องของการทำ index แบบ geospatial บน MongoDB และการออกแบบ collection กำหนดคุณสมบัติ ให้ทำงานได้เหมือนกับ Foursquare อยากรู้ว่าทำยังไง สามารถดูได้จาก Video ข้างล่างครับ

เนื่องจากเก็บกดจากห้องเรียน MongoDB ในโครงการ OSS Fast Track Programme ซึ่งได้เล่นบน Windows ทำให้ไม่ค่อยสนุกเท่าไรนัก เลยหาวิธีการติดตั้ง MongoDB บน Ubuntu Server กัน ก่อนอื่นดาวน์โหลด MongoDB มาก่อนดังนี้

wget -c http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.7.tgz

จากนั้นแตกไฟล์ไปยัง /opt ดังนี้

tar zxvf mongodb-linux-x86_64-2.0.7.tgz -C /opt

จากนั้นสร้างที่เก็บข้อมูลสำหรับ MongoDB ไว้ที่ /data/db โดยใช้คำสั่ง

sudo mkdir -p /data/db

จากนั้น Start Service ของ MongoDB ดังนี้

cd /opt/mongodb-linux-x86_64-2.0.7/bin
sudo ./mongod --rest

หากเป็นการ Start ครั้งแรก MongoDB จะสร้างไฟล์ journal จากนั้นก็จะ Start Service ตามปกติ การดูข้อมูลการทำงานของ MongoDB สามารถดูผ่านเว็บโดยใช้เว็บเบราเซอร์ เข้าไปที่ http://localhost:28017 สำหรับการใช้งาน MongoDB และเอกสารต่างๆ สามารถดาวน์โหลดได้ที่ http://www.mongodb.org/display/DOCS/Home ครับ

ช่วงนี้เกาะกระแส Open Source Fast Track Programme สักหน่อยจะได้เป็นแรงสนับสนุนในการเรียนรู้เทคโนโลยีใหม่ๆ ไปในตัว สำหรับครั้งนี้ผมคงไม่ได้เขียนอธิบายบ่อยมากนักจะเน้นที่ Video และ Link ต่างๆ มากขึ้น เพื่อให้ได้เรียนรู้เพิ่มได้ ครั้งนี้เป็นเรื่อง พัฒนา Mobile Application กับ MongoDB ก็เลยมี Video มาฝากครับ

สำหรับท่านที่ต้องการพัฒนาบน Cloud ก็มี Platform as a Service ที่ให้บริการ MongoDB หลากหลายค่ายด้วยกันดังนี้

  • Zend Developer Cloud
  • OpenShift
  • dotCloud