Category: Database

  • 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 #05 – วิธีกระจายงานไปยัง MySQL แบบ Master-Master

    ต่อจาก Juju #04 – วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB ซึ่งเป็นวิธีการกระจายงานให้ MySQL แบบ Master-Slave จะต้องอาศัยความสามารถของ HyperDB Plugin ของ WordPress ในการทำงาน ซึ่งถ้าเป็นการพัฒนา Application ทั่วไปที่ไม่ใช่ WordPress ก็จะทำด้วยวิธีดังกล่าวไม่ได้

    ในบทความนี้จะกล่าวถึง การสร้าง Load-Balanced MySQL แบบ Master-Master ซึ่งทำให้สามารถกระจายการ Write ไปยัง MySQL หลายตัวได้ (ในเบื้องต้น 2 ตัว)
    *** ในบทความต่อไป จะต่อด้วยการเชื่อมเข้ากับ haproxy ***

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

    1. Deploy haproxy (ตั้งชื่อ haproxy-mysql) และ MySQL (ตั้งชื่อ mysql-master1 และ mysql-master2)
    2. ต่อไปนี้เป็นวิธีการติดตั้ง MySQL Master-Master Replication [1]
    3. บนเครื่อง mysql-master1
      แก้ไขไฟล์ /etc/mysql/mysql.cnf
      ค้นหาคำว่า server-id
      จากนั้น Uncomment บรรทัดต่อไปนี้
      server-id
      log_bin
      binlog_do_db

      จากนั้น ในบรรทัด
      server_id = 1
      – binlog_do_db ใส่เป็น Database Name ที่จะทำการ Replication

      เมื่อเสร็จแล้ว ก็ Save แล้ว Restart Mysql
      sudo service mysql restart
      แล้วเข้าใช้งานด้วยคำสั่ง
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd)
      สร้าง User ที่จะทำหน้า Replicate ข้อมูล ด้วยคำสั่ง
      mysql> create user ‘replicator’@’%’ identified by ‘password’;
      และกำหนดสิทธิให้สามารถ Replicate ได้ ด้วยคำสั่ง
      mysql> grant replication slave on *.* to ‘replicator’@’%’;
      สุดท้ายใช้คำสั่งต่อไปนี้ เพื่อเรียกข้อมูลที่สำหรับการตั้งค่า mysql-master2
      mysql> show master status;
      ได้ผลดังนี้

      จากนั้นใช้คำสั่งต่อไปนี้ แล้วเก็บค่า FILE และ POSITION ไว้ เพื่อใช้ในขั้นตอนต่อไป
    4. บนเครื่อง mysql-master2
      แก้ไขไฟล์ /etc/mysql/mysql.cnf เหมือนกับที่ทำบน mysql-master1 แต่เปลี่ยนค่า server_id เป็น 2

      เมื่อเสร็จแล้ว ก็ Save แล้ว Restart Mysql
      sudo service mysql restart
      แล้วเข้าใช้งานด้วยคำสั่ง
      mysql -u root -p$(cat /var/lib/mysql/mysql.passwd)
      สร้าง User ที่จะทำหน้า Replicate ข้อมูล ด้วยคำสั่ง
      mysql> create user ‘replicator’@’%’ identified by ‘password’;
      และกำหนดสิทธิให้สามารถ Replicate ได้ ด้วยคำสั่ง
      mysql> grant replication slave on *.* to ‘replicator’@’%’;
      ** ขั้นตอนต่อไปนี้ ทำที่ mysql-master2 (mysql-master1 ใช้ IP 10.107.107.35)
      mysql>  slave stop;
      mysql>  CHANGE MASTER TO MASTER_HOST = ‘10.107.107.35’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000003’, MASTER_LOG_POS = 344;
      mysql> slave start;จากนั้นใช้คำสั่งต่อไปนี้ แล้วเก็บค่า FILE และ POSITION ไว้ เพื่อใช้ในขั้นตอนต่อไป
      mysql> show master status;
    5. กลับมาที่ mysql-master1 อีกครั้ง แล้วใช้คำสั่งต่อไปนี้ (mysql-master2 ใช้ IP 10.107.107.83)
      mysql> slave stop;
      mysql> CHANGE MASTER TO MASTER_HOST = ‘10.107.107.83’, MASTER_USER = ‘replicator’, MASTER_PASSWORD = ‘password’, MASTER_LOG_FILE = ‘mysql-bin.000003’, MASTER_LOG_POS = 344;
      mysql> slave start;
    6. ที่ mysql-master1 ทำการสร้าง Database ชื่อ wordpress
    7. ไปดูที่ mysql-master2 ก็จะพบว่า wordpress database ปรากฏขึ้นแล้วด้วย

    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

     

     

  • 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 ได้ เพื่อกระจายโหลดครับ

     

  • การใช้โปรแกรม Navicat สำหรับเชื่อมต่อ DataBase

    การ Connect Navicat

    Download : https://drive.google.com/file/d/0B45mg2kqF_HOSTA0UGh4SkVIZ00/view

    1.โยน File ชื่อว่า ntunnel_mysql เข้าไปใน Server ที่ /home/wwwroot
    2. run file ที่เว็บบราว์เซอร์ ด้วย : 192.168.xxx.xxx/ntunnel_mysql หรือ 192.168.xxx.xxx/ntunnel_mysql.php
    3.เข้าไปที่โปรแกรม Navicat
    – General
    – Connection Name = ชื่อ db
    – Host Name / IP Address = ปล่อยว่าง
    – Port = 3306
    – User Name = User ที่เรา Add ใน phpmyadmin
    – Passwd = Passwd ที่เรา Add ใน phpmyadmin

    1
    – HTTP
    – ติ๊กเลือก Use HTTP Tunnel
    – Tunnel URL : http://192.168.xxx.xxx/ntunnel_mysql หรือ http://192.168.xxx.xxx/ntunnel_mysql.php

    2

    4. Test Connect
    5. OK

     

    หมายเหตุ: -ขอบคุณ คุณอาฮาหมัด เจ๊ะดือราแม จาก สถาบันวัฒนธรรมศึกษากัลยาณิวัฒนา

  • How to: SQL Server Failover Cluster

    สิ่งที่ต้องมี

    • Software
    • Hardware
      • เครื่องคอมพิวเตอร์อย่างน้อย 2 เครื่องสเป็คเดียวกัน (ในเอกสารนี้ใช้ 2 เครื่อง)
      • ในเอกสารนี้ใช้ VMware ESXi
      • รายละเอียดเพิ่มเติม Hardware Requirements
      • เครื่องคอมพิวเตอร์ 1 เครื่องสำหรับเป็น iSCSI เซิร์ฟเวอร์
    • IP address
      • สำหรับเครื่อง Server 2 เลข
      • สำหรับ Microsoft failover cluster 1 เลข
      • สำหรับ Microsoft SQL Server failover cluster 1 เลข
      • ทุกไอพีต้องมีชื่อใน domain .psu.ac.th
    • Shared Storage
      • iSCSI (ในเอกสารนี้เลือกใช้ iSCSI)
        • IP address สำหรับ  iSCSI Server
      • หากมี shared storage อื่นๆ สามารถใช้ได้เลย
    • Domain Account
      • ติดต่อศูนย์คอมพิวเตอร์เพื่อขอสิทธิ์จอยโดเมน

    มีครบแล้วก็เริ่มกันเลย

    • Shared Storage (iSCSI) (Windows Server 2012R2 Data center)
      • เข้าระบบด้วยบัญชี administrator
      • คลิกปุ่ม start พิมพ์ windows update เพื่อเปิดโปรแกรม windows update ให้ update ทุกอย่างให้เรียบร้อย (restart หากต้อง restart หากรีสตาร์ทกลับมาแล้วเข้าระบบด้วยผู้ใช้ administrator)
      • เปิด Server Manager (ไอคอนแรกข้างปุ่ม start , โดยปกติจะถูกเรียกใช้งานโดยอัตโนมัติ)
      • ที่ Dashboard มองไปที่ QUICK START ข้อ 2 Add roles and features คลิก
      • คลิก Next เลือก Role-based of feature-based installation คลิก Next เลือก Select a server from the server pool เลือกเครื่องของเราในช่องด้านล่างคลิก Next มองหา File and Storage Services คลิกสามเหลี่ยมก็จะมี File and iSCSI Services ทำเครื่องหมายถูกหน้าข้อความ iSCSI Target Server จะมีหน้าต่าง สรุปการติดตั้งขึ้นมา คลิก Add Features คลิก Next ไปเรื่อยๆ จนเจอคำว่า Install คลิก Install รอจนกว่าจะติดตั้งเสร็จ (Installation succeeded on …) คลิก Close
      • กลับมาที่ Server Manager คลิกที่ File and Storage Services คลิก iSCSI มองไปด้านขวาจะปุ่ม TASKS
      • ให้คลิก TASKS เลือก New iSCSI Virtual Disk… จะมีหน้าต่าง New iSCSI Virtual Disk Wizard เลือก Type a custom path ให้ Browse… ไปยังที่เก็บไฟล์ที่ต้องการ คลิก Next จะเป็นหน้าที่ให้ตั้งชื่อไฟล์ ตั้งชื่อแล้วคลิก Next ระบุขนาดที่ต้องการที่นี้ให้ใส่ไป 5GB Fixed size คลิก Next เลือก New iSCSI target คลิก Next ตั้งชื่อสำหรับ shared disk ลูกนี้ คลิก Next ในหน้า Access Servers คลิกปุ่ม Add… เลือก Enter a value for the selectd type ให้เลือกเป็น DNS Name หรือ IP address ก็ได้แล้วใส่เครื่องทั้งสองเครื่องที่จะทำ Cluster ลงไป (ทำทีละเครื่อง) เมื่อใส่ครบแล้วคลิก Next 2 ครั้ง คลิก Create คลิก Close
      • ทำซ้ำข้อที่แล้วอีกครั้งโดยขนาดดิสก์เป็น 10GB เปลี่ยนตรงขั้นตอน iSCSI Target ให้เลือก Existing iSCSI target: คลิก Next แล้วคลิก Create คลิก Close
    • Join Domain (Windows Server 2012R2 Data center)
      • ล็อคอินเข้าระบบด้วยผู้ใช้ administrator
        • คลิกปุ่ม start พิมพ์ windows update เพื่อเปิดโปรแกรม windows update ให้ update ทุกอย่างให้เรียบร้อยทั้ง 2 เครื่อง
        • คลิกขวาที่ปุ่ม start เมนูเลือก system
        • ที่หัวข้อ Computer name, domain, and workgroup settings คลิก Change settings
        • ที่หน้าต่าง System Properties แท็บ Computer Name คลิก Change…
        • Member of  เลือก Domain พิมพ์ psu.ac.th คลิก OK จะมีการให้ยืนยันตัวตนว่ามีสิทธิ์ join domain หรือไม่ รอสักครู่ แล้วจะมีข้อความว่าต้อง restart เครื่อง ให้ restart ได้เลย
        • เมื่อรีสตาร์ทเสร็จแล้ว เข้าระบบด้วยผู้ใช้ administrator
        • เปิด Computer Management โดยคลิกขวาที่ปุ่ม start เลือก Computer Management คลิกที่สามเหลี่ยมหน้าข้อความ Local Users and Groups มองไปช่องทางขวาจะมี Administrators ให้ดับเบิ้ลคลิกเปิดขึ้นมา เลือก PSU\Domain Admins คลิก Remove คลิก Add… ใส่ Username ของเราลงไปคลิก OK ออกมาจนสุด
        • Sign Out ออกจากระบบ
        • Log In ใหม่ด้วย Username ของเราเอง psu\firstname.s
        • ทำเหมือนกันสองเครื่อง
        • จบการ Join Domain
    • ติดตั้ง Microsoft Failover Cluster
      • เข้าระบบด้วยผู้ใช้ Domain ที่เพิ่งเพิ่มเข้าไปในกลุ่ม Administrators
      • ที่ Server Manager ที่เมนู Tools คลิกเลือก iSCSI Initiator คลิก Yes จะได้หน้าต่าง iSCSI Initiator Properties ที่แท็บ Targets ในช่อง Target: ใส่ IP Address ของเครื่อง iSCSI Server คลิก Quick Connect… คลิกเลือก disk คลิก Done ทำเหมือนกันทั้งสองเครื่อง และเพิ่มดิสก์ทั้งสองก้อนเข้าไป
      • ที่ Server Manager คลิก Manage เลือก Add Roles and Features
      • จะได้หน้าต่าง Add Roles and Features Wizard คลิก Next เลือก Role-based or feature-based installation คลิก Next เลือก Server ใน Server Pool (ซึ่งมีอยู่เครื่องเดียว) คลิก Next ในหน้า Server Roles คลิก Next หน้า Features เลือก Failover Clustering คลิก Next จะมีหน้าต่างสรุปการติดตั้งขึ้นมาให้กด Add features แล้วคลิก Next ไปจนเจอคำว่า Install คลิก Install รอไปจนเสร็จ คลิก Close
      • ที่ Sever Manager คลิก All Servers คลิกขวาที่เครื่องในช่อง Server เลือก Failover Cluster Manager
      • ที่ Failover Cluster Manager
      • คลิก Validate Configuration
        • Before You Begin คลิก Next
        • เพิ่มชื่อเครื่องที่เตรียมไว้ทั้งสองเครื่องลงไป โดยพิมพ์ชื่อแล้วคลิก Add ทีละเครื่อง
        • เลือก Run all tests (recommended) ปล่อยให้ทำไปจนเสร็จ
        • ตรวจสอบ Log การ valid อาจมีเตือนเรื่อง network เป็น single points of failure เนื่องจากใช้ internet card เพียงใบเดียว
        • ทำเครื่องหมายถูกหน้าข้อความ Create Cluster Wizard เลือกเครื่องที่จะทำ Cluster กำหนดเลขไอพีสำหรับ Microsoft failover cluster (IP ข้อ 2) กำหนดชื่อ Cluster next ไปจนเสร็จ*
    • ติดตั้ง Microsoft SQL Server Cluster 2016
      • mount แผ่นติดตั้ง Microsoft SQL Server 2016 Server Cal เลือก New SQL Server failover cluster installation ในหน้า Installation
      • แทบจะ Next technology ได้เลยสิ่งที่ต้องกำหนดเพิ่มคือ ชื่อของ Microsoft SQL Server failover cluster และ IP address สำหรับ Microsoft SQL Server failover cluster เลือกดิสก์ที่ใช้งานสำหรับ SQL Server ให้เลือก shared disk ลูกที่ 2
      • รอจนเสร็จแล้วให้มาติดตั้งที่เครื่องที่ 2 โดยเลือก add new node และทำเหมือนเดิม
      • เสร็จ
    • จบขอให้สนุก…

    อ้างอิง

    https://msdn.microsoft.com/en-us/library/hh231721(v=sql.130).aspx

    https://blogs.msdn.microsoft.com/clustering/2012/04/06/installing-the-failover-cluster-feature-and-tools-in-windows-server-2012/

  • ขั้นตอนการติดตั้ง HBase บน Hadoop อย่างง่าย

    HBase เป็น Database บน Hadoop [1]

    จากบทความ ขั้นตอนการติดตั้ง Hadoop Cluster อย่างง่าย จะได้ HDFS อยู่ที่ hdfs://192.168.1.101:9000 แล้ว ก็จะสามารถใช้ HBase บน Hadoop HDFS ได้

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

    1. โคลนเครื่องต้นฉบับ แล้วตั้ง ip address ให้เรียบร้อย เช่น 192.168.1.121
    2. ติดตั้ง HBase (mama shell)
      (mama shell)
      cd ~
      wget http://www-us.apache.org/dist/hbase/stable/hbase-1.2.3-bin.tar.gz
      tar -zxvf hbase-1.2.3-bin.tar.gz
      sudo mv hbase-1.2.3 /usr/local/hbase
      sudo chown -R hduser.hadoop /usr/local/hbase
      sudo mkdir /usr/local/zookeeper
      sudo chown -R hduser.hadoop /usr/local/zookeeper
    3. แก้ไขไฟล์ /usr/local/hbase/conf/hbase-site.xml (hduser shell)
      <configuration>
      <property>
       <name>hbase.cluster.distributed</name>
       <value>true</value>
      </property>
      <property>
       <name>hbase.rootdir</name>
       <value>hdfs://192.168.1.101:9000/hbase</value>
      </property>
       <property>
       <name>hbase.zookeeper.property.dataDir</name>
       <value>/usr/local/zookeeper</value>
       </property>
      </configuration>
    4. ขั้นตอนการ Start HBase (hduser shell)
       /usr/local/hbase/bin/start-hbase.sh
    5. ดูผลการทำงาน จาก Hadoop HDFS ว่าสร้าง /hbase แล้ว
       http://192.168.1.101:50070/explorer.html#/hbase
    6. ใช้งานผ่าน Shell ได้จากคำสั่ง (hduser shell)
       /usr/local/hbase/bin/hbase shell
    7. ขั้นตอนการ Stop HBase (hduser shell)
       /usr/local/hbase/bin/stop-hbase.sh

     

    References:

    [1] https://hbase.apache.org/

  • SSIS (Integration service) ตอนที่ 1 พื้นฐาน SSIS และ ETL

    SSIS (Integration service) เป็น Business Intelligent Tools ของ Microsoft ที่ออกมาเพื่อใช้งานในการจัดการข้อมูลในรูปแบบ ETL

    ซึ่ง ETL คืออะไร
    E – Extract การนำข้อมูลออกมาจาก Source database ซึ่งมาจากแหล่งเดียวหรือหลายแหล่ง
    T – Transform การแก้ไขและเปลี่ยนแปลงข้อมูลให้เหมาะสมที่จะในไปใช้งานต่อไป
    L – Load การเอาข้อมูลไปเก็บที่ปลายทาง (destination) แหล่งเดียวหรือแยกเป็นหลายๆแหล่ง

    โดย Business Intelligent Tools ของ Microsoft นั้นประกอบด้วย 3 ตัวได้แก่

    SSIS2

    Integration service :: เป็น ETL Tool
    Analysis service :: เป็น Tool ที่ใช้วิเคราะห์ข้อมูล ใช้ทำ Data warehouse
    Reporting service :: เป็น Tool ที่ใช้ในการสร้างรายงาน

     

    ก่อนที่จะมี Tools ที่ใช้ทำ ETL (ซึ่งมีหลายตัว หลายค่าย ทั้งฟรีและไม่ฟรี)
    เราต้องลำบากในการจัดการข้อมูลดังรูป

    unSSIS

    ที่มาของภาพ
    คือต้องจัดการข้อมูลจาก Source ต่างๆลงใน Database แยกเป็นแต่ละ Source กันไปแล้วค่อยมาทำการ Cleaning data ที่หลังแล้วค่อยไปรวมฐานข้อมูลอีกครั้งจึงจะเอาข้อมูลไปใช้งานได้ ซึ่งจะทำให้การทำงานค่อนข้างยุ่งยากและซับซ้อนและต้องทำซ้ำๆหลายๆครั้ง

     

    SSIS ทำงานอย่างไร

    SSIS1

    ที่มาของภาพ

    เตรียมข้อมูลให้พร้อมที่จะ load เข้าไปเก็บในฐานข้อมูล มี audit data เพื่อทำให้ตรวจสอบได้ว่าข้อมูลที่ได้มาได้มากจากไหน เมื่อไร process ไหนเป็นผู้จัดการข้อมูล สามารถทำ data cleaning ได้ก่อนที่จะนำข้อมูลเข้าสู่ฐานข้อมูล สามารถใช้ได้กับข้อมูลที่ใหญ่และซับซ้อนได้เป็นอย่างดี

    SSIS ประกอบด้วย

    • Package ไฟล์ของ SSIS นามสกุล *.dtsx
    • Control flow คือ Workflow engine สำหรับจัดการ tasks และ Containers ที่สั่ง Execute

     

    Control Flow

    • เป็น Workflow engine โดยมี Objects ใน Control Flow ดังนี้
      -Control flow tasks คือ การเนินการของ Workflow Object
      -Control flow Containers เป็น Grouping tasks กับ Tasks หรือ Containers อื่นๆ
      -Precedence constraints ให้ติดต่อ Tasks และ Containers และ กำหนดลำดับการ execute และ Precedence

    สำหรับจัดการ tasks และ Containers ที่สั่ง Execute

     

    Data flow

    • ควบคุมการการประมวลผลข้อมูลต่างๆ
    • Transform data จากแหล่งข้อมูล (Sources) ไปยัง ปลายทางข้อมูล (Destinations)

    Data flow task ยอดนิยมมีดังนี้

    1. Aggregate
    2. Conditional Split
    3. Data Conversion
    4. Derived Column
    5. Lookup
    6. Merge
    7. Merge Join
    8. Multicast
    9. Sort
    10. Union All

    ไว้จะลงรายละเอียดในแต่ละ task กันในตอนต่อๆไปนะครับ สำหรับตอนที่ 1 นี้ก็ขอจบไว้เท่านี้ก่อนครับ

     

     

  • Unit test สำหรับ method ที่ใช้ Entity Framework

    กลไกการทำงานของ .NET method โดยส่วนใหญ่  จะมีกลไกการทำงานที่ต้องขึ้นกับเงื่อนไข ปัจจัยต่างๆจากภายนอกอย่างเช่น method ที่มีเรียกใช้ database หรือ web service ทำให้การทดสอบจำเป็นต้องแยก component ที่ต้องการทดสอบออกมาจากปัจจัยแวดล้อมต่างรอบๆ component ซึ่งสามารถทำได้โดยใช้ shim ที่อยู่ภายใต้การควบคุมในกระบวนการทดสอบ สามารถที่จะควบคุมผลลัพธ์ที่ได้การทำงานตามที่กำหนดในทุกๆครั้งที่เรียกใช้งาน ซึ่งทำให้การเขียน unit testing ทำได้ง่ายขึ้นมาก

    การพัฒนา unit test สำหรับ method ที่ใช้ Entity Framework เพื่อเข้าถึงฐานข้อมูล ก็สามารถใช้ shim type ในการกำหนดชุดของข้อมูลเพื่อทำการทดสอบ ซึ่งการ query จะกระทำกับ property ของ DbContext ซึ่ง return IDbSet<T>

    public partial class Entities : DbContext
    {
       public Entities(): base("name=Entities")
       {
       }
    
        public IDbSet<CONFIG> CONFIG { get; set; }
       ...
    }
    

    ในการพัฒนา unit test จะต้องสร้าง shim type สำหรับ class “Entities” และแทนที่ property ที่ดึงข้อมูลจากฐานข้อมูลจริงแยกออกจากการทดสอบ ด้วยข้อมูลสำหรับทดสอบ จากตัวอย่างข้างบนคือ property “CONFIG” ซึ่งเป็นประเภท IDbSet<CONFIG> โดยจะทำการ returm DbSet<CONFIG> ที่เตรียมข้อมูลไว้สำหรับการทดสอบ

    using (ShimsContext.Create())
    {
         ShimEntities.AllInstances.CONFIGGet =
                  (e) =>  {
                             return ... DbSet<CONFIG>
                          };
    }

    แต่ใน DbSet ไม่มี public constructor ทำให้ไม่สามารถสร้าง instance ของ DbSet ได้ จึงจำเป็นต้องสร้าง class ใหม่ที่ implement interface IDbSet<T> แทนการใช้ DbSet

    public class TestDbSet<T> : IDbSet<T>, IQueryable, IEnumerable<T>
        where T : class
     {
         ObservableCollection<T> _data;
         IQueryable _query;
    
         public TestDbSet() //: base()
         {
            _data = new ObservableCollection<T>();
            _query = _data.AsQueryable();
         }
    
         public virtual T Find(params object[] keyValues)
         {
            throw new NotImplementedException("Derive from TestDbSet<T> and override Find");
         }
    
         public T Add(T item)
         {
             _data.Add(item);
             return item;
         }
    
         public T Remove(T item)
         {
             _data.Remove(item);
             return item;
         }
    
         public T Attach(T item)
         {
             _data.Add(item);
             return item;
         }
    
         public T Create()
         {
             return Activator.CreateInstance<T>();
         }
    
         public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T
         {
             return Activator.CreateInstance<TDerivedEntity>();
         }
    
         public ObservableCollection<T> Local
         {
             get { return new ObservableCollection<T>(_data); }
         }
    
         Type IQueryable.ElementType
         {
             get { return _query.ElementType; }
         }
    
         System.Linq.Expressions.Expression IQueryable.Expression
         {
             get { return _query.Expression; }
         }
    
         IQueryProvider IQueryable.Provider
         {
             get { return _query.Provider; }
         }
    
         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
         {
             return _data.GetEnumerator();
         }
    
         IEnumerator<T> IEnumerable<T>.GetEnumerator()
         {
             return _data.GetEnumerator();
         }
     }

    หลังจากนั้นสร้าง class อีกหนึ่ง class ที่ inherit มาจาก TestDbSet<T> ระบุ generic type เป็น model class ที่ต้องการในที่นี้คือ CONFIG  และเขียน code override Find() method ของTestDbSet<T> เพื่อทำหน้าที่ค้นหา object ตาม key ที่ส่งมา ( สาเหตุ ต้องสร้าง class ที่ inherit มาจาก TestDbSet<T> เนื่องจาก แต่ละ model class อาจจะมี key ที่ไม่ตรงกัน ดังนั้นใน  TestDbSet<T>.Find() method จึงไม่สามารถ implement code ที่ต้องการได้ )

     public class ConfigDbSet : TestDbSet<Models.CONFIG>
     {
        public override Models.CONFIG Find(params object[] keyValues)
        {
            return this.SingleOrDefault(s => s.ID == (decimal)keyValues.Single());
        }
     }

    จากนั้นกลับมาที่ unit test method ก็จะทำการ new ConfigDbSet() แล้วส่งข้อมูลที่สำหรับทดสอบกลับไปได้ โดยไม่ต้องใช้ข้อมูลจริงจากฐานข้อมูล