มาเขียน REST API ง่ายๆ ด้วย Node-RED

ครั้งที่แล้วพาเล่น Node-RED โดยดึงข้อมูลจาก Twitter แล้วสั่ง ReTweet ผ่าน Node-RED กันไปบ้างแล้ว ครั้งนี้จะมาลองเขียน REST API ง่ายๆ ผ่าน Node-RED กันบ้าง หากคุณยังไม่มี Node-RED ก็สามารถติดตั้งได้ตามวิธีการในครั้งที่แล้ว หรือใช้ Boilerplates Node-RED Starter ใน Bluemix ก็ได้ครับ เข้าไปที่ Node-RED กันได้เลย วาง block http input และ output debug เชื่อม block ให้เรียบร้อย เราจะรับค่าจาก http request แล้วส่งไปแสดงผลใน debug ที่หน้า web console ตั้งค่า http input ดังนี้

จากนั้นเปิด rest client มาลองทดสอบกัน เริ่มจากทดสอบ POST request ก่อน เราจะพบว่า Node-RED สร้าง REST Server ให้เราพร้อมสั่งให้รับค่าแบบ json ผ่าน POST request เท่านั้น

Continue reading

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

มาเล่น MongoDB Replication กัน

เนื่องจากกลับมาเล่น MongoDB แบบติดตั้งเองอีกรอบ ก็เลยมาลองเล่น replication ดูบ้าง เพราะ MongoDB รองรับ replication ด้วย ซึ่งการตั้งค่านั้นง่ายมากๆ หลักการของ replication คือการทำสำเนาข้อมูลให้เท่ากันทุกเครื่อง กรณีที่มีเครื่องใดเครื่องหนึ่งไม่สามารถให้บริการได้ MongoDB จะยังสามารถให้บริการได้จาก 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 เพิ่มเติมครับ

พัฒนา Foursquare ของตัวเองด้วย MongoDB บน Cloud

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

ติดตั้ง MongoDB บน Ubuntu Server

เนื่องจากเก็บกดจากห้องเรียน 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?ครับ

พัฒนา Mobile Application กับ MongoDB

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

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

  • Zend Developer Cloud
  • OpenShift
  • dotCloud