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