เนื่องจากกลับมาเล่น MongoDB แบบติดตั้งเองอีกรอบ ก็เลยมาลองเล่น relication ดูบ้าง เพราะ MongoDB รองรับ replication ด้วย ซึ่งการตั้งค่านั้นง่ายมากๆ หลักการของ replication คือการทำสำเนาข้อมูลให้เท่ากันทุกเครื่อง กรณีที่มีเครื่องใดเครื่องหนึ่งไม่สามารถให้บริการได้ MongoDB จะยังสามารถให้บริการได้จาก relicaset ที่เหลือได้ด้วยความสามารถในเรื่อง Automatic Failover อีกด้วย
จากภาพเราจะมีเซิร์ฟเวอร์อยู่ 3 เครื่องทำหน้าที่เป็น Primary และ Secondary ซึ่งเครื่อง Primary ทำหน้าที่รับ request ที่มาจาก client ในส่วน Secondary ทำหน้าที่ replicate การทำงานต่างๆ จาก Primary มาและอาจทำหน้าที่เป็น Primary แทนในกรณีที่ Primary ไม่สามารถทำงานได้
เพื่อความเข้าใจ มาลองติดตั้ง MongoDB repication ดู มีเครื่อง 3 เครื่อง
- rep0 (Primary)
- rep1 (Secondary)
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เพิ่มเติมครับ