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 »

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 ที่ WordPress ใช้คำสั่ง wget https://downloads.wordpress.org/plugin/hyperdb.1.2.zip sudo apt-get install unzip sudo unzip hyperdb.1.2.zip ย้ายไฟล์ hyperdb/db-config.php ไปยังที่ Directory เดียวกันกับ wp-config.php (ในที่นี้คื่อ /var/www/) sudo cp hyperdb/db-config.php /var/www ย้ายไฟล์ hyperdb/db.php ไปยังที่ Directory wp-content (ในที่นี้คื่อ /var/www/wp-content) sudo cp hyperdb/db.php /var/www/wp-content/ แก้ไขไฟล์ db-config.php (ในที่นี้คื่อ /var/www/db-config.php) [3] โดยค้นหาคำว่า DB_HOST ซึ่งควรจะปรากฏอยู่แค่ 2 แห่งในไฟล์ ให้ไปที่ชุดที่ 2 ซึ่งมีเนื้อหาประมาณนี้ จากนั้นแก้ไข DB_HOST ให้เป็น DB_SLAVE_1 ต่อไปก็ไปเพิ่ม define(‘DB_SLAVE_1′,’xxx.xxx.xxx.xxx’) ซึ่งไฟล์ wp-config.php หรือไม่ก็ wp-info.php (ในที่นี้อยู่ที่ /var/www/wp-info.php) เมื่อทดสอบใช้งาน พบว่า มี Query มาทั้งที่ master และ slave ในภาวะว่าง ในภาวะมีงานเข้ามา ทดสอบเพิ่มบทความใหม่ ชื่อ “This is my first article” พบว่า ระบบสามารถเขียนไปยัง Master แล้วสามารถส่งต่อไปให้ Slave ได้ ต่อไป เพิ่ม mysql-slave2 เข้าไปใน Juju และสร้าง Relation เป็น master -> Slave เช่นกัน แล้วทำการเพิ่ม DB_SLAVE_2 เข้าไปใน db-config.php และ wp-info.php ก็จะพบว่าข้อมูลได้ Replicate ไปหา Slave2 แล้ว และ เมื่อทำการ

Read More »

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

Read More »

Juju #02 – วิธีติดตั้ง WordPress

ในบทความนี้ จะแสดงวิธีการใช้ Juju เพื่อติดตั้ง WordPress พร้อมแสดงวิธีการเฝ้าระวังด้วย Nagios และ การ Scale Out เริ่มต้นจากคลิกที่ รูปเครื่องหมายบวก (+) สีเขียว ในช่องค้นหา พิมพ์คำว่า “wordpress” แล้วคลิก Enter จะปรากฏผลการค้นหา สิ่งนี้เรียกว่า Charm ซึ่งเป็น Image ของระบบปฏิบัติการ พร้อมทั้งการ Setup สิ่งที่เราต้องการมาให้เลย ในภาพให้คลิกที่คำว่า WordPress ด้านซ้ายมือ จากนั้น คลิก Add to canvas ต่อไป ทำซ้ำ โดยการค้นหาสิ่งต่อไปนี้ haproxy, mysql, nagios แล้วจัดระเบียบให้สวยงามตามต้องการ จากนั้น ลากเส้นเชื่อมโยงความสัมพันธ์กัน Juju จะสร้างการเชื่อมต่อต่างๆให้เองอัตโนมัติ ในภาพ จะเป็นการตั้งค่าให้ haproxy ทำหน้าที่เป็น Load Balance ให้ WordPress ซึ่งจะเกิดขึ้นอีกหลายเครื่องในอนาคต และ WordPress ก็จะเชื่อมต่อกับ MySQL นอกจากนั้น ก็มี Nagios ที่จะเฝ้าระวัง WordPress และ MySQL เมื่อลากเส้นเชื่อมโยงเสร็จแล้ว คลิก Commit Changes ด้านขวามือล่าง จากนั้นคลิกปุ่ม Deploy หลังจากนั้น Juju จะไปเรียก Image มาติดตั้ง และสร้างความสัมพันธ์ของระบบที่เราออกแบบไว้ เมื่อเสร็จแล้วจะได้ผลดังภาพ ต่อไปคลิกที่ haproxy แล้วคลิกคำว่า Expose เพื่อบอกให้ระบบนี้สามารถเข้าถึงจากภายนอกได้ ใน Expose ให้เลือก On ระบบจะแสดง IP Address ให้ ในที่นี้คือ 10.107.107.215 ซึ่งจะเข้าถึงโดยใช้ TCP Port 80 ที่ Nagios ก็เช่นกัน ให้ Expose เป็น On แล้วจะเข้าถึงได้จาก IP 10.107.107.95 จากนั้น คลิก Commit Changes ที่ IP Address 10.107.107.215 ก็จะพบการเริ่มต้นใช้งาน wordpress ทันที เริ่มจาก เลือกภาษา แล้วคลิก Continue จากนั้น ตั้ง Site Title, Username ที่จะเข้าใช้, Password, email address แล้วคลิก Install WordPress แค่นี้ก็ใช้ wordpress ได้แล้ว ที่ Nagios ก็จะสามารถใช้งานได้ที่ IP 10.107.107.95 (วิธีการเข้าใช้งาน มี Username/Password ที่กำหนดไว้แล้ว) ใน Nagios คลิก Service เพื่อเฝ้ารายละเอียดของ Service ต่างๆ   ใน Nagios คลิกที่ Map เพื่อดูผังการเชื่อมต่อ เมื่อมีการใช้งานมากขึ้น ก็สามารถเพิ่มเครื่อง WordPress เพื่อให้รองรับการเชื่อมต่อจำนวนมากขึ้นได้ โดยใน Juju คลิกที่ WordPress แล้วคลิก Scale จากนั้นให้เพิ่มเครื่องไปอีก 1 เครื่อง แล้วคลิก Confirm จากนั้นคลิก Commit Changes รอสักครู่ ก็จะพบว่า ใน Nagios ก็จะเพิ่มเครื่องใหม่ในการเฝ้าระวังให้เองอัตโนมัติด้วย จะง่ายไปไหน?  

Read More »