Oracle MySQL Cluster :- The shared-nothing architecture (Manual Installation)

สิ่งที่ต้องเตรียม ได้แก่ Ubuntu Server 16.04 (รุ่น x86_64 architecture) จำนวนอย่างน้อย 4 เครื่อง (แต่ควรอย่างน้อย 6 เครื่อง), IP Address 4 IP, Software MySQL Cluster โหลดที่ https://edelivery.oracle.com/ (ต้องสมัครสมาชิกให้เรียบร้อยก่อน) ใช้คำค้นว่า MySQL Cluster (จะมีรุ่น 7.5.5 ให้โหลด) โดยไฟล์ที่ใช้งานชื่อว่า V840854-01.zip MySQL Cluster 7.5.5 TAR for Generic Linux (glibc2.5) x86 (64bit) 4 เครื่องประกอบด้วยอะไรบ้าง 2 x data nodes เปลี่ยน IP ให้ตรงกับที่ใช้งาน 192.168.106.32  Data-node1 192.168.106.33  Data-node2 1 x SQL/NoSQL Application Node 192.168.106.42  SQL-Node 1 x Management Node 192.168.106.40  Management-node เริ่มที่ Management Node ssh 192.168.106.40 -l sudo_user (user ที่เรียกใช้คำสั่ง sudo ได้) คลายแฟ้ม V840854-01.zip ด้วยคำสั่ง unzip V840854-01.zip (อาจต้องติดตั้งเพิ่มเติมด้วยคำสั่ง sudo apt install unzip) จะได้แฟ้ม  mysql-cluster-advanced-7.5.5-linux-glibc2.5-x86_64.tar.gz คลายแฟ้ม mysql-cluster-advanced-7.5.5-linux-glibc2.5-x86_64.tar.gz ด้วยคำสั่ง tar zxvf mysql-cluster-advanced-7.5.5-linux-glibc2.5-x86_64.tar.gz เปลี่่ยนชื่อ mysql-cluster-advanced-7.5.5-linux-glibc2.5-x86_64 เป็น mysql mv mysql-cluster-advanced-7.5.5-linux-glibc2.5-x86_64 mysql คัดลอกแฟ้ม mysql/bin/ndb_mgmd และ mysql/bin/ndb_mgm ไปไว้ที่ /usr/local/bin cp mysql/bin/ndb_mgm* /usr/local/bin/ สร้างโฟลเดอร์ /var/lib/mysql-cluster และสร้างแฟ้ม /var/lib/mysql-cluster/config.ini sudo mkdir -p /var/lib/mysql-cluster/ เพื่อเป็นการบอก Management node ว่า Data Node และ SQL Node มีใครบ้าง ให้สร้าง config.ini ไว้ที่ /var/lib/mysql-cluster ด้วยคำสั่ง cat<< EOF | sudo tee /var/lib/mysql-cluster/config.ini เพิ่มข้อความต่อไปนี้ลงไป [ndbd default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M [mysqld default] [ndb_mgmd default] [tcp default]# Cluster Control / Management node [ndb_mgmd] hostname=192.168.106.40# Data Node 1 [ndbd] hostname=192.168.106.32 DataDir= /var/lib/mysql-cluster# Data Node 2 [ndbd] HostName=192.168.106.33 DataDir=/var/lib/mysql-cluster# SQL Node [mysqld] hostname=192.168.106.42 # If you to add new SQL Node [mysqld] EOF เพิ่มข้อความต่อไปนี้ในแฟ้ม /etc/rc.local /var/lib/mysql-cluster/config.ini –configdir=/var/lib/mysql-cluster/ โดยเพิ่มให้อยู่บรรทัดก่อนคำว่า exit 0 ตัวอย่าง /etc/rc.local #!/bin/sh -e # # rc.local #

Read More »

Private Cloud with Juju and LXD Workshop

::Juju:: Juju #01 เริ่มต้นใช้งาน Juju Juju #02 วิธีติดตั้ง WordPress Juju #03 วิธีสร้าง Load Balance MySQL Juju #04 วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB Juju #05 วิธีกระจายงานไปยัง MySQL แบบ Master-Master Juju #06 เชื่อม MySQL Master-Master เข้ากับ HAProxy Juju #07 กระจายโหลดข้ามเครื่อง  

Read More »

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

Read More »

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 ขั้นตอนการติดตั้ง ที่ 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;” ที่ 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 ควรจะได้ผลประมาณนี้ จากนั้นก็สามารถพัฒนา 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  

Read More »

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 *** ขั้นตอนการติดตั้งมีดังนี้ Deploy haproxy (ตั้งชื่อ haproxy-mysql) และ MySQL (ตั้งชื่อ mysql-master1 และ mysql-master2) ต่อไปนี้เป็นวิธีการติดตั้ง MySQL Master-Master Replication [1] บนเครื่อง 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 ไว้ เพื่อใช้ในขั้นตอนต่อไป บนเครื่อง 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

Read More »