Month: February 2017

  • NETPIE : เริ่มต้นใช้งาน

    NETPIE เป็น Paas (Platform as a Service) ทำหน้าที่เป็นสื่อกลาง ที่ทำให้สิ่งต่างๆเชื่อมโยงกันได้ผ่านอินเตอร์เน็ต (IoT) พัฒนาภายใต้การสนับสนุนของ Nectec ใช้งานได้ 100 Credit ฟรี (ประมาณว่า สร้างได้ 100 ช่องทาง) สำหรับแต่ละ Account

    เอาเป็นว่า “ฟรี”

    อธิบายแบบเร็วๆ คร่าวๆ อย่างไม่เป็นทางการคือ ถ้าที่บ้านเรามีพวก Censor ซึ่งวัดค่าต่างๆ เช่น อุณหภูมิ แล้วมีความสามารถในการเกาะ WiFi ได้ โดยที่บ้านใช้อินเตอร์เน็ตแบบ ADSL ปัญหาคือ เราจะเข้าไปเอาข้อมูลเจ้า Censor นี้ได้อย่างไร ? ในเมื่อ ADSL ก็ไม่ได้ Fix IP หรือ จะใช้ Dynamic DNS (DDNS) ก็มีค่าใช้จ่าย เป็นต้น

    หรือ บางคนก็อาจจะคิดถึงวิธีไป Host เครื่องคอมพิวเตอร์ไว้บน Internet หรือจะไปสร้างบน Cloud แล้วอาจจะสร้าง Web Application เพื่อให้ Censor ไปเรียกแล้วบันทึกค่าลงในฐานข้อมูล อะไรทำนองนั้น

    ที่กล่าวมา ก็ต้องมีค่าใช้จ่าย หรือ ต้องลงแรงในการสร้างตัวกลางเหล่านั้น

    NETPIE ก็ทำหน้าที่ เป็น Broker หรือตัวกลาง โดย Censor ทำหน้าที่ติดต่อผ่าน Internet มาแปะค่าเอาไว้ใน NETPIE แล้วจึงค่อยนำไปใช้งานต่อได้ เพียงแค่ สมัครใช้งาน แล้วก็ไปสร้างช่องทางให้ Censor มา Update ข้อมูล

    ดังสโลแกนของ NETPIE ว่า NETPIE … where things chat.

    เริ่มกันเลย

    วิธีการสมัคร

    ไปที่ https://netpie.io/sign_up แล้วก็กรอกข้อมูล หลังจากนั้น NETPIE ก็จะส่ง SMS แจ้ง One Time Password มาให้ เมื่อ Login ครั้งแรก NETPIE จะให้ทำการตั้งรหัสผ่านใหม่

    ต่อไป สร้าง Application

    1. ไปที่เมนู Resources > Applications
    2. ต่อไปเป็นสร้าง Application (ในที่นี้คือ kx01web)
      คลิกปุ่ม +
      ตั้งชื่อ แล้วกดปุ่ม Create
    3. ใน Application ที่สร้าง คลิกเครื่องหมาย +
      ใส่ชื่ออุปกรณ์ (ในที่นี้คือ web01) เลือกชนิดเป็น Session Key
      แล้วคลิก Create
    4. ต่อไปเป็นการเอา REST API Auth ไปใช้งาน (ในที่นี้คือ 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX)
      โดยคลิกที่ Application KEY ที่สร้างขึ้น
      แล้วคลิกรูป ลูกตา หลังบรรทัด REST API Auth แล้ว Copy ค่าไปใช้งาน (ซึ่งจะเป็นคู่ของ Key:Secret)
    5. ในที่นี้ จะลองให้ เครื่องคอมพิวเตอร์ซึ่งเป็น Ubuntu เก็บข้อมูล memory แล้วส่งไปเก็บไว้บน NETPIE ผ่าน cURL
      รูปแบบประมาณนี้

      curl -X PUT "https://api.netpie.io/topic/kx01web/web01" -d "123456" -u 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX

      โดยในตัวอย่างนี้
      Application ID คือ kx0web
      Censor คือ web01
      ค่าที่จะส่งไปคือ 123456
      และ REST API Auth คือ 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX

    6. หากผลการทำงานออกมาเป็น
       {"code":200,"message":"Success"}

      ก็แสดงว่า สามารถส่งไปเขียนค่าได้

    วิธีการดูผลการทำงาน

    1. คลิกที่ Resources > Freeboards
    2. คลิกเครื่องหมาย +
      ตั้งชื่อที่ต้องการ (ในที่นี้คือ kx01Freeboard)
      แล้วคลิก Create
    3. ใน Freeboard ที่สร้างขึ้น คลิก Add ในส่วนของ Data Sources
      เลือกชนิดเป็น NETPIE Microgear
    4. จากนั้นกรอกข้อมูล
      Name ที่ต้องการ
      App ID ในที่นี้คือ kx01web
      Key และ Secret ที่ได้มาจากก่อนหน้านี้
      แล้วคลิก Save
    5. ต่อไป คลิก Add Pane

      คลิกเครื่องหมาย +

      เลือก Type เป็น Text
      ตั้ง Title เป็น Memory
      แล้วคลิก DATASOURCE

      เลือก Memory
      เลือก /kx01web/web01
      แล้วคลิก Save
    6. ก็จะเห็นผลลัพธ์ดังนี้
    7. หรือจะเรียกข้อมูลไปใช้งานผ่านทาง cURL ก็สามารถทำได้ดังนี้
       curl -X GET "https://api.netpie.io/topic/kx01web/web01" -u 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXX

      ก็จะได้ผลดังนี้

       [{"topic":"/kx01web/web01","payload":"123456","lastUpdated":1488297743,"retain":true}]

      เป็นต้น

    คร่าวๆ ก็ดังนี้

  • Cassandra #01 เริ่มต้นใช้งาน

    Cassandra เป็นระบบ Database ที่เหมาะสำหรับการ Scalability และให้ High Availability โดยไปลดประสิทธิภาพ มีความทนทานสูง (Fault Tolerance) โดยสามารถใช้งานเครื่องคอมพิวเตอร์ทั่วไปๆ (Commodity Hardware) หรือ ใช้งาน Cloud Infrastructure สำหรับงานที่มีความสำคัญได้ (Mission Critical) สามารถกระจายสำเนา (Replication) ข้าม Data Center ได้อีกด้วย [1][3]

    ในบทความนี้ จะแสดงการติดตั้งบน Ubuntu 16.04 เพียงเครื่องเดียวก่อน และให้เห็นวิธีการติดต่อตัวฐานข้อมูล การส่ง Query เบื้องต้น

    # echo "deb http://www.apache.org/dist/cassandra/debian 310x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
    # curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
    # sudo apt-get update
    # sudo apt-get install cassandra

    ต่อไป วิธีการส่งคำสั่งไปยัง Cassandra จะใช้งานผ่าน cqlsh (Cassandra Query Language Shell)

    # cqlsh -C
    Connected to Test Cluster at 127.0.0.1:9042.
    [cqlsh 5.0.1 | Cassandra 3.10 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    cqlsh>

    ใน Cassandra จะเรียก Database ว่า Keyspace วิธีที่จะดูว่ามี Keyspace อะไรอยู่บ้าง ใช้คำสั่ง [2]

    cqlsh> DESCRIBE keyspaces;
    system_schema system_auth system system_distributed system_traces

    สั่งสร้าง Keyspace ชื่อ test ด้วยคำสั่งต่อไปนี้

    cqlsh> CREATE KEYSPACE test WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor' : 3};

    เนื่องจาก Cassandra มีลักษณะพิเศษที่ไม่เหมือนกับ Database Servers อื่นๆ ก็คือเรื่องการ Replication ตั้งแต่เริ่มต้น ในคำสั่งข้างต้น จะบอกว่า ระบบจากสร้าง 3 สำเนา เป็นหลัก (จะกล่าวรายละเอียดในตอนต่อๆไป)

    ต่อไป สั่งสร้าง Table ชื่อ table1

    csqlsh> use test;
    cqlsh:test> create table table1 (
     ... id text primary key,
     ... age int,
     ... firstname text,
     ... lastname text
     ... );
    

    คำสั่งในการ Insert ข้อมูล

    cqlsh:test> INSERT INTO table1 (id, age, firstname, lastname) VALUES ( '000001', 10, 'John', 'Doe' );

    คำสั่งในการ Select ข้อมูล

    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    --------+-----+-----------+----------
     000001 | 10 | John | Doe
    
    (1 rows)

    คำสั่งในการ Update ข้อมูล

    cqlsh:test> UPDATE table1
     ... SET age = 20
     ... WHERE id = '000001'
     ... ;
    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    --------+-----+-----------+----------
     000001 | 20 | John | Doe
    
    (1 rows)

    คำสั่งในการ Delete ข้อมูล

    cqlsh:test> DELETE FROM table1
     ... WHERE id = '000001';
    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    ----+-----+-----------+----------
    
    (0 rows)

    จะเห็นได้ว่า รูปแบบการใช้คำสั่งแทบจะไม่แตกต่างกับภาษา SQL ใน RDBMS ทั่วไปเลย

    Reference:

    [1] http://cassandra.apache.org/

    [2] http://docs.datastax.com/en/cql/3.1/cql/cql_using/useStartingCqlshTOC.html

    [3] http://docs.datastax.com/en/cassandra/3.0/cassandra/cassandraAbout.html

     

  • [GAFE] ใช้ Google Forms เพื่อ Upload ไฟล์ได้แล้ว

    Google Forms เป็นเครื่องมือในการสร้างแบบสำรวจ แบบสอบถาม และแบบทดสอบที่ใช้งานได้ง่าย ใช้งานได้อย่างกว้างขวาง

    แต่ที่ผ่านมา ก็มีข้อจำกัดที่ยังด้อยกว่าการสร้าง Web Form นั่นคือ การใช้งาน Google Forms เพื่อ Upload ไฟล์ เช่น แบบฟอร์มการรับสมัคร แล้วต้องการให้ผู้ใช้ ส่งสำเนาบัตรประชาชนมาด้วย

    และแล้ว … ปลายปี 2559 Google Forms ก็เพิ่มความสามารถนี้เข้ามา แต่ “ให้ใช้เฉพาะ Google Apps” เท่านั้น หมายความว่า ผู้ที่ใช้ Free Gmail Account จะไม่สามารถใช้งานได้

    ขั้นตอนการใช้งาน

    1. สร้าง Google Forms ด้วย Google Apps Account
    2. สร้างคำถามตามปรกติ
      แล้วในส่วนของการ Upload ไฟล์ คลิก Option ของชนิดของคำถามแล้วเลือกเป็น File Upload
    3. จากนั้นยอมรับเงื่อนไข โดยคลิก Continue
    4. จากนั้น สามารถ กำหนดขนาดสูงสุดของไฟล์ได้
    5. กำหนดชนิดของไฟล์ก็ได้ คลิก แล้ว Apply
    6. กำหนดจำนวนของไฟล์ที่จะ Upload ก็ได้
    7. เมื่อมีผู้ส่งไฟล์เข้ามา
      ก็จะเก็บไว้ใน Google Drive ขึ้นต้นด้วยชื่อไฟล์ แล้ว มีชื่อ (ตาม Email address)  ของผู้ส่ง
    8. แต่ไม่ต้องห่วง หากมีการส่งชื่อไฟล์ซ้ำกัน จากคนๆเดียวกัน
      ไฟล์ใน Google Drive จะแยกจากกันด้วย Unique ID เราสามารถเห็นความแตกต่างได้จากเวลา
    9. และในส่วนของ Response ก็จะมองเห็นว่า ใครส่งไฟล์อะไรมา

    ครับ

  • 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