วันอาทิตย์ที่ 25 พฤษภาคม พ.ศ. 2557

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


วันอังคารที่ 20 พฤษภาคม พ.ศ. 2557

มาเล่น MongoDB replication กัน

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


วันจันทร์ที่ 5 พฤษภาคม พ.ศ. 2557

13 ฟอนต์แห่งชาติ รุ่น GPL2 มาแล้ว

หลังจากที่ SIPA ได้ร่วมมือกับกรมทรัพย์สินทางปัญญา ในการจัดประกวดและเผยแพร่ชุด "13 ฟอนต์แห่งชาติ" ไปแล้ว และได้มีการนำไปใช้อย่างแพร่หลายโดยเฉพาะในส่วนของฟอนต์ TH Sarabun New



จากความแพร่หลายในการใช้งานชุดฟอนต์แห่งชาติ ทาง SIPA และกรมทรัพย์สินทางปัญญาจึงเล็งเห็นความสำคัญในการแก้ไขข้อกำหนดของสัญญาอนุญาตการใช้งานฟอนต์ให้แพร่หลายยิ่งขึ้นจึงได้ร่วมกันแก้ไขสัญญาอนุญาตให้เป็น GPL2 เพื่อให้สามารถนำไปพัฒนาต่อยอดและเผยแพร่เพิ่มเติมในช่องทางอื่นได้ โดยในช่วงแรกจะมีเพียง 10 ฟอนต์ที่ได้ปรับปรุงสัญญาอนุญาตเป็นที่เรียบร้อยแล้ว ซึ่งทาง SIPA จะดำเนินการประสานงานเพื่อแก้ไขสัญญาอนุญาตของอีก 3 ฟอนต์ที่เหลือ ต่อไป



โดยท่านสามารถดาวน์โหลดได้ที่ลิงก์ด้านล่าง


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

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





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


วันจันทร์ที่ 28 เมษายน พ.ศ. 2557

แก้ปัญหา ADB ทำงานไม่ได้บน Ubuntu 13.10 64bit

ผมเจอปัญหาเรื่อง ADB (Android Debug Bridge) บน Ubuntu 13.10 64bit โดยปกติเราก็ต้องติดตั้ง ia32-libs แต่ใน Ubuntu 13.10 ไม่มี package นี้แล้ว นั่งหาอยู่นานว่า package นี้หายไปไหน สุดท้ายก็ได้คำตอบว่าเขาเปลี่ยนชื่อเป็น lib32z1 เอาเป็นว่าถ้าจะใช้งาน ADB บน Ubuntu 13.10 ขึ้นไปและเป็นรุ่น 64bit ให้ติดตั้ง package ดังต่อไปนี้



sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6



เท่านี้เราก็ใช้งาน ADB ได้แล้วครับ ;)


วันอังคารที่ 22 เมษายน พ.ศ. 2557

มาเล่น Chef กัน

Chef เป็นเครื่องมือด้าน System Configuration อีกตัวนึง เหมาะสำหรับการ config เครื่องเซิร์ฟเวอร์ที่มีจำนวนมากๆ แบบไม่ต้อง ssh เข้าไปทีละเครื่อง แนวคิดของ Chef ก็เหมือนกับชื่อล่ะครับ กุ๊กอยากจะทำอาหารอะไร ก็ต้องมีตำราอาหาร (Cookbook) วิธีการทำ (Recipe) และ ขั้นตอนการทำ (Run list) ก่อนที่มาเล่น Chef ลองมาดูส่วนประกอบต่างๆ ที่จะต้องมีกันก่อน






  1. Workstation คือ เครื่องที่ System Admin ใช้ทำงาน เขียนตำราอาหาร เขียนสูตรอาหาร

  2. Chef Server คือ เครื่องที่ใช้เก็บตำราอาหาร สูตรอาหารต่างๆ

  3. Node คือ เครื่องที่เราต้องการ config โดยดึงข้อมูลจาก Chef Server มาประมวลผล



จะใช้งาน Chef ต้องมี Chef Server ครับ สำหรับท่านที่ต้องการใช้ Chef Server ที่ทาง OpsCode เป็นคนดูแลก็สามารถใช้งานได้ (ผมแนะนำ) แต่ถ้าต้องการตั้ง Chef Server เองก็สามารถทำได้ครับ ก่อนอื่นมาติดตั้ง Chef Server กันก่อน ผมมีเครื่อง Ubuntu Server 64ิBits ต้องเป็น 64Bits เท่านั้นนะครับ



ดาวน์โหลด Chef Server และติดตั้งด้วยคำสั่ง



sudo dpkg -i chef-server_11.0.12-1.ubuntu.12.04_amd64.deb



sudo chef-server-ctl reconfigure



เมื่อติดตั้งเสร็จให้เปิด browser ไปที่ https://chef-server ใส่ username = admin และ password = p@ssw0rd1 จะได้หน้าตาแบบนี้





ได้ Chef Server แล้ว กลับมาที่เครื่อง Admin Workstation หรือเครื่องที่เราใช้งานกันนี่แหละครับ ดาวน์โหลด Chef Client มาติดตั้งที่เครื่องเรากันก่อนดังนี้



curl -L https://www.opscode.com/chef/install.sh | sudo bash



รอให้ติดตั้งจนเสร็จ จากนั้นมาเขียนไฟล์ config กัน ถ้าคุณใช้ Hosted Chef Server ดึงออกมาจาก Kick Start ได้เลยครับ แต่เรายากจนติดตั้ง Chef Server เองก็ต้องมาเขียน config กันเอาเอง ดังนี้



mkdir ~/.chef



เขียน config ชื่อ knife.rb ใส่ข้อมูลลงไปดังนี้



node_name 'admin'



chef_server_url 'https://chef-server.ffeee.org'



validation_client_name 'chef-validator'



validation_key '/etc/chef/chef-validator.pem'



cookbook_path ["~/.chef/cookbooks"]



สร้างไฟล์ /etc/chef/client.pem เอา Private Key ของ Admin มาใส่







และไฟล์ /etc/chef/chef-validator.pem เอาค่า chef-validator มาใส่







สร้างไดเรคทอรี cookbook ใน ~/.chef/cookbooks ดังนี้



mkdir -p ~/.chef/cookbooks



จากนั้น init git repository ที่ไดเรคทอรี cookbooks ดังนี้



cd ~/.chef/cookbooks



touch readme.md



git init



git add .



git commit -m 'init repo'



ลองใช้คำสั่ง knife ดูครับ



knife client list



ค่าที่ได้จะแสดง chef-validator และ chef-webui ออกมา และไม่ error ถือว่าเป็นอันใช้ได้ :)



เมื่อได้ Workstation, Chef Server แล้วก็ถึง Node ต่างๆ Chef มีเครื่องมือลัดให้เราติดตั้ง Chef Client โดยที่เราไม่ต้อง ssh ไปทีละ node ทำให้ไม่เหนื่อยมากนัก โดยใช้คำสั่งดังนี้



knife bootstrap node01.example.com --sudo -x username -P password -N "chef-node01"



จากนั้น knife จะติดตั้ง Chef Client ที่เครื่อง Node ให้ สั่งแบบนี้จนครบทุกเครื่องครับ :P ถ้าไม่อยากเหนื่อยก็เขียน shell script เอาก็ได้ :) เมื่อติดตั้งเสร็จแล้วเราจะพบว่ามีรายละเอียดของ Node ใน Chef Server แล้ว





เมื่อได้ Node ครบแล้ว กลับมาที่ Workstation เราครับ เราจะดึง Cookbook จาก Chef Community Cookbook มาใช้กัน ตัวอย่างเป็น Apache2 :) ใช้คำสั่งดังนี้



knife cookbook site install apache2



Knife จะดาวน์โหลด Cookbook ของ Apache2 และ dependency cookbook มาให้เราด้วย :) ถ้าอยากจะแก้ไข หรือ recipe ก็สามารถแก้ไขได้เลย จากนั้นอัพโหลด Cookbook ไปไว้ที่ Chef Server โดยใช้คำสั่ง



knife cookbook upload apache2 iptables logrotate pacman



ลองเข้าไปดูใน Chef Server เราจะเห็นว่ามี Cookbook อัพโหลดเข้ามาแล้ว





จากนั้นมากำหนด run list ให้ node01 ที่เราจะติดตั้ง Apache2 กันดังภาพ





เมื่อกำหนด run list แล้วสั่ง chef-client ที่เครื่อง node ได้เลย หรือจะสั่งผ่าน knife ได้เช่นกัน ตัวอย่างเช่น ให้ node ที่มีชื่อ * (คือทุก node) ใช้คำสั่ง chef-client ดังตัวอย่าง



knife ssh 'name:*' 'chef-client' --sudo -x username -P password



เมื่อสั่ง chef-client เครื่อง node จะเรียกดูข้อมูลจาก Chef Server ว่าเครื่องนี้้ต้องใช้ Cookbook อะไรบ้าง จากนั้นก็ทำตามลำดับที่กำหนดไว้ใน run list ลองเปิด browser เข้าไปดูที่เครื่อง node01 ก็จะพบว่า ได้ติดตั้ง Apache2 เรียบร้อยแล้ว ;)


วันอาทิตย์ที่ 20 เมษายน พ.ศ. 2557

5 สิ่งที่ต้องทำหลังจากติดตั้ง Ubuntu 14.04 LTS

Ubuntu 14.04 LTS ออกรุ่นแล้ว มีคุณสมบัติใหม่ๆ และแก้ bug ที่เป็นปัญหาหลายอย่างในรุ่นที่แล้ว (13.10) ซึ่งเป็นปัญหาขัดใจหลายเรื่อง โดยเฉพาะเรื่อง Keyboard สำหรับรุ่นนี้การตั้งค่า Keyboad ทำได้ดีมากขึ้นเลยทีเดียว เอ้า ก่อนจะมาลงในรายละเอียดการตั้งค่าต่างๆ มาดาวน์โหลด Ubuntu 14.04 กันก่อน สำหรับรุ่นที่ release แล้วดาวน์โหลดได้ที่ releases.ubuntu.com ครับ สำหรับท่านที่ต้องการอัพเกรดทำได้ 3 วิธี คือ




  1. สั่งอัพเกรดจาก Software Updater

  2. อัพเดทผ่านตัวติดตั้ง

  3. ลงใหม่ทับของเดิม (สำหรับผู้ที่แยก /home เอาไว้แล้ว)



5 สิ่งที่ต้องทำหลังจากติดตั้ง




  1. เลือก repository ใกล้คุณ

  2. อัพเดท software และ patch ล่าสุด

  3. ติดตั้งซอฟต์แวร์ที่จำเป็นต้องใช้ (สำหรับผู้ติดตั้งใหม่)

  4. ตั้งค่า Keyboard เพิ่มเติม และเปลี่ยนปุ่มสลับภาษา ตั้งเป็นปุ่มตัวหนอนได้แล้ว

  5. ติดตั้งฟอนต์ภาษาไทย