คู่มือ Galera Cluster Recovery สำหรับ ฐานข้อมูล
คู่มือนี้เรียบเรียงสำหรับ Ruk-Com PaaS หน้าจอและตัวเลือกอาจแตกต่างตามเวอร์ชันและสิทธิ์ของบัญชี
ตรวจสอบ Environment, Region, สิทธิ์บัญชี และสำรองค่าปัจจุบันก่อนดำเนินการกับระบบจริง
คำสั่ง ชื่อเมนู พารามิเตอร์ และค่าตัวอย่างในกรอบ Code คงรูปแบบตามระบบเพื่อให้คัดลอกและตรวจสอบได้ถูกต้อง
ข้อจำกัดและการกู้คืนคลัสเตอร์ Galera
คำแนะนำนี้แสดงรายการข้อจำกัดและปัญหาที่พบบ่อยที่สุดเมื่อโฮสต์คลัสเตอร์ MariaDB Galeraที่แพลตฟอร์มปฏิบัติตามคู่มือนี้เพื่อค้นหาปัญหาที่เป็นไปได้และวิธีแก้ไขปัญหาที่เกิดขึ้นแล้ว:
- ข้อจำกัดของคลัสเตอร์ Galera
- ข้อมูลจำเพาะหยุด/เริ่ม/รีสตาร์ท
- Node ที่มีธุรกรรมสูงสุด
- การเริ่มต้นคลัสเตอร์หลังจากเกิดข้อขัดข้อง
- ความล้มเหลวของ Node เดียว
- การตรวจสอบคลัสเตอร์ Galera
ข้อจำกัดของคลัสเตอร์ Galera
คุณสามารถดูรายการข้อจำกัดทั้งหมดของคลัสเตอร์ Galera ได้ที่เว็บไซต์อย่างเป็นทางการ.
ด้านล่างนี้เราจะเน้นสิ่งที่เกี่ยวข้องกับแพลตฟอร์มมากที่สุด
- ตารางทั้งหมดจะต้องมีคีย์หลัก
ตารางทั้งหมดควรมีคีย์หลัก (รองรับคีย์หลักแบบหลายคอลัมน์) ไม่รองรับการดำเนินการ 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)
พารามิเตอร์การทดลองwsrep_replicate_myisamเพิ่มเพื่อรองรับตาราง MyISAM ลงในไฟล์กำหนดค่าแล้ว
ข้อมูลจำเพาะหยุด/เริ่ม/รีสตาร์ท
เงื่อนไขหลักในการหยุดคลัสเตอร์คือตามลำดับการปิด Node ทั้งหมดคอนเทนเนอร์สุดท้ายก็เข้ามาบูตสแตรปซึ่งหมายความว่าคลัสเตอร์จะเริ่มต้นจาก Node นี้
แพลตฟอร์มทำให้โฟลว์ดังกล่าวเป็นอัตโนมัติดังนั้นคุณไม่จำเป็นต้องดำเนินการใดๆเพิ่มเติมคุณสามารถใช้งาน Galera Cluster ได้เช่นเดียวกับ Environment ปกติอื่นๆและเริ่มต้น/หยุด/รีสตาร์ทผ่านแดชบอร์ดกิจกรรมพิเศษจะดำเนินการที่จำเป็นทั้งหมด (เช่นการถอน Node ออกจากคลัสเตอร์ตามลำดับ) ในเบื้องหลัง
เมื่อคุณรีสตาร์ทเพียง Node เดียวของคลัสเตอร์การดำเนินการจะเป็นมาตรฐาน
Node ที่มีธุรกรรมสูงสุด
ก่อนดำเนินการใดๆเราขอแนะนำให้สร้างการสำรองข้อมูลสำหรับ/var/lib/mysqlไดเร็กทอรีบนแต่ละ Node คลัสเตอร์
เมื่อดำเนินการกู้คืนคลัสเตอร์คุณจำเป็นต้องทราบ Node ที่มีหมายเลขลำดับสูงสุดของธุรกรรมครั้งล่าสุด (เนื่องจากคลัสเตอร์ควรเริ่มต้นจาก 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 ที่มีค่าพารามิเตอร์สูงสุดหาก Node ทั้งหมดหรือหลาย Node มีค่าสูงสุดเท่ากันให้เลือก Node ใด Node หนึ่ง (ควรเป็นคอนเทนเนอร์หลักของเลเยอร์)
อย่างไรก็ตามหากอย่างน้อยหนึ่ง Node มี-1ค่าคุณไม่สามารถแน่ใจได้ว่า Node มีความสอดคล้องกัน (พารามิเตอร์ถูกรีเซ็ตเป็น -1 เมื่อเริ่มบริการใหม่บนคลัสเตอร์ที่ไม่ทำงาน) ในกรณีเช่นนี้คุณจะต้องกู้คืนข้อมูลโดยเริ่มต้นmysqldกับ–wsrep-กู้คืนพารามิเตอร์:
$ 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 นี้
การเริ่มต้นคลัสเตอร์หลังจากเกิดข้อขัดข้อง
- ที่mysqlกระบวนการบน Node อาจหยุดทำงานหลังจากคลัสเตอร์เสียหายอาจแสดงเป็น "กำลังทำงาน" แต่คุณไม่สามารถดำเนินการตามปกติได้เช่นการสร้างการเชื่อมต่อหรือการหยุดกระบวนการด้วยวิธีมาตรฐาน (ผ่านสคริปต์เริ่มต้น)
ดังนั้นก่อนที่จะเริ่มคลัสเตอร์ตรวจสอบให้แน่ใจว่าmysqlกระบวนการไม่ทำงานบน Node กระบวนการแฮงค์จะต้องถูกฆ่าด้วยตนเอง
-
หลังจากฆ่า.mysqlกระบวนการให้รีสตาร์ทคอนเทนเนอร์ MySQL ทั้งหมดของคุณ
-
ตรวจสอบมูลค่าของsafe_to_bootstrapพารามิเตอร์ใน/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 ที่มีหมายเลขธุรกรรมสูงสุดหลังจากที่คลัสเตอร์ล้มเหลวในกรณีนี้คุณสามารถตั้งค่าได้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_bootstrapพารามิเตอร์ถึง0ใน/var/lib/mysql/grastate.datไฟล์
- รีสตาร์ท Node ผ่านเริ่มต้นสคริปต์
/etc/init.d/mysql restart
บันทึก:หากมีปัญหากับข้อจำกัดของคลัสเตอร์ Galera ข้อผิดพลาดอาจปรากฏขึ้นอีกครั้งหลังจากผ่านไประยะหนึ่ง
การตรวจสอบคลัสเตอร์ Galera
คุณสามารถตรวจสอบสถานะและพารามิเตอร์ต่างๆของคลัสเตอร์ได้โดยการระบุไว้ในแสดงสถานะทั่วโลกเช่นคำสั่งบน Node ใดๆของคลัสเตอร์คุณสามารถดูแง่มุมต่างๆของคลัสเตอร์ได้ทั้งนี้ขึ้นอยู่กับค่าที่ให้มาตัวอย่างเช่น:
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 |
+ --------------------------- + -------- +
หากคลัสเตอร์ของคุณรวมพร็อกซี 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 ทั้งหมดจะต้องอยู่ในสถานะออนไลน์

