Category: Open Source Software & Freeware

  • Spark #01: Standalone Installation

    Apache Spark : เป็นระบบ Data Processing ในระดับ Large-Scale ซึ่งทำงานได้เร็วกว่า Apache Hadoop MapReduce 100 เท่าบน Memory และ 10 เท่าบน Disk สามารถพัฒนาโปรแกรมเพื่อทำงานบน Spark ได้หลายภาษา ทั้ง Java, Scala, Python และ R อีกทั้งยังมี Library ทำงานกับ SQL, Machine Learning และ Graph Parallel Computation

    ในบทความนี้ จะกล่าวถึงเฉพาะวิธีการติดตั้ง Apache Spark เบื้องต้น บน Ubuntu 16.04 จำนวน 1 Machine ก่อน

    1. ไปที่ http://spark.apache.org/downloads.html
      เลือก Release, Package ที่ต้องการ แล้วเลือก Copy Link จาก Download Link มาได้เลย
    2. ที่ Ubuntu Server ใช้คำสั่งต่อไปนี้ ติดตั้ง Java และ Download Spark มาไว้บนเครื่อง
      sudo apt-get install default-jre openjdk-8-jdk-headless
      cat <<EOF >> .bashrc 
      export SPARK_HOME=/home/mama/spark
      export PATH=\$PATH:\$SPARK_HOME/bin
      EOF
      wget http://d3kbcqa49mib13.cloudfront.net/spark-2.1.0-bin-hadoop2.7.tgz
      tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz ; ln -s spark-2.1.0-bin-hadoop2.7 spark
      cd spark
    3. แล้วทำการ Start Spark Master Server ด้วยคำสั่ง
      sbin/start-master.sh
    4. จากนั้น สามารถเรียกดู Web UI ได้ที่ port 8080 (Default) และต่อไป เครื่อง Worker หรือ เครื่องที่จะมาเข้า Cluster จะติดต่อเครื่องนี้ผ่าน port 7077 (Default)
    5. สามารถใช้งาน Spark Shell ซึ่ง จะเป็นภาษา Scala แบบ Interactive ด้วยคำสั่ง
      bin/spark-shell
    6. สามารถดู Jobs ที่ทำงานได้ผ่านทาง Web UI ที่ port 4040 (Default)

    ประมาณนี้ก่อน ในบทความต่อไปจะเป็นการสร้าง Spark Cluster

    Reference:

    1. http://spark.apache.org/
  • JMeter #01: การสร้าง Load Test เบื้องต้น

    Apache JMeter เป็น Open Source Software ที่พัฒนาด้วย Java 100% ออกแบบมาใช้สำหรับการทดสอบโหลดของพฤติกรรมการใช้งาน และวัดประสิทธิภาพ เดิมใช้เพื่อทดสอบ Web Application แต่ปัจจุบันสามารถใช้งานทดสอบได้หลากหลายขึ้นด้วย

    อ่านเพิ่มเติม: http://jmeter.apache.org/index.html

    บทความที่เกี่ยวข้อง: https://sysadmin.psu.ac.th/?s=jmeter

    ในการใช้งานทั่วไปเบื้องต้น สามารถอ่านได้จาก การติดตั้งโปรแกรมตรวจสอบประสิทธิภาพ Server : Apache JMeter บนเครื่อง Windows

     

    การวัดประสิทธิภาพ (Performance Test) [1] แบ่งออกเป็น

    1. Performance Testing
    2. Load Testing
    3. Stress Testing

    ในที่นี้จะใช้ JMeter ในการทำ Load Testing โดยจะทดสอบ Web Application ตามเป้าหมายต่อไปนี้

    • ทดสอบกับ Web Page ที่ตั้งไว้ ซึ่งประกอบด้วยภาพจำนวนมาก
    • จำนวน Connection ต่อวินาที ในระดับต่างๆ
    • ในแต่ระดับ จะมีหยุดรอ 10 วินาที ก่อนจะยกระดับที่สูงขึ้น

    ขั้นตอนการใช้งาน JMeter สร้าง Load Testing

    1. เนื่องจากการทดสอบจะยิงไปที่ Web Page เดียวกันตลอด จึงสร้าง HTTP Request Default เพื่อให้ง่ายต่อการเปลี่ยนแปลง
      โดยคลิกขวาที่ Test Pane เลือก Add > Config Element > HTTP Request Default
    2. ใน HTTP Request Default กรอก
      Server Name or IP
      Port Number
      Path ตามต้องการ
      เช่น ต้องการทดสอบ http://192.168.107.107:80/wordpress/?p=4
    3. คลิกขวาที่ Test Plan เลือก Add > Threads (Users) > Thread Group
    4. กรอก Name และ Number of Threads (users)
      ในตัวอย่างนี้ ตั้งค่า Number of Threads (users) เป็น 10 และ Ramp-Up Period (in seconds) เป็น 1 เพราะต้องการให้ทดสอบระบบว่า เมื่อ มีผู้ใช้ใช้งานพร้อมกัน 10 คนในวินาทีเดียวกันนั้น ระบบจะตอบสนองอย่างไร
    5. คลิกขวาที่ Thread Group นี้ (ตอนนี้จะเปลี่ยนชื่อจาก Thread Group เป็น 10 แล้ว) แล้วเลือก Add > Sampler > Http Request
    6. ในส่วนนี้ ไม่ต้องแก้ไขอะไร โดย JMeter จะไปเอาค่าที่ตั้งไว้ใน HTTP Request Default ข้างต้นมาใช้
    7. ต่อไป เป็นส่วนของการแสดงผล
      คลิกขวาที่ Test Plan เลือก Add > Listener > Summary Report
    8. ต่อไป ใส่ Timer เพื่อให้ระบบ หยุดพักการทดสอบ เมื่อทำแต่ละ Thread Group เสร็จ เป็นเวลา 10 วินาที ก่อนจะเริ่ม Thread Group ต่อไป
      คลิกขวาที่ Test Plan เลือก Add > Timer > Constant Timer 
      แล้วใส่ค่า 10000 milliseconds หรือ 10 วินาที
    9. Save บ้าง อะไรบ้าง
    10. ในที่นี้ ต้องการทดสอบที่ 10 Users แล้วไป 20 Users ไป จนกระทั่ง 100 Users
      ก็ให้ทำการ Duplicate ตัว Thread Group ที่ชื่อ 10 ขึ้นมา

      ล้วแก้ Name กับ Number of Threads (users) เป็น 20

      แล้วทำซ้ำไปเรื่อยๆ จนได้จำนวนที่ต้องการ (เช่น 10 ถึง 100 เป็นต้น)
    11. สุดท้าย ทำการกำหนดให้ JMeter ทำงานทีละ Thread ตามลำดับ
      โดยการ คลิกที่ Test Plan
      แล้ว เลือก Run Thread Groups consecutively (i.e.run groups one at a time)
    12. ต่อไปก็ทำการทดสอบ
      ให้คลิก Summary Report
      เลือก Include group name in label
      แล้วคลิกปุ่ม Run
    13. ก็จะได้รายงานผล

      สามารถ Save Table Data เป็น .csv

      เอาไป Plot Graph ให้สวยงามได้

    Reference:

    [1] https://msdn.microsoft.com/en-us/library/bb924356.aspx

  • Juju #07 – กระจายโหลดข้ามเครื่อง

    ที่ผ่านมา เป็นการติดตั้ง Juju ซึ่งเบื้องหลังคือ LXD Container แต่ทั้งหมดยังอยู่บนเครื่องเดียวกัน

    ภาพต่อไปนี้ เป็นการทดสอบความเร็วในการตอบสนองของ WordPress ซึ่งเป็น Post ที่มีภาพจำนวนมาก และมีขนาดในการ Download ทั้งหมด 5 MB ใช้เวลาประมาณ 1.24 วินาที

    เมื่อใช้ jMeter ระดมยิงด้วยความเร็ว 100 Connections ต่อ 1 วินาที ต่อเนื่อง 10 วินาที ได้ผลว่า เวลาเฉลี่ยคือ 2.478 วินาที

    ต่อมาลองเพิ่มจำนวน Container จาก 1 เครื่องไปเป็น 3 เครื่อง แต่ทำงานอยู่บน Physical Server เดียวกัน

    แล้วทดลองยิงแบบเดิม ได้ผลออกมาคือ ใช้เวลาเฉลี่ย 1.663 วินาที

    จากนั้น ทดสอบแยก Container ออกไป เป็น 3 Physical Servers

    ได้ผลออกมาว่า ใช้เวลาลดลงเหลือเพียง 1.056 วินาทีเท่านั้น

    สรุป การกระจายโหลดออกไปยังหลายๆ Physical Servers ทำให้สามารถรับโหลดจำนวนมากได้

    ในบทความต่อไปจะมาลงรายละเอียดในการ Setup กัน

     

    Reference:
    https://www.digitalocean.com/company/blog/horizontally-scaling-php-applications/
    https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04
    http://php.net/manual/de/mysqlnd-ms.loadbalancing.php
    https://serversforhackers.com/video/php-fpm-configuration-the-listen-directive
    http://nginx.org/en/docs/http/request_processing.html
    http://stackoverflow.com/questions/5328844/nginx-load-balance-with-dedicated-php-fpm-server
    https://code.google.com/archive/p/sna/wikis/NginxWithPHPFPM.wiki
    http://nginx.org/en/docs/http/load_balancing.html
    – http://opensource.cc.psu.ac.th/KM-container

  • Juju #06 – เชื่อม MySQL Master-Master เข้ากับ HAProxy

    ต่อจาก Juju #05 – วิธีกระจายงานไปยัง MySQL แบบ Master-Master เมื่อสร้าง MySQL แบบ Master-Master Replication ได้แล้ว ก็มาเชื่อมกับ HAProxy เพื่อให้ Application ที่เขียน มองเห็นทั้งระบบเป็นชิ้นเดียว

    IP Address ของระบบต่างๆเป็นดังนี้
    haproxy : 10.107.107.71

    mysql-master1: 10.107.107.35

    mysql-master1: 10.107.107.83

    ขั้นตอนการติดตั้ง

    1. ที่ mysql-master1 ต้องสร้าง 2 Users ขึ้นมา ชื่อ haproxy_check และ haproxy_root ด้วยคำสั่งต่อไปนี้
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e "INSERT INTO mysql.user (Host,User) values ('10.107.107.71','haproxy_check'); FLUSH PRIVILEGES;"
      
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'10.107.107.71' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;"
    2. ที่ haproxy
      ติดตั้ง mysql-client ด้วยคำสั่ง

      sudo apt-get install mysql-client

      ทดสอบด้วยคำสั่ง

      mysql -h 10.107.107.35 -u haproxy_root -ppassword -e "SHOW DATABASES;"
      mysql -h 10.107.107.83 -u haproxy_root -ppassword -e "SHOW DATABASES;"

      แก้ไขไฟล์ /etc/haproxy/haproxy.cfg โดยเพิ่มบรรทัดต่อไปนี้ท้ายไฟล์ [3]

      frontend mysql-cluster
       bind *:3306
       mode tcp
       default_backend mysql-backend
      
      backend mysql-backend
       mode tcp
       balance roundrobin
       server mysql-master1 10.107.107.35:3306 check
       server mysql-master2 10.107.107.83:3306 check

      และสุดท้าย ทดสอบด้วยคำสั่งต่อไปนี้

      for i in `seq 1 6`; do 
         mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"; 
      done
      

      ควรจะได้ผลประมาณนี้

    3. จากนั้นก็สามารถพัฒนา Application โดยใช้ IP Address ของ haproxy ซึ่งในที่นี้คือ 10.107.107.71 และ Port 3306 ได้แล้ว ซึ่งเบื้องหลัระบบจะทำการ Replication กันเองทั้งหมด

    Reference:

    [1] https://www.digitalocean.com/community/tutorials/how-to-set-up-mysql-master-master-replication

    [2] https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing–3

    [3] https://serversforhackers.com/load-balancing-with-haproxy

     

  • Juju #04 – วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB

    ต่อจาก Juju #03 – วิธีสร้าง Load Balance MySQL เมื่อมี MySQL Server มากกว่า 1 ตัว ซึ่งทำการ Replication กัน (ในตอนนี้ 2 ตัว คือ Master กับ Slave) ซึ่งให้ความสามารถในเรื่อง [1]

    • Data-Security : เมื่อข้อมูลถูก Replicate ไปที่ Slave แล้ว เราสามารถหยุดการทำงานของ Slave เพื่อทำการสำรองข้อมูลได้ โดยไม่กระทบประสิทธิภาพการทำงานของ Master
    • Analytics: ทำการวิเคราะห์ข้อมูลต่างๆได้ที่ Slave โดยไม่กระทบประสิทธิภาพการทำงานของ Master
    • Scale-Out Solutions: เมื่อมี Slaves หลายตัว ทำให้สามารถกระจายงานในด้าน Read เพื่อเพิ่มประสิทธิภาพ โดยการแก้ไขข้อมูล จะทำที่ Master เท่านั้น

    ในบทความนี้ จะกล่าวถึงวิธีการ Scale-Out Solutions ของ WordPress เท่านั้น โดยใช้ Plugin ชื่อ HyperDB

    HyperDB [2] เป็น Database Class ที่ใช้แทนที WordPress built-in database functions โดยจะทำให้ WordPress สามารถติดต่อกับ MySQL ได้หลายเครื่อง โดยที่สามารถกำหนดได้ว่าจะ Write ไปยัง Master และ Read จากทั้ง Master และ Slaves อีกทั้งยังสามารถ Failover ได้อีกด้วย

    วิธีการติดตั้ง HyperDB

    1. ที่ WordPress ใช้คำสั่ง
      wget https://downloads.wordpress.org/plugin/hyperdb.1.2.zip
      sudo apt-get install unzip
      sudo unzip hyperdb.1.2.zip
    2. ย้ายไฟล์ hyperdb/db-config.php ไปยังที่ Directory เดียวกันกับ wp-config.php (ในที่นี้คื่อ /var/www/)
      sudo cp hyperdb/db-config.php /var/www
    3. ย้ายไฟล์ hyperdb/db.php ไปยังที่ Directory wp-content (ในที่นี้คื่อ /var/www/wp-content)
      sudo cp hyperdb/db.php /var/www/wp-content/
    4. แก้ไขไฟล์ db-config.php (ในที่นี้คื่อ /var/www/db-config.php) [3] โดยค้นหาคำว่า DB_HOST ซึ่งควรจะปรากฏอยู่แค่ 2 แห่งในไฟล์ ให้ไปที่ชุดที่ 2 ซึ่งมีเนื้อหาประมาณนี้

      จากนั้นแก้ไข DB_HOST ให้เป็น DB_SLAVE_1
    5. ต่อไปก็ไปเพิ่ม define(‘DB_SLAVE_1′,’xxx.xxx.xxx.xxx’) ซึ่งไฟล์ wp-config.php หรือไม่ก็ wp-info.php (ในที่นี้อยู่ที่ /var/www/wp-info.php)
    6. เมื่อทดสอบใช้งาน พบว่า มี Query มาทั้งที่ master และ slave
      ในภาวะว่าง

      ในภาวะมีงานเข้ามา
    7. ทดสอบเพิ่มบทความใหม่ ชื่อ “This is my first article” พบว่า ระบบสามารถเขียนไปยัง Master แล้วสามารถส่งต่อไปให้ Slave ได้
    8. ต่อไป เพิ่ม mysql-slave2 เข้าไปใน Juju และสร้าง Relation เป็น master -> Slave เช่นกัน

      แล้วทำการเพิ่ม DB_SLAVE_2 เข้าไปใน db-config.php และ wp-info.php

    9. ก็จะพบว่าข้อมูลได้ Replicate ไปหา Slave2 แล้ว
    10. และ เมื่อทำการ query ข้อมูลก็พบว่า มีการกระจายคำสั่ง Read ไปทั้ง 3 เครื่อง

    References

    [1] https://dev.mysql.com/doc/refman/5.7/en/replication.html

    [2] https://th.wordpress.org/plugins/hyperdb/

    [3] https://www.digitalocean.com/community/tutorials/how-to-optimize-wordpress-performance-with-mysql-replication-on-ubuntu-14-04

  • Juju #03 – วิธีสร้าง Load Balance MySQL

    จาก Juju #02 – วิธีติดตั้ง WordPress ทำให้ได้ WordPress ซึ่งเป็น Web Application 2 เครื่องทำหน้าที่ Load Balance กัน ด้วย haproxy แล้ว

    จากนั้น ทำการเพิ่ม MySQL เข้าไปใหม่ แล้วตั้ง Application Name เป็น mysql-slave แล้ว Commit Chages

    จากนั้น สร้าง Relation เป็น mysql:master –> mysql-slave:slave

    เมื่อเสร็จแล้ว จะได้ผลอย่างนี้

    ทดสอบเพิ่ม Post ใหม่

    แล้วเข้าไปใน mysql-slave (juju-xxx-xx เป็นชื่อเครื่องที่ Juju สร้างขึ้น)

    lxc exec juju-xxxx-xx  bash

    แล้วใช้คำสั่งต่อไปนี้

    mysql -u root -p$(cat /var/lib/mysql/mysql.passwd) -e ‘use wordpress; select post_title from wp_posts;’

    ก็จะพบว่า mysql-slave ได้รับการ Update ตามไปด้วย

    บทความต่อไป จะกล่าวถึงวิธีการทำให้ WordPress สามารถใช้ mysql-slave ในการ Read ได้ เพื่อกระจายโหลดครับ

     

  • วิธีการอัพเกรด php 5.5.9 เป็น php 5.6 (หรือ 7.0) บน Ubuntu 14.04 และวิธีการสลับการทำงานระหว่างเวอร์ชั่น

    บันทึกนี้สืบเนื่องจากต้องการอัพเกรดเวอร์ชั่น php เพื่อให้เครื่องเซิร์ฟเวอร์สามารถรองรับสคริปท์ WebApp php เวอร์ชั่นใหม่ที่สูงขึ้น

    คำเตือน! ควรทดลองทำในเครื่อง dev ดูก่อนอย่าทำบนเครื่องเซิร์ฟเวอร์จริงทันทีเดี๋ยวจะน้ำตาตก
    ควรทดสอบสคริปท์บนเครื่องทดสอบดูว่าสามารถทำงานได้ไม่มีปัญหาจะได้ไม่ต้องเสียเวลาแก้ไข
    เพราะตัวผมมั่วจนได้เรื่องบนเครื่องเซิร์ฟเวอร์จริงจนเกือบแก้ไม่ได้ T_T … มาเริ่มกันเลย (more…)

  • บาง plugin ก็ไม่อัปเดตขึ้นตาม WordPress

    plugin ชื่อ member access (member-access.1.1.6.zip) ทำให้ในขณะนี้ไม่สามารถเพิ่มบทความที่ให้เฉพาะสมาชิกอ่านได้เท่านั้น แต่ต้องเปิดเป็น public ได้อย่างเดียว มิฉะนั้นในหน้าแรก (Home) จะไม่เป็นหน้าว่าง ๆ ต้อง login จึงเห็นบทความทุกเรื่องได้