คู่มือ Galera Cluster Recovery สำหรับ Database
คู่มือนี้เรียบเรียงสำหรับ Ruk-Com PaaS หน้าจอและตัวเลือกอาจแตกต่างตามเวอร์ชันและสิทธิ์ของบัญชี
ตรวจสอบ Environment, Region, สิทธิ์บัญชี และสำรองค่าปัจจุบันก่อนดำเนินการกับระบบจริง
คำสั่ง ชื่อเมนู Parameter และค่าตัวอย่างในกรอบ Code คงรูปแบบตามระบบเพื่อให้คัดลอกและตรวจสอบได้ถูกต้อง
ข้อจำกัดและการกู้คืน Cluster Galera
คำแนะนำนี้แสดงรายการข้อจำกัดและปัญหาที่พบบ่อยที่สุดเมื่อ HostCluster MariaDB Galeraที่ Platform ปฏิบัติตามคู่มือนี้เพื่อค้นหาปัญหาที่เป็นไปได้และวิธีแก้ไขปัญหาที่เกิดขึ้นแล้ว:
- ข้อจำกัดของ Cluster Galera
- ข้อมูลจำเพาะหยุด/เริ่ม/Restart
- Node ที่มีธุรกรรมสูงสุด
- การเริ่มต้น Cluster หลังจากเกิดข้อขัดข้อง
- ความล้มเหลวของ Node เดียว
- การตรวจสอบ Cluster Galera
ข้อจำกัดของ Cluster Galera
คุณสามารถดูรายการข้อจำกัดทั้งหมดของ Cluster Galera ได้ที่เว็บไซต์อย่างเป็นทางการ.
ด้านล่างนี้เราจะเน้นสิ่งที่เกี่ยวข้องกับ Platform มากที่สุด
- ตารางทั้งหมดจะต้องมีคีย์หลัก
ตารางทั้งหมดควรมีคีย์หลัก (รองรับคีย์หลักแบบหลายคอลัมน์) ไม่รองรับการดำเนินการ 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;
- มายไอแซมตาราง
ในปัจจุบันการจำลองใช้ได้กับเครื่องมือจัดเก็บข้อมูล 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ในตัวอย่างด้านล่าง):
....
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 หลังจากเกิดข้อขัดข้อง
- ที่mysqlกระบวนการบน Node อาจหยุดทำงานหลังจาก Cluster เสียหายอาจแสดงเป็น "กำลังทำงาน" แต่คุณไม่สามารถดำเนินการตามปกติได้เช่นการสร้างการเชื่อมต่อหรือการหยุดกระบวนการด้วยวิธีมาตรฐาน (ผ่าน Script เริ่มต้น)
ดังนั้นก่อนที่จะเริ่ม Cluster ตรวจสอบให้แน่ใจว่าmysqlกระบวนการไม่ทำงานบน Node กระบวนการแฮงค์จะต้องถูกฆ่าด้วยตนเอง
-
หลังจากฆ่า.mysqlกระบวนการให้ Restart Container MySQL ทั้งหมดของคุณ
-
ตรวจสอบมูลค่าของsafe_to_bootstrapParameter ใน/var/lib/mysql/grastate.datไฟล์ - มันควรจะเป็น0.
CT-44999 /# grep safe_to_bootstrap /var/lib/mysql/grastate.dat
safe_to_bootstrap: 0
- บน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
- ต่อไปก็เริ่มต้นตามลำดับ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 ทั้งหมดจะต้องอยู่ในสถานะออนไลน์

