Improves performance ให้กับ MYSQL Galera Cluster
หนึ่งสิ่งที่ได้เจอหลังจากใช้ Galera Cluster มาใน Production รู้สึกว่าเอ้ะทำไม Performance มันตก !!
จริงมันช้าแปลกๆอยู่ละ พึ่งสังเกตุ ถถถถถ
วันนี้เลยขอเขียนบทความนี้ เผื่อเป็นทางออกให้หลายๆคนที่กำลังใช้ Galera Cluster อยู่
” binary logging ” และ ” innodb_flush_log_at_trx_commit ” คือพระเอก ในวันนี้
ซึ่งเจ้าสองตัวนี้เราจะต้องไปจัดการมันในไฟล์ .cnf หรือ galera.cnf ขึ้นอยู่กับเราจัดการไฟล์ Config สำหรับ mysql galera cluster ของเรายังไง
innodb_flush_log_at_trx_commit
เป็น Option ที่ให้เรา config ได้ โดยจะเป็นสิ่งที่เกี่ยวข้องกับการ Write และ Flush log
โดยจะมีทั้งหมด 3 options ด้วยกัน
- innodb_flush_log_at_trx_commit = 0 จะทำการ Write และ Flush log 1 ครั้งต่อ 1 วินาที
- innodb_flush_log_at_trx_commit = 1 [Default] จะทำการ Write และ Flush log ทุกๆ transaction
- innodb_flush_log_at_trx_commit = 2 จะทำการ Write ทุกๆ transation แต่จะ Flush log ทุกๆ 1 วินาที
*Transation ใดๆ ที่ไม่ได้ Write แต่ไม่ได้ Flush อาจจะทำให้ข้อมูลหายได้ ถ้าเกิด crash ! ใน Database ปกติ ซึ่งหากเป็นปกติผมจะแนะนำให้ใช้เป็น innodb_flush_log_at_trx_commit = 1
แต่สำหรับ Galera cluster นั้นเป็น synchronous replication แปลว่า ทุก Commit ของแต่ละ transaction ที่ได้ commit ลง Node แรกนั้นได้ Sync ไปยัง Node อื่นๆ ใน Cluster อยู่แล้ว ทำให้ในเคสนี้เราเปิดเป็น innodb_flush_log_at_trx_commit = 2 ได้เลย!! ยกเว้น node ทั้งหมดใน Cluster เราจะพังพร้อมกัน ถถถ
binary logging
เป็นสิ่งที่จะเก็บการเปลี่ยนแปลงต่างๆ ไม่ว่าจะเป็นในแง่ของ Data หรือ structure เช่น CREATE, ALTER, INSERT, UPDATE and DELETE ซึ่งเป็น statements ที่จะทำให้เกิดการเปลี่ยนแปลงกับข้อมูลใน Table จะทำการ Log ทั้งหมด
แต่ถ้าเป็นพวก SELECT หรือ SHOW จะไม่ได้มีการ Log ใดๆ
ซึ่งสิ่งที่เราต้องทำคือการเปิดเจ้า Binary logging ตัวนี้ พอเราไปไล่ Code ใน Database เราจะเจอว่า ไม่ว่าเราเปิดหรือปิด Bin-log มันก็ยังคงไปเรียก function log_and_order แต่เป็นการมาจาก class ที่แตกต่างกัน
- จาก TC_LOG_BINLOG ในกรณีที่ Binary logging ได้ทำการ enabled
- จาก TC_LOG_MMAP ในกรณีที่ Binary logging ได้ทำการ disabled
ซึ่งไอ้เจ้า innodb_flush_log_at_trx_commit มันจะถูกเรียกใช้เฉพาะเมื่อมี Class TC_LOG_BINLOG หรือแปลอีกทีคือ เราจำเป็นที่จะต้องเปิด Binary logging เพื่อให้สามารถใช้ Option innodb_flush_log_at_trx_commit ได้
หากเป็นการเรียกผ่าน TC_LOG_MMAP สิ่งที่เกิดขึ้นคือมันจะไปผ่าน TC_LOG_MMAP::log_one_transaction แปลว่าจะมีการ Log ทุกๆ Transation นั้นเป็นสาเหตุที่ทำให้ Write preformane ของเราช้าลง
ซึ่งสรุปได้ว่า ถ้าจะทำให้ Write performance ของเราดีขึ้น จะต้องปรับเป็น innodb_flush_log_at_trx_commit = 2 และ เปิดใช้งาน Binary logging ด้วย
ซึ่งเราจำเป็นที่จะต้องปรับ Config นี้ไปยังทุกๆ node ใน Cluster ด้วย
หลังจากนั้นผลที่ได้จากการทดสอบจาก Record ใน Table จำนวน 2,000,000 ด้วย Tools sysbench โดยมีการ Setup Lab สำหรับการทดสอบ ดังนี้
3 Servers สำหรับ Mysql Galera cluster โดย Memory 2GB
และ 1 Servers สำหรับการยิง Load test จาก Sysbench
ซึ่งทำให้ได้ผลว่า Performance โดยรวมดีขึ้นประมาณ 15% ทั้งนี้ขึ้นอยู่กับจำนวน Record ด้วย
จบฮะ ใครมีอะไรสงสัยส่ง Message มาคุยกันได้ที่ Facebook : Issaret Prachitmutita
และเร็วๆนี้จะมี Class Jump into DevOps รอบ 2 ซึ่งครอบคลุมเนื้อหา Docker , Rancher , Circleci, ELK for logging , API Gateway with KONG ใครสนใจทักแชทมาลงชื่อไว้ฮะ ได้วันเวลาที่แน่นอนจะแจ้งไป
ขอบคุณครับ.
อ่านต่อ:
https://lists.launchpad.net/maria-developers/msg10086.html
https://jira.mariadb.org/browse/MDEV-3861
http://worklog.askmonty.org/worklog/Server-Sprint/?tid=116
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit