มาเล่น Zabbix กัน

Zabbix เป็น Monitoring System อีกตัวหนึ่งที่น่าสนใจ ซึ่งมีคุณสมบัติหลากหลาย ไม่ว่าจะเป็น Performance Monitoring, Availability Report, Trigger, Event และ Graphs เป็นต้น Zabbix มี Template เสริมหลายตัว สามารถติดตั้งเพิ่มเติมได้ง่าย แถมยังสามารถตั้ง Trigger เพื่อส่งการแจ้งเตือนผ่านทาง E-Mail, IM และ SMS ได้อีกด้วย ความสามารถเยอะขนาดนี้ มาลองเล่นกันดูครับ
ติดตั้งบน Ubuntu 12.04 ทำได้ง่ายมากเพราะ Zabbix มี Repository ให้บริการไว้แล้ว แค่ติดตั้ง repo package ดังนี้
wget http://repo.zabbix.com/zabbix/2.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.2-1+precise_all.deb
dpkg -i zabbix-release_2.2-1+precise_all.deb
apt-get update
ติดตั้ง Zabbix Server
apt-get install zabbix-server-mysql zabbix-frontend-php
แก้ date.timezone ใน /etc/apache2/conf.d/zabbix จากนั้น restart apache ดังนี้
service apache2 restart
ติด Zabbix Agent ในเครื่องที่ต้องการ Monitor
apt-get install zabbix-agent
ตั้งค่า Zabbix Server ให้ Agent โดยใช้คำสั่ง
dpkg-reconfigure zabbix-agent
ใส่ hostname หรือ ip address ของเครื่อง Zabbix Server ให้ถูกต้อง
เปิด browser ไปที่ http://YOUR-ZABBIX-SERVER/zabbix ตั้งค่าอีกนิดหน่อย






จากนั้นจะเข้าสู่หน้าจอ Login กรอก username = Admin และ password = zabbix

ก็จะเข้าหน้าหลักของ Zabbix แล้ว วิธีการใช้งานให้ติดตั้ง Zabbix Agent ไว้ที่เครื่องที่ต้องการ Monitor จากนั้น เพิ่ม Host ที่ Configuration > Hosts เลือก Create Host ใส่ข้อมูล Host ที่ต้องการ Monitor ลงไป

คลิกที่ Template เลือก Template ที่ต้องการ ตัวอย่างเช่น OS Linux ถ้าต้องการ Monitor Service เช่น HTTP, HTTPS, SMTP, SSH ก็สามารถเพิ่มเข้าไปได้

กด Save แล้ว เข้าไปดูที่ Monitoring > Lastest Data ว่ามีข้อมูลมาจาก Agent แล้วหรือยัง

เมื่อมีข้อมูลมาแล้วคุณสามารถดูข้อมูล System Status ผ่านหน้า Dashboard ได้ หรือจะดู Trigger หรือ Event ได้เช่นกัน





 

มาเล่น Cacti กัน

เนื่องจากจำไม่ได้ว่าเคยเขียน How to เรื่อง Cacti ไปหรือยังและพยายามค้นดูแล้วหาไม่เจอ ก็เลยเอามาเขียนใหม่อีกรอบครับ Cacti เป็น Performance Monitoring System ตัวหนึ่งที่ใช้งานง่าย เน้นการจับข้อมูลจาก SNMP เป็นหลัก ทำให้การตั้งค่าการใช้งาน Cacti ง่ายตามไปด้วย อีกอย่างมี Plugin เสริมน่าที่สนใจหลายตัว มาลงมือกันเลย
apt-get update
apt-get install snmpd cacti cacti-spine
ตัวติดตั้งเริ่มให้คุณตั้งค่ารหัสผ่านให้กับ MySQL และ Config Cacti 🙂 ง่ายป่าว จากนั้นเรามา config เจ้า SNMP เพิ่มอีกนิดหน่อย แก้ไขที่ไฟล์ /etc/snmp/snmpd.conf แก้ให้ snmpd listen connection on all interfaces
#agentAddress udp:127.0.0.1:161
agentAddress udp:161,udp6:[::1]:161
แก้ไข ACCESS CONTROL uncomment ตรง rocommunity แก้ ip address ให้เป็น ip address ของ Cacti
rocommunity secret Cacti-IP-Address
แก้ไขข้อมูล SYSTEM INFORMATION ให้สื่อความให้สักหน่อย
sysLocation Some Sererver
sysContact some@example.org
จากนั้น restart service ของ snmpd ดังนี้
service snmpd restart
จากนั้นมาตั้งค่า Cacti กัน เปิด browser ไปที่ http://your-cacti-server/cacti ล็อกอินด้วยผู้ใช้ admin รหัสผ่าน admin

จากนั้นโปรแกรมจะให้ตั้งรหัสผ่านใหม่

เมื่อตั้งรหัสผ่านเสร็จก็จะเข้าหน้า Cacti โล่งๆ แบบนี้

เปิดหน้า setting ที่ Configuration > Settings ตั้งค่า SNMP Version เป็น 2 และ SNMP Community เป็น secret

คลิกไปที่ Tab Poller เลือก Poller Type เป็น spine กำหนด Poller Inteval เป็น Every Minute กด Save

เพิ่ม Host ของเราเข้าไป ไปที่ Management > Devices กด Add ใส่ข้อมูล ระบุชื่อ hostname หรือ ip address เลือก Template เป็น Local Linux Machine กด Save

เพิ่ม Template เพิ่มเติม Unix – Ping Latency, SNMP – Get Mounted Partitions, SNMP – Get Processor Information, SNMP – Interface Statistics กด Save

กด Create Graphs for this Host เลือกกราฟทั้งหมด กด Create

นั่งรอไปสักพัก เลือก Tab Graphs ก็จะพบกราฟที่ดึงมาจาก SNMP สวยงาม 🙂

ถ้าต้องการทำ report โดยเลือกเฉพาะบางกราฟ ให้ไปที่ Console > Management > Graph Trees เลือกสร้างรายงานที่คุณต้องการได้ 😉

มาเล่น 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 เพิ่มเติมครับ

NiFTY MiniDrive

แอบไปถอย NiFTY MiniDrive มาเห็นว่าเคยระดมทุนใน KickStarter เมื่อปีที่แล้ว ตอนนี้ออกมาเป็นผลิตภัณฑ์จำหน่ายใน iStudio ในยุโรป แต่บังเอิญไปเจอที่ iStudio ที่ Park Venture ก็เลยถอยมาเลย เพราะของแบบนี้หายากมากในไทยครับ 🙂 หน้าตากล่องกับเวลาเสียบเข้าไปแล้วเป็นดังภาพ

ดูสวยงามเรียบเนียนมาก อ้อเวลาแกะออกมาต้องใช้ NiFTY Tool เข้ามาช่วยไม่งั้นแงะไม่ออกครับ ผมซื้อรุ่น 4GB มา รู้สึกว่าความจุมันน้อยไปหน่อยก็เลยเปลี่ยน MicroSD ใหม่เป็น 64GB เลย ตอนแรกเข้าใจว่า MicroSD 128GB มีขายแล้วในไทย ปรากฏว่ายังไม่มีใครนำเข้ามาขาย ก็เลยซื้อ MicroSD 64GB มาใช้ก่อน มีเจ้า MiniDrive ก็ดูเท่ห์ดี แต่กลับมีปัญหาเรื่องการ unmount drive เวลา sleep, hibernate และการ mount ขณะ wake ทำให้เกิด error ทุกครั้งเวลาเปิดเครื่องขึ้นมาใหม่ ซึ่งแน่นอนว่าไม่มีใคร Shutdown MacBook Air แน่นอน 🙂 ก็เลยเจอปัญหานี้ไปเต็มๆ วิธีการแก้ปัญหานี้ง่ายๆ คือ ถอด MiniDrive ออกและเสียบใหม่ แหมถ้ามันถอดง่ายขนาดนั้นคงดี แต่นี่มันถอดยากมากๆ ก็เลยพยายามหาวิธีแก้ไขเรื่อง sleep/awake เพื่อสั่ง unmount/mount อัตโนมัติ พยายามไปค้นหาข้อมูลเกี่ยวกับเรื่องนี้ก็พบว่าเจอปัญหานี้กันหลายคน แค่ก็มีวิธีแก้ปัญหาหลายแบบ เช่น ใช้โปรแกรม Jettison หรือ AutoEject ราคาก็ประมาณ 2-4 USD และก็มีวิธีอีกอย่างหนึ่ง โดยใช้วิธีการ monitor sleep mode ของ MacBook โดยใช้โปรแกรม SleepWatcher วิธีติดตั้งก็ง่ายมากดาวน์โหลดและแตกไฟล์ไว้ใน ~/Download จากนั้นใช้คำสั่งต่อไปนี้
sudo mkdir -p /usr/local/sbin /usr/local/share/man/man8
sudo cp ~/Downloads/sleepwatcher_2.2/sleepwatcher /usr/local/sbin
sudo cp ~/Downloads/sleepwatcher_2.2/sleepwatcher.8 /usr/local/share/man/man8
เพิ่มลงใน Launcher เพื่อให้เปิดทุกครั้งที่ boot เครื่อง
sudo mv ~/Downloads/sleepwatcher_2.2/config/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
sudo chown root ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
sudo chmod 644 ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
sudo launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
เท่านี้ก็ติดตั้งเสร็จแล้ว 🙂 จากนั้นมาดูว่า Disk อันไหนที่เราต้อง eject และ mount อีกรอบเมื่อเปิดเครื่องใช้ diskutil ดูครับ
/usr/sbin/diskutil list
ถ้าเป็น MBA จะมี SSD อยู่ก้อนเดียวคือ Disk0 ส่วน Disk1-X จะเป็น Thumbdrive หรือ Card Reader ซึ่งก็คือ MiniDrive ของเรานั่นเอง ดาวน์โหลด SleepWatcher Script แตกไฟล์ไปที่ Desktop แก้ไขทั้ง sleep.txt และ wakeup.txt ว่า disk ก้อนไหนที่เราต้องการ unmount/mount
ไฟล์ sleep.txt
#!/bin/sh
/usr/sbin/diskutil list | grep -e 'disk[1-9]s.*' | sed 's/.*\(disk[0-9].*\)/\1/' | xargs -I{} /usr/sbin/diskutil eject {}
ไฟล์ wakeup.txt ให้เพิ่ม sleep 5 ลงไปสักหน่อยเพื่อหน่วงเวลาในการ mount drive ขึ้นมาหลังจาก wakeup
#!/bin/sh
sleep 5
/usr/sbin/diskutil list | grep -e 'disk[1-9]s.*' | sed 's/.*\(disk[0-9].*\)/\1/' | xargs -I{} /usr/sbin/diskutil mount {}
sudo kextunload -b com.apple.driver.AppleUSBCardReader; sudo kextload -b com.apple.driver.AppleUSBCardReader
แก้ไข sudoer config ใช้คำสั่ง
sudo visudo
เพิ่ม permission ต่อท้ายดังนี้ ตรง [YOUR USERNAME] ใส่ username ของคุณลงไป
[YOUR USERNAME] ALL=(ALL) NOPASSWD: /sbin/kextunload, /sbin/kextload
จากนั้นสั่งย้าย script ดังนี้
mv ~/Desktop/sleep.txt ~/.sleep
chmod a+x ~/.sleep
mv ~/Desktop/wakeup.txt ~/.wakeup
chmod a+x ~/.wakeup
วิธีนี้ช่วยให้คุณใช้ Standby Mode ของ MacBook Air ได้ พร้อม Eject MiniDrive เมื่อพับหน้าจอเครื่องและ Mount MiniDrive อัตโนมัติเมื่อเปิดหน้าจอได้อีกด้วย 🙂

เรียนภาษาอังกฤษกับ Tell Me More

เนื่องจากที่สำนักงานมีการจัดให้เรียนภาษาอังกฤษแบบเรียนด้วยตัวเองกับเว็บ Tell Me More ซึ่งการเรียนภาษาอังกฤษเอามาคิดเป็นคะแนนประเมินผลปลายปีด้วย ตอนแรกก็คิดว่าน่าสนุกดีไม่ต้องเสียตังค์ไปเรียนเอง หลังจากฟังสรุปของคนที่มาจาก Tell Me More เออ ก็น่าสนุกแฮะ พอได้รหัสเข้าเรียนก็จัดแจงตั้งหน้าตั้งตาขยัน หาเน็ต 4G มาต่อกันเลยทีเดียว พอล็อกอินได้ปุ๊ป Tell Me More ก็พังทันที เย้… ไม่ต้องเรียนแม่มละ

ก็เลย mail ไปถามคนที่ Tell Me More หายไป 20 นาทีไม่มีใครตอบกลับมา ก็เลยใช้ Safari ก็แล้วกัน หลังจากล็อกอินเข้ามาก็พบกับหน้าจอตั้งค่า Flash Player Plugin อะไรเนี่ย ยังต้องใช้ Flash อีกเหรอเนี่ย

รู้สึกสยองยังไงชอบกล ลองทดสอบตั้งค่าดู กดต่อไป อ้่าว..เฮ้ยทำไมให้ตั้งค่า Flash Player อีกหว่า กดไป 3 รอบ อ๋อ…มันต้องกดปิดหน้าตั้งค่าด้วย ตายโง่เลยแฮะ ก็ตามระเบียบบังคับให้สอบก่อนเรียน ได้คะแนน 6.5/10 ทำให้รู้ว่าความรู้ภาษาอังกฤษอ่อนด้อยมาก จำได้ว่าสมัยเรียนสอบภาษาอังกฤษของมหาวิทยาลัย ไป 2 รอบ กว่าจะผ่าน แถมผ่านแบบคาบเส้นอีกต่างหาก เห่อๆ อ้ออีกอย่าง แบบทดสอบแม่มโคตรเขี้ยวเลย เวลาในการทำแบบทดสอบแต่ละข้อไม่เท่ากัน โดยเฉพาะข้อเกี่ยวกับการฟัง ฟังได้ 2 ครั้ง แล้วถ้ามัวแต่ฟัง 2 รอบก็จะตอบคำถามไม่ทัน ก็ได้ 0 คะแนนไป เย้… ตอบไม่ทันหลายข้อเลย เอาเป็นว่า อารมณ์เหมือนสอบภาษาอังกฤษมากๆ ไวยกรณ์ คำศัพท์โน่นนี่ ทำให้นึกถึงตอนสอบภาษาอังกฤษตอนสมัยเรียนเลยล่ะ ได้คะแนน 475 แต่ต้องผ่าน 500 คะแนน อะไรแบบนั้น อ้อและที่สำคัญ ระบบนี้หลงทางมากเพราะว่าไม่รู้ต้องไปยังไงต่อ T_T

เรียน OpenStack ภาษาอังกฤษยังสนุกกว่าเรียนภาษาอังกฤษกับ Tell Me More ซะอีกน่ะ
 

แนะนำหนังสือ OpenShift

หนังสือ Getting Satrted with OpenShift จากสำนักพิมพ์ O’Reilly ออกมาแล้ว หลังจากที่บ่มมานานอยู่เหมือนกัน นานจนลืมไปเลย หนังสือเล่มนี้เน้นการใช้งาน OpenShift เป็นหลัก การทำ Hot Deploy ใช้งาน Task Scheduler ทำ Continuous Integration การ Backup เป็นต้น เรียกได้ว่าแตกต่างจากหนังสือ OpenShift เล่มอื่นๆ ที่มีอยู่ในท้องตลาดพอสมควร สำหรับท่านที่เป็นมือใหม่ ผมแนะนำให้อ่านเล่มนี้ครับ 🙂

เกือบลืมหนังสือเล่มนี้สามารถดาวน์โหลดได้ ที่เว็บ OpenShift ครับ