ศูนย์คู่มือ Ruk-Com PaaS

คู่มือการพัฒนา Deploy และดูแล Application บน Platform

RUK-COM PAAS / DATABASES

คู่มือ Galera Cluster Recovery สำหรับ Database

คู่มือนี้เรียบเรียงสำหรับ Ruk-Com PaaS หน้าจอและตัวเลือกอาจแตกต่างตามเวอร์ชันและสิทธิ์ของบัญชี

ตรวจสอบ Environment, Region, สิทธิ์บัญชี และสำรองค่าปัจจุบันก่อนดำเนินการกับระบบจริง

คู่มือภาษาไทย

คำสั่ง ชื่อเมนู Parameter และค่าตัวอย่างในกรอบ Code คงรูปแบบตามระบบเพื่อให้คัดลอกและตรวจสอบได้ถูกต้อง

ข้อจำกัดและการกู้คืน Cluster Galera

คำแนะนำนี้แสดงรายการข้อจำกัดและปัญหาที่พบบ่อยที่สุดเมื่อ HostCluster MariaDB Galeraที่ Platform ปฏิบัติตามคู่มือนี้เพื่อค้นหาปัญหาที่เป็นไปได้และวิธีแก้ไขปัญหาที่เกิดขึ้นแล้ว:

ข้อจำกัดของ Cluster Galera

คุณสามารถดูรายการข้อจำกัดทั้งหมดของ Cluster Galera ได้ที่เว็บไซต์อย่างเป็นทางการ.

ด้านล่างนี้เราจะเน้นสิ่งที่เกี่ยวข้องกับ Platform มากที่สุด

  1. ตารางทั้งหมดจะต้องมีคีย์หลัก

ตารางทั้งหมดควรมีคีย์หลัก (รองรับคีย์หลักแบบหลายคอลัมน์) ไม่รองรับการดำเนินการ DELETE บนตารางที่ไม่มีคีย์หลักนอกจากนี้แถวในตารางที่ไม่มีคีย์หลักอาจปรากฏในลำดับที่แตกต่างกันบน Node ที่ต่างกัน

หากต้องการค้นหาตารางที่ไม่มีคีย์หลักคุณต้องเรียกใช้แบบสอบถามต่อไปนี้:

select tab.table_schema as database_name,
tab.table_name
from information_schema.tables tab
left join information_schema.table_constraints tco
on tab.table_schema = tco.table_schema
and tab.table_name = tco.table_name
and tco.constraint_type = 'PRIMARY KEY'
where tco.constraint_type is null
and tab.table_schema not in ('mysql', 'information_schema',
'sys', 'performance_schema')
and tab.table_type = 'BASE TABLE'
order by tab.table_schema,
tab.table_name;
  1. มายไอแซมตาราง

ในปัจจุบันการจำลองใช้ได้กับเครื่องมือจัดเก็บข้อมูล InnoDB เท่านั้นการเขียนลงในตารางประเภทอื่นๆรวมถึงระบบ (mysql.) ตารางจะไม่ถูกจำลองแบบ (ข้อจำกัดนี้ไม่รวมคำสั่ง DDL เช่น CREATE USER ซึ่งแก้ไข mysql โดยปริยายตาราง — ตารางเหล่านั้นถูกจำลองแบบ) อย่างไรก็ตามมีการสนับสนุนรุ่นทดลองสำหรับ MyISAM - ดูตัวแปรระบบ wsrep_replicate_myisam)

Parameter การทดลองwsrep_replicate_myisamเพิ่มเพื่อรองรับตาราง MyISAM ลงในไฟล์กำหนดค่าแล้ว

ข้อมูลจำเพาะหยุด/เริ่ม/Restart

เงื่อนไขหลักในการหยุด Cluster คือตามลำดับการปิด Node ทั้งหมด Container สุดท้ายก็เข้ามาบูตสแตรปซึ่งหมายความว่า Cluster จะเริ่มต้นจาก Node นี้

Platform ทำให้โฟลว์ดังกล่าวเป็นอัตโนมัติดังนั้นคุณไม่จำเป็นต้องดำเนินการใดๆเพิ่มเติมคุณสามารถใช้งาน Galera Cluster ได้เช่นเดียวกับ Environment ปกติอื่นๆและเริ่มต้น/หยุด/Restart ผ่าน Dashboard กิจกรรมพิเศษจะดำเนินการที่จำเป็นทั้งหมด (เช่นการถอน Node ออกจาก Cluster ตามลำดับ) ในเบื้องหลัง

เมื่อคุณ Restart เพียง Node เดียวของ Cluster การดำเนินการจะเป็นมาตรฐาน

Node ที่มีธุรกรรมสูงสุด

ก่อนดำเนินการใดๆเราขอแนะนำให้สร้างการสำรองข้อมูลสำหรับ/var/lib/mysqlDirectory บนแต่ละ Node Cluster

เมื่อดำเนินการกู้คืน Cluster คุณจำเป็นต้องทราบ Node ที่มีหมายเลขลำดับสูงสุดของธุรกรรมครั้งล่าสุด (เนื่องจาก Cluster ควรเริ่มต้นจาก Node นี้) คุณสามารถรับหมายเลขลำดับของธุรกรรมครั้งล่าสุดได้จากลำดับที่สองมูลค่าใน/var/lib/mysql/grastate.datไฟล์ของแต่ละ Node:

mysql @ node270011-env-0668554 ~ $ cat /var/lib/mysql/grastate.dat | grep seqno
seqno: 1133

mysql @ node270016-env-0668554 ~ $ cat /var/lib/mysql/grastate.dat | grep seqno
seqno: 1134

mysql @ node270017-env-0668554 ~ $ cat /var/lib/mysql/grastate.dat | grep seqno
seqno: 1134

โดยปกติคุณเพียงแค่ต้องเลือก Node ที่มีค่า Parameter สูงสุดหาก Node ทั้งหมดหรือหลาย Node มีค่าสูงสุดเท่ากันให้เลือก Node ใด Node หนึ่ง (ควรเป็น Container หลักของ Layer)

อย่างไรก็ตามหากอย่างน้อยหนึ่ง Node มี-1ค่าคุณไม่สามารถแน่ใจได้ว่า Node มีความสอดคล้องกัน (Parameter ถูกรีเซ็ตเป็น -1 เมื่อเริ่มบริการใหม่บน Cluster ที่ไม่ทำงาน) ในกรณีเช่นนี้คุณจะต้องกู้คืนข้อมูลโดยเริ่มต้นmysqldกับ–wsrep-กู้คืนParameter:

$ mysqld --wsrep-recover

ผลลัพธ์การค้นหาสำหรับฟื้นตำแหน่งแล้วข้อมูล - ตรวจสอบค่าที่ท้ายสุดของบรรทัดหลังเครื่องหมายทวิภาค (85340ในตัวอย่างด้านล่าง):

Image 4: Galera cluster recovered position

....
2020-12-24 10:51:15 0 [Note] WSREP: Recovered position: e94ca741-44f5-11eb-9bc4-b2e17ef1657d:85340
....

เปรียบเทียบฟื้นตำแหน่งแล้วในทุก Node ควรใช้อันที่มีค่าสูงสุดสำหรับบูตสแตรปอีกครั้งให้เลือก Node ใดๆหากมีหลาย Node ที่มีค่าสูงสุดต่อไปให้ตั้งค่าsafe_to_bootstrapแปรผันเป็น1ในGrastate.datไฟล์และบูตสแตรปจาก Node นี้

การเริ่มต้น Cluster หลังจากเกิดข้อขัดข้อง

  1. ที่mysqlกระบวนการบน Node อาจหยุดทำงานหลังจาก Cluster เสียหายอาจแสดงเป็น "กำลังทำงาน" แต่คุณไม่สามารถดำเนินการตามปกติได้เช่นการสร้างการเชื่อมต่อหรือการหยุดกระบวนการด้วยวิธีมาตรฐาน (ผ่าน Script เริ่มต้น)

ดังนั้นก่อนที่จะเริ่ม Cluster ตรวจสอบให้แน่ใจว่าmysqlกระบวนการไม่ทำงานบน Node กระบวนการแฮงค์จะต้องถูกฆ่าด้วยตนเอง

  1. หลังจากฆ่า.mysqlกระบวนการให้ Restart Container MySQL ทั้งหมดของคุณ

  2. ตรวจสอบมูลค่าของsafe_to_bootstrapParameter ใน/var/lib/mysql/grastate.datไฟล์ - มันควรจะเป็น0.

CT-44999 /# grep safe_to_bootstrap /var/lib/mysql/grastate.dat
safe_to_bootstrap: 0
  1. บนNode ที่มีธุรกรรมสูงสุด, ชุดsafe_to_bootstrapถึง1และเริ่มการmysqlกระบวนการ.
CT-44999 /# sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/mysql/grastate.dat
CT-44999 /# grep safe_to_bootstrap /var/lib/mysql/grastate.dat
safe_to_bootstrap: 1
CT-44999 /# service mysql start
  1. ต่อไปก็เริ่มต้นตามลำดับmysqlบน Node ที่เหลือ:

# service mysql start

บันทึก:อาจเป็นเรื่องยากที่จะกำหนด Node ที่มีหมายเลขธุรกรรมสูงสุดหลังจากที่ Cluster ล้มเหลวในกรณีนี้คุณสามารถตั้งค่าได้safe_to_bootstrapถึง1บน Node หลักก่อน

หาก mysql เริ่มทำงานบนไฟล์ที่สองNode คุณสามารถดำเนินการต่อไปได้

อย่างไรก็ตามหากเกิดข้อผิดพลาดให้ตรวจสอบmysqld.logเกี่ยวกับเรื่องนี้ที่สองNode ค้นหาข้อความที่คล้ายกับข้อความต่อไปนี้:

2020-11-19 16:55:20 0 [ERROR] WSREP: gcs/src/gcs_group.cpp:group_post_state_exchange():422: Reversing history: 3151891 -> 3150782, this member has applied 1109 more events than the primary component.Data loss is possible. Aborting.

หากมีบันทึกดังกล่าวอยู่ ​ของคุณที่สองNode มีธุรกรรมมากกว่ารายการที่เลือกไว้ในตอนแรก (เช่น Node แรกที่คุณตั้งค่าsafe_to_bootstrapถึง1). กรุณากลับมาที่จุดเริ่มต้นของส่วนนี้และเริ่มต้นใหม่อีกครั้งโดยใช้ที่สองNode ในขั้นตอนที่สี่

ความล้มเหลวของ Node เดียว

สาเหตุที่พบบ่อยที่สุดของข้อขัดข้องของ Node คือไม่สามารถประมวลผลคำขอได้เนื่องจากมีการละเลยบางส่วนข้อจำกัด. คุณสามารถตรวจสอบ/var/log/mysql/mysqld.logบันทึกข้อผิดพลาดดังกล่าว

ในการกู้คืน Node คุณต้อง:

  • ให้แน่ใจว่าไม่mysqlกระบวนการกำลังทำงานบน Node
  • ตั้งค่าsafe_to_bootstrapParameter ถึง0ใน/var/lib/mysql/grastate.datไฟล์
  • Restart Node ผ่านเริ่มต้นScript

/etc/init.d/mysql restart

บันทึก:หากมีปัญหากับข้อจำกัดของ Cluster Galera ข้อผิดพลาดอาจปรากฏขึ้นอีกครั้งหลังจากผ่านไประยะหนึ่ง

การตรวจสอบ Cluster Galera

คุณสามารถตรวจสอบสถานะและ Parameter ต่างๆของ Cluster ได้โดยการระบุไว้ในแสดงสถานะทั่วโลกเช่นคำสั่งบน Node ใดๆของ Cluster คุณสามารถดูแง่มุมต่างๆของ Cluster ได้ทั้งนี้ขึ้นอยู่กับค่าที่ให้มาตัวอย่างเช่น:

mysql -uuser -ppass -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';"
+ -------------------- + ------- +
| Variable_name        | Value   |
+ -------------------- + ------- +
| wsrep_cluster_size   |    3    |
+ -------------------- + ------- +

mysql -uuser -ppass -e "SHOW GLOBAL STATUS LIKE 'wsrep_cluster_status';"

+ ---------------------- + --------- +
| Variable_name          |  Value    |
+ ---------------------- + --------- +
| wsrep_cluster_status   | Primary   |
+ ---------------------- + --------- +

mysql -uuser -ppass -e "SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';"
+ --------------------------- + -------- +
| Variable_name               | Value    |
+ --------------------------- + -------- +
| wsrep_local_state_comment   | Synced   |
+ --------------------------- + -------- +

หาก Cluster ของคุณรวมพร็อกซี SQLNode สถานะอาจถูกตรวจสอบโดยดำเนินการตามคำขอต่อไปนี้ในสิ่งใดสิ่งหนึ่งพร็อกซี SQLNode:

CT-44998 /# mysql -uadmin -padmin -P6032 -h127.0.0.1 -e "select * from runtime_mysql_servers;"
Warning: Using a password on the command line interface can be insecure.
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 2            | node3303 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 3            | node3304 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 3            | node3303 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 2            | node3304 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+----------+------+-----------+--------+--------+-------------+------------

Node ทั้งหมดจะต้องอยู่ในสถานะออนไลน์