มาทำความรู้จัก MariaDB Galera Cluster ในเบื้องต้น

เป็น note ที่เขียนไว้นานแหละ แต่ draft ไว้ไม่ได้โพส เลยมาโพสสรุปสักหน่อย

MariaDB Galera Cluster เป็น Synchronous replication แบบ master-master replication (Active-active multi-master topology) ต้องใช้ Server จำนวน 3 เครื่องขึ้นไปในการทำงาน โดยความสามารถของ MariaDB Galera Cluster นั้น เป็นการช่วยเสริมความมั่นคง และเหมาะกับระบบที่เน้นข้อมูลที่มีการเปลี่ยนแปลงอยู่บ่อยครั้ง เพราะจากแต่เดิมนั้น เรามักใช้ MySQL หรือ MariaDB ในรูปแบบ standalone server แบบเดิมๆ ซึ่งอาจจะปรับไปใช้รูปแบบโครงสร้างที่ชื่อว่า Asynchronous replication (master-slave replication) โดยรูปแบบดังกล่าวมีข้อเสียในด้านความมั่นคงของข้อมูลที่ master server ที่ใช้เพื่อ เพิ่ม ลบ และเปลี่ยนแปลงข้อมูล ที่มีเพียง server ตัวเดียวที่ทำงานเหล่านี้ได้ และมักเน้นหนักไปที่การอ่านข้อมูลมากกว่าการเปลี่ยนแปลงข้อมูล ซึ่งอาจเกิดเหตุการณ์ที่ทำให้ master server หยุดทำงานไป มีผลทำให้ไม่สามารถ เพิ่ม ลบ และเปลี่ยนแปลงข้อมูลได้ ทำให้การให้บริการเต็มรูปแบบนั้นหยุดลง ด้วยเหตุผลดังกล่าว เราจึงจำเป็นต้องหาแนวทางที่ชื่อว่า Synchronous replication หรือ multi-master replication (Active-active multi-master topology) ของ MariaDB Galera Cluster โดยต้องทำการย้ายฐานข้อมูลจาก MySQL หรือ MariaDB ในรูปแบบ standalone server หรือใช้รูปแบบโครงสร้าง Asynchronous replication (master-slave replication) ไปใช้ MariaDB Galera Cluster เพื่อใช้ในการแก้ไขปัญหาดังกล่าว

จุดสำคัญของตัว MariaDB Galera Cluster คือ มันสามารถอ่าน และเขียนได้จาก cluster node ใดๆ ก็ได้ โดยที่มีระบบ membership control สามารถปลดออกจากกลุ่มเมื่อพบความผิดพลาด หรือเพิ่ม cluster node อัตโนมัติเมื่อมีการเพิ่มเข้ามาในระบบ โดยข้อมูลในการจัดการภายในเป็นแบบเป็น parallel replication ระดับ row

สำหรับการเชื่อมต่อกับ MariaDB Galera Cluster นั้นสามารถใช้ MySQL Library โดยทั่วไป โดยไม่ต้องแก้ไข code ใดๆ (นอกจากแก้ไขตามข้อจำกัดของระบบ Cluster บางอย่าง)

แน่นอนว่ามีข้อดีก็ต้องมีข้อจำกัด โดยข้อจำกัดของ MariaDB Galera Cluster นั้นคือ

  • ใช้ได้แต่ InnoDB storage engine เท่านั้น ถ้ามี MyISAM storage engine ให้ alter เสียก่อน
  • การที่ MariaDB Galera Cluster สามารถเพิ่มข้อมูลที่ตัว node ใดๆ ก็ได้ ต้องปรับแก้ auto_increment_increment และ auto_increment_offset ให้สอดคล้องกับ cluster node ที่ใช้ auto increment ใน table ต่างๆ แนะนำให้ใช้การเพิ่มข้อมูล 1-2 cluster node เพื่อป้องกันการทำ auto increment ซ้ำซ้อนกัน
  • สำหรับการใช้ DELETE ต้องใช้กับ table ที่มี primary key คำแนะนำง่ายๆ ถ้าจะใช้ table ทุกๆ ตัวต้องมี primary key และการ DELETE ต้องทำผ่าน primary key
  • เมื่อเป็น multi-master replication การใช้ binlog-do-db และ binlog-ignore-db จึงทำไม่ได้ รวมไปถึงใช้ Query cache ไม่ได้ (แนะนำให้ใช้ Memcached แก้ไขปัญหาแทนได้)
  • ทำ LOCK/UNLOCK TABLES และใช้ XA transactions ไม่ได้ (แต่ยังใช้ Transaction ตามปรกติได้)
  • แนะนำให้ใช้เพียง character_set_server แบบ utf8 เท่านั้น
  • ไม่สนับสนุนบน Windows

สำหรับในการติดตั้งนั้นไม่ได้ยุ่งยากอะไรนัก ใช้ตัว configuration ของ wsrep ในการตั้งค่าต่างๆ (MySQL Write Set Replication; MySQL-wsrep) โดยเข้าไปแก้ไขใน my.cnf สามารถทำตาม ที่บทความ Install MariaDB Galera Cluster in Ubuntu ได้เลย

เมื่อ MySQL license ผิด ต้อง report เป็น bug

จาก MySQL อาจไม่ใช่ซอฟต์แวร์เสรีอีกต่อไป นั้น มีนักพัฒนารายหนึ่งที่ใช้ชื่อว่า “Norvald Ryeng” ได้รายงานข้อผิดพลาด (Bug) นี้ลงใน MySQL Bugs โดยอยู่ในหัวข้อ MySQL Bugs: #69512: Wrong license in man pages in Community Server

โดยสรุปได้ว่า “ในหน้า License ดังกล่าวนั้นเป็นการดึง copyright header ที่ผิดพลาดมาจากชุดอื่นที่ไม่ใช่ GPL packages ในระบบสร้างเอกสารหน้านั้นๆ” ทำให้ต้องทำการแก้ไขในรุ่นต่อไปในอนาคต ซึ่งสุดท้ายข้อผิดพลาดนี้จะถูกแก้ไขใน MySQL 5.1.70, 5.5.32, 5.6.12 และ 5.7.1-m11 ตามลำดับ

ที่มา: MySQL Bugs

MySQL Bugs: #69512: Wrong license in man pages in Community Server

[19 Jun 7:28] Norvald Ryeng
Description:

The man pages of Community Server should be GPL, but since 5.5.31, packages have contained man pages with a different license. 5.5.30 man pages are correctly licensed.

The bug exists in the latest release of 5.1, 5.5, 5.6 and 5.7. I haven’t checked older versions of 5.1, 5.6 or 5.7.

How to repeat:
Read the man pages.

Suggested fix:
Change back to the correct license.

[19 Jun 7:52] Yngve Svendsen

Thank you for the report. This is indeed a bug, where the build system erroneously and silently started pulling in man pages with the wrong set of copyright headers.

[19 Jun 8:23] Balasubramanian Kandasamy

Working on the fix.

[19 Jun 8:47] Yngve Svendsen

Once the fixes have been made to the build system, we will rebuild the latest 5.1, 5.5, 5.6 releases plus the latest 5.7 milestone and make those available publicly asap.

[19 Jun 18:00] Yngve Svendsen

5.5 rebuilds started. Other versions will follow as soon as these have been confirmed to contain the correctly licensed man files.

[19 Jun 18:28] Balasubramanian Kandasamy

Fix tested on 5.5.32 release branch. GPL packages has got the correct man pages now.

Re-build in progress for 5.6.12 and 5.7.1 release branches.

เดี่ยวนะ! แสดงว่า Xbox One นี่ก็โดน report bug เรื่อง license เหมือนกันซินะ Microsoft เลยกลับลำ ;P

ลาก่อน MySQL สวัสดี MariaDB

จากข่าว “MySQL อาจไม่ใช่ซอฟต์แวร์เสรีอีกต่อไป” ทำให้ผมนั้นได้เวลาเปลี่ยนแปลงมาใช้งาน MariaDB แบบจริงจังเสียที เป็นการตัดสินใจที่คิดมานานแล้ว วางแผนมาพอสมควรแตไม่ได้ทำ

MariaDB คือ MySQL ที่ถูกนำมา fork ออกมาจากต้นสาย MySQL ที่ถูก Oracle ซื้อพ่วงไปกับ Sun และโดนดองไว้ไม่มีการพัฒนาที่มีทิศทางที่ชัดเจนมาสักพักใหญ่ๆ แล้ว

โดย Michael Widenius ซึ่งเป็นผู้ก่อตั้ง MySQL เดิม ได้ fork ตัวโครงการออกมาใหม่ได้สักพักใหญ่ๆ หลายปีแล้ว และทำงานภายในชื่อบริษัท Monty Program AB

สำหรับผมนั้นใช้งาน MySQL Server ที่ทำงานกับ blog นี้ที่เป็น MySQL 5.5 อยู่แล้ว การย้าย (migrate) จึงไม่มีอะไรยุ่งยาก เพราะ MariaDB ได้ชื่อว่ารองรับการทำงาน MySQL ได้เต็ม 100% จนได้ชื่อว่า “MariaDB is a binary drop in replacement for MySQL” เลยทีเดียว

ข้อมูลเบื้องต้นก่อนทำการติดตั้งและทำการย้าย

MariaDB นั้นมี 2 รุ่นคือ 5.5 เป็นรุ่น Stable version (GA) และ 10.0 ที่เป็นรุ่น Development version ก่อนติดตั้งเช็คดีๆ ก่อนนะครับ ซึ่งแน่นอนก่อนการย้าย backup ข้อมูลทั้งหมดไม่ว่าจะเป็น data และ user account ก่อนกันพลาดนะครับ

สิ่งแรกที่ต้องทำคือ ตั้งค่า Repositories (sources.list) ให้ MariaDB รู้จักใน APT Repositories เสียก่อน

โดยเข้าไปที่ https://downloads.mariadb.org/mariadb/repositories/

โดย Server ผมนั้นใช้ Distro ที่ชื่อ Ubuntu Server รุ่น 12.04 LTS ก็เลือกตามรายการ ตามด้วย MariaDB version 5.5 และเลือก Mirror เป็น National University of Singapore เพราะ VM Server ผมอยู่ใกล้ที่นั้นที่สุด เสร็จแล้วตัวเลือกก็จะสร้างคำแนะนำมาให้

ก็รันคำสั่งต่อ 2-3 ตัว

1. เพิ่ม sign key ของ MariaDB deb packages ลงไปก่อน

  1. sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

2. เพิ่ม apt-repository ลงไปใน sources.list

  1. sudo add-apt-repository 'deb http://download.nus.edu.sg/mirror/mariadb/repo/5.5/ubuntu precise main'

หรือจะเข้าไปแก้ไขไฟล์ /etc/apt/sources.list เองก็ได้ โดยการใส่ข้อมูลด้านล่างนี้ลงไป

  1. # MariaDB 5.5 repository list - created 2013-06-19 04:24 UTC
  2. # http://mariadb.org/mariadb/repositories/
  3. deb http://download.nus.edu.sg/mirror/mariadb/repo/5.5/ubuntu precise main
  4. deb-src http://download.nus.edu.sg/mirror/mariadb/repo/5.5/ubuntu precise main

3. สั่งดึงข้อมูลจาก MariaDB repository มาก่อน

  1. sudo apt-get update

4. ติดตั้ง mariadb-server

  1. sudo apt-get install mariadb-server

5. คำสั่งก็จะมีแสดงรายการว่ามีการเอาอะไรออก และใส่อะไรเพิ่มเติมลงมาบ้าง

  1. The following extra packages will be installed:
  2. libmariadbclient18 libmysqlclient18 mariadb-client-5.5
  3. mariadb-client-core-5.5 mariadb-common mariadb-server-5.5
  4. mariadb-server-core-5.5 mysql-common
  5.  
  6. Suggested packages:
  7. tinyca mailx mariadb-test
  8.  
  9. The following packages will be REMOVED:
  10. mysql-client-5.5 mysql-client-core-5.5 mysql-server mysql-server-5.5
  11. mysql-server-core-5.5
  12.  
  13. The following NEW packages will be installed:
  14. libmariadbclient18 mariadb-client mariadb-client-5.5 mariadb-client-core-5.5
  15. mariadb-common mariadb-server mariadb-server-5.5 mariadb-server-core-5.5
  16.  
  17. The following packages will be upgraded:
  18. libmysqlclient18 mysql-common

จะเห็นว่ามีการถอนการติดตั้ง MySQL ออกจากเครื่อง และติดตั้ง MariaDB ลงไปแทน งานนี้ต้องมีตัวใดตัวหนึ่งระเห็ดออกจากเครื่องนี้ไป แน่นอนว่าเลือก MariaDB ให้อยู่ และไล่ MySQL ออกไปครับ!!!

ก็ตอบ Y เพื่อยืนยันการติดตั้ง

รอสักพักไม่นานเกินไป ทุกอย่างก็เรียบร้อย

  • MySQL จะถูกหยุดการทำงาน และถูกถอนการติดตั้ง แต่ข้อมูลในฐานข้อมูลยังอยู่ (แต่แนะนำให้ backup ไว้กันพลาด)
  • ตัว MariaDB เมื่อติดตั้งเสร็จจะให้ตั้งรหัสผ่านของ root ใหม่อีกครั้ง เพื่อใช้ในการทำงานร่วมกับ MariaDB
  • MariaDB จะทำการตรวจสอบไฟล์ ตารางต่างๆ และฐานข้อมูลทั้งหมดเพื่อทำการย้ายและอัพเกรด
  • เมื่อ MariaDB เริ่มรันตัวเองขึ้นมาจะบอกว่าทุกอย่างทำงานได้ครบ 100% หรือไม่ ต้องปรับแต่ไฟล์ /etc/mysql/my.cnf อะไรเพิ่มเติมหรือเปล่า

ตรวจสอบด้วย mysql -v จะขึ้นว่า

  1. Server version: 5.5.31-MariaDB-1~precise mariadb.org binary distribution
  2.  
  3. Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

จากการย้ายครั้งนี้ไม่ต้องใช้ข้อมูลที่ backup ไว้แต่อย่างใด ตัวคำสั่งจะถอนการติดตั้ง MySQL และติดตั้ง MariaDB ลงไป ตัว MariaDB จะย้าย และทำตัวเป็น MySQL แทนที่ทันที port ที่เชื่อมต่อก็ 3306, ไฟล์ config และ path ต่างๆ ทั้งหมด รวมไปถึงคำสั่งต่างๆ ยังใช้ mysql command เดิมทั้งหมด

สำหรับการเชื่อมต่อของ PHP กับ MariaDB นั้น ทำงานได้ผ่าน mysqlnd extension ตัวเดิมๆ ได้ทันที

ตอนนี้ blog ที่ท่านอ่านอยู่นี้ก็ใช้งานผ่าน PHP 5.4 และฐานข้อมูล MariaDB เชื่อมต่อกับ WordPress ตัวล่าสุด และทำงานได้อย่างดีครับ

url-attack-on-titan

ย้าย datadir ของ MySQL ใน Ubuntu Server 8.10

พอได้ Server ใหม่ของ ThaiThinkPad มาแล้วกำลัง Tuning ตัวระบบอยู่ สิ่งที่ต้องทำคือการย้าย datadir ของ MySQL ออกมาอีก I/O แยกจาก H/D หลัก ซึ่งตัว Server ผมมี H/D อยู่สองลูกครับ

วิธีการทำก็ไม่ยากครับ แต่มึนตอนแรกตรง AppArmor เนี่ยแหละ เพราะตอนผมทำบน Windows หรือบน CentOS มันไม่มีปัญหานี้ พอมา Ubuntu Server นี่มันมีส่วนนี้เลยต้องแก้ไขส่วนนี้เพิ่มเติมครับ เรามาเริ่มกันเลย

ปิด Service MySQL

  1. $ sudo /etc/init.d/mysql stop
  2. * Stopping MySQL database server mysqld [ OK ]

ทำการ copy แบบ archive (คงสภาพของ owner/mode ของไฟล์) ไปไว้ที่ H/D นึง ผม mount ไว้ที่ /datasvr (ย้ายจาก /var/lib/mysql ไป /datasvr)

  1. $ sudo cp -a /var/lib/mysql /datasvr

ทำการ Backup ตัวเก่าไว้ก่อนด้วยการเปลี่ยนชื่อ dir ไว้เฉย ๆ กันเหนี่ยวไว้ก่อน

  1. $ sudo mv /var/lib/mysql /var/lib/mysqlbk

ทำการ change owner เป็น group mysql และ user mysql สักหน่อยเผื่อไว้

  1. $ sudo chown -R mysql:mysql /datasvr

แก้ไขไฟล์ my.conf

  1. $ sudo nano /etc/mysql/my.conf

แก้ไขค่าของ

  1. datadir = /var/lib/mysql

เป็น

  1. datadir = /datasvr/mysql

ถ้าใช้ Ubuntu 8.10 Server แก้ไขตัว Application Armor เสียด้วย โดยไปที่

  1. $ sudo nano /etc/apparmor.d/usr.sbin.mysqld

โดยแทรกข้อมูลด้านล่างลงไป โดยเปลีย่น /datasvr/mysql/ เป็น path ของ datadir ที่เราต้องการย้ายไป

  1. /datasvr/mysql/ r,
  2. /datasvr/mysql/** rwk,

แล้ว restart Service AppArmor

  1. sudo /etc/init.d/apparmor restart

แล้วก็เปิด Service MySQL ทำงานต่อไปได้เลย

  1. $sudo /etc/init.d/mysql start
  2. * Starting MySQL database server mysqld [ OK ]

แค่นี้ก็เสร็จสิ้นกรรมวิธีการย้ายข้อมูลแล้ว คราวนี้ก็แบ่ง ๆ โหลด I/O ไปคนละ H/D ครับ

MySQL AB เปิดตัว MySQL 5.1 Generally Available (GA) แล้ว

เมื่อวันที่ 1 ธันวาคม 2551 ที่ผ่านมา MySQL AB ได้ทำการประกาศสถานะ Generally Available (GA) ให้กับ  MySQL 5.1 เป็นที่เรียบร้อยแล้ว โดยที่ในรุ่นนี้จะมีความสามารถดังต่อไปนี้

  • Table and Index Partitioning
    การแบ่งแยกการเก็บข้อมูลในตารางไว้ได้หลาย ๆ ที่ ตามเงื่อนไขที่กำหนด(different portions of a table are stored as separate tables in different locations) ซึ่งตัวนี้เป็นสิ่งที่หลาย ๆ คนรอคอย เพราะช่วยกระจายตัวข้อมูลใน table ที่ใช้อยู่บ่อย ๆ ไปไว้ใน Hard Drive คนละตัวกัน ซึ่งช่วยให้กระจายการทำงานของ I/O ได้ แต่ก็ต้องแลกกับการ Backup ที่ยากขึ้นด้วยเช่นกัน
  • Row-Based and Hybrid Replication
    การทำ replication บน MySQL ก่อนหน้านี้จะเป็น statement-based replication คือการเก็บ statement ใน bin-log แล้วส่งจาก master ไปยัง slave ให้ slave ทำงานตามไปด้วย แต่ row-based replication เป็นการเก็บ statement ที่จะส่งจาก master ไป slave ชื่อที่เรียกว่า event ลงใน bin-log แล้วส่งเฉพาะส่วนที่เป็นผลของข้อมูลในตารางนั้น ๆ ไปให้กับ slave แทน (ส่วนที่ถูกแก้ไขนั้นแหละ) ทำให้ slave ไม่ต้องทำงานตามที่ master ไปเสียทุกอย่าง ทำเพียงแต่รับผลการเปลี่ยนแปลงจาก master เท่านั้น แต่ก็สามารถเลือกทำแบบ mixed ได้เช่นกัน
  • Plugin API and Pluggable storage engine API
    เขียน Plugin เพิ่มได้ รู้สึกว่าตอนนี้ตัว plugin full-text parsers ก็เป็นตัวอย่างหนึ่งในการสร้าง Plugin API เหมาะมากในอนาคต ที่จะระบบตัดคำไทยใน MySQL เพื่อทำ full-text search (ผมไม่แน่ใจว่ามีใครทำไปแล้วหรือยัง)
  • Event scheduler
    เป็นการตั้ง schedule job แบบเดียวกับการทำ crontab (cron job) ใน UNIX นั้นเอง แต่อันนี้ทำในระดับ DBMS เลยไม่ต้องมี App ตัวอื่น ๆ มามีส่วนเกี่ยวข้องเหมาะสำหรับทำ report table หรือ log table ที่ต้องมีการ clear ข้อมูลเป็นประจำ
  • Server log tables
  • Upgrade program
  • MySQL Cluster
    ใน MySQL 5.1 ได้ทำการแยกสายการพัฒนาออกมาเป็นอีกรุ่นหนึ่งของ MySQL ไปเลย
  • Backup of tablespaces
  • Improvements to INFORMATION_SCHEMA
  • XML functions with XPath support
  • Load emulator

อ้างอิงจาก http://dev.mysql.com/doc/refman/5.1/en/mysql-nutshell.html

ใน MySQL 5.1 ส่วนที่น่าสนใจจริง ๆ คงเป็นเรื่อง Table and Index Partitioning, Row-based replication, Plugin API และ Event Scheduler ที่ช่วยให้การทำงานหลาย ๆ อย่างง่ายขึ้นครับ

ย้อนกลับไปนิดนึง สำหรับบางคนที่ยังไม่รู้เลยว่า MySQL 5.0 มันทำอะไรได้บ้างนั้นตัว MySQL 5.0 นั้นสามารถทำ Stored procedures, Views (แต่ทำ cache ไม่ได้), Cursors, XA transactions และ Triggers

โดยในรุ่นต่อไป MySQL 5.2 แต่จากที่ดู ๆ ไปแล้วเนี่ย คาดว่าจะเป็น 6.0 มากกว่านะ เพราะเจ้า MySQL 5.2 ในเว็บ MySQL AB มันหายไปแล้ว

ซึ่งในรุ่นต่อไปก็คงได้เวลาของ Falcon ซึ่งเป็น Transaction Storage Engine ที่คาดการณ์กันไว้ว่าจะมาแทน InnoDB ที่โดน Oracle ซื้อไป คงต้องดูกันอีกทีว่าเจ้า Falcon จะมีดีแค่ไหน รอดูกันต่อไปครับ