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

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

RUK-COM PAAS / DATABASES

คู่มือ Galera Cluster Recovery สำหรับ ฐานข้อมูล

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

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

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

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

ข้อจำกัดและการกู้คืนคลัสเตอร์ Galera

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

ข้อจำกัดของคลัสเตอร์ Galera

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

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

  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)

พารามิเตอร์การทดลอง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ในตัวอย่างด้านล่าง):

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 นี้

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

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

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

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

  2. ตรวจสอบมูลค่าของsafe_to_bootstrapพารามิเตอร์ใน/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 ที่มีหมายเลขธุรกรรมสูงสุดหลังจากที่คลัสเตอร์ล้มเหลวในกรณีนี้คุณสามารถตั้งค่าได้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 ทั้งหมดจะต้องอยู่ในสถานะออนไลน์