ทดลองใช้งาน Multi-AZ ด้วย RDS (MySQL) บน AWS

เมื่อ AZ ที่ Instance กำลังใช้งานอยู่นั้นเกิดความเสียหาย ฟังก์ชัน Multi-AZ ใน RDS จะสลับการทำงานจาก Instance หลักไปเป็น Sub โดยอัตโนมัติและทำให้สามารถใช้งาน RDS ต่อเนื่องได้อย่างรวดเร็วมากๆครับ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ ครั้งนี้ผมจะมาแนะนำการ ทดลองใช้งาน Multi-AZ ด้วย RDS (MySQL) เนื่องจากผมเห็นว่าฟังก์ชัน Multi-AZ ของ RDS นี้ใช้งานง่ายและมีประโยชน์มากๆ จึงนำมาเขียนลงในบทความนี้ครับ

RDS มีฟังก์ชัน Multi-AZ ที่ได้มีการพัฒนาให้มีความน่าเชื่อถือเพิ่มมากขึ้น ซึ่งผมจะมาแนะนำการใช้งานฟังก์ชัน Multi-AZ ของ RDS ในครั้งนี้ครับ ! ไปเริ่มกันเลยครับ

เป้าหมายในการทำ

ภาพรวมของ RDS MultiAZ

Multi-AZ ใน RDS
・Main และ Sub ทั้ง 2 ยูนิตทำงานพร้อมกัน
・Main และ Sub ถูกจัดวางอยู่ใน AZ ที่แยกกัน
・Main และ Sub จะทำการซิงโครไนซ์ข้อมูลอยู่เสมอ
・หากเกิดการเสียหายใน Instance Main มันจะสลับการทำงานเป็น Sub โดยอัตโนมัติ

เงื่อนไขการดำเนินการของ Failover โดยอัตโนมัติ
・AZ มีปัญหา (หยุดทำงาน)
・เกิด Error ใน DB Instance
・เปลี่ยนประเภทของ DB Instance
・เกิดปัญหาการจัดเก็บข้อมูลของ DB Instance
・การแพตช์ซอฟต์แวร์บนระบบปฏิบัติการของ DB Instance
・เริ่มต้น Failover ด้วยตนเองใน DB Instance โดยใช้ [Reboot with failover]

สิ่งที่ต้องมี

เตรียม EC2 สำหรับใช้ในการเชื่อมต่อกับ RDS โดยทำตามลิงก์ด้านล่างนี้ครับ

  • ตัวอย่างการตั้งค่า EC2 ในบทความนี้

Create Key pairs

Key pairs:tinnakorn-test

Launch instances

Name and tags

Name:tinnakorn-test

Application and OS Images (Amazon Machine Image)

Amazon Machine Image (AMI):Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(Default)

Instance type

Instance type:t3a.nano

Key pair (login)

Key pair name - required:tinnakorn-test

Network settings

Firewall (security groups)

Security group name - required:tinnakorn-test
Description - required:tinnakorn-test

Inbound security groups rules

Security group rule 1 (TCP, 22, 0.0.0.0/0)

Type:ssh ▼| Source type:My IP ▼| Source:xxx.xxx.x.xxx/32 ✕

Configure storage

1x:8GiBgp2 ▼Root volume (Default)


เมื่อสร้าง EC2 เสร็จแล้ว ให้ทำการสร้าง RDS และเชื่อมต่อจาก EC2 ไปยัง RDS เตรียมไว้โดยทำตามลิงก์ด้านล่างนี้ครับ
หมายเหตุ: ไม่ต้องทำหัวข้อ ❌ วิธีการลบ RDS เพราะว่าต้องนำ RDS ที่สร้างมาใช้ในบทความนี้ครับ

  • ตัวอย่างการสร้าง RDS ในบทความนี้

การสร้าง Security Group สำหรับใช้กับ RDS

Basic details

Security group name:tinnakorn-test-rds
Description:tinnakorn-test-rds

Inbound rules
Type Source
MYSQL/Aurora Custom ▼ ?︎ tinnakorn-test (พิมพ์ค้นหาชื่อ EC2 ที่สร้างเมื่อสักครู่นี้แล้วเลือก)
sg-abcd1234xxxxxxxxx

การสร้าง RDS

Engine options

Engine type:MySQL
Version:MySQL 8.0.28

Availability and durability

Deployment options:Multi-AZ DB instance

Settings

DB instance identifier:tinnakorn-test-rds

Credentials Settings

Master username:admin
Master password:Aws_2022
Confirm password:Aws_2022

Instance configuration

DB instance class: ◉ Burstable classes (includes t classes)
db.t3.micro ▼

Storage

Storage type:General Purpose SSD (gp2) ▼

Connectivity

Existing VPC security groups:tinnakorn-test-rds ▼(เลือก Security groups ของ RDS ที่สร้างขึ้นเมื่อสักครู่นี้)

Additional configuration

Database options

Initial database name:tinnakorn(ตั้งชื่อ Database)
ในกรณีที่ทำขั้นตอนนี้ ไม่ต้องทำการ ❌ สร้าง Database ใน Amazon Linux 2 นะครับ คือเราสามารถเข้าไปยัง Database ชื่อนี้และสร้าง Table ได้เลยครับ

เมื่อกดปุ่ม Create database ไปแล้ว รอประมาณ 10 นาที และตรวจสอบให้Multi-AZ = Yesที่หน้าจอของ Database ใน RDS (ทันทีหลังจากที่เริ่มต้นระบบไปแล้ว จะเป็นMulti-AZ = Noและเมื่อรอไปสักครู่ก็จะเปลี่ยนเป็นMulti-AZ = Yes)

Trick: ทริคการตรวจสอบการเข้าถึง MySQL พร้อมแสดงข้อมูลโดยรันคำสั่งเพียงครั้งเดียว
รันคำสั่งนี้เพื่อตรวจสอบการเชื่อมต่อ RDD (MySQL) (ก่อนรันคำสั่งนี้เปลี่ยนข้อมูลต่างๆ ให้เป็นของคุณ)

mysql -h [endpoint_rds] -u admin -p[your_password] -e "show databases;"

Output↓↓↓
ถ้าแสดงแบบนี้ก็ถือว่าเราสามารถเข้าถึง Database RDS ได้ครับ

root@ip-172-31-20-194:~

[root@ip-172-31-27-236 ~]# mysql -h tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pAws_2022 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tinnakorn          |
+--------------------+
[root@ip-172-31-20-194 ~]#

การทดสอบ Failover

ขั้นตอนนี้ผมจะทำการ Reboot เพื่อให้ RDS Main เกิดการเสียหายตามโครงสร้างรูปด้านล่างนี้ครับ

เข้ามาที่ Database RDS ของเรา มาที่มุมขวาบน คลิกที่Actions ▼และเลือกReboot

ติ๊กReboot With Failover? และคลิกปุ่มConfirm

รอประมาณ 15-30 วินาที กลับมาที่ PuTTy แล้วลองรันคำสั่งนี้ใน Amazon Linux 2 อีกครั้ง เพื่อตรวจสอบการเข้าถึง Database RDS ครับ

mysql -h [endpoint_rds] -u admin -p[your_password] -e "show databases;"

Output↓↓↓
จะเห็นว่าเกิด Error พูดง่ายๆคือ RDS Main เกิดความเสียหายจึงไม่สามารถเข้าถึง Database RDS ได้และกำลังทำการเปลี่ยนจาก Main เป็น Sub นั่นเองครับ

root@ip-172-31-20-194:~

[root@ip-172-31-20-194 ~]# mysql -h tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pAws_2022 -e "show databases;"

ERROR 2003 (HY000): Can't connect to MySQL server on 'tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com' (110)
[root@ip-172-31-20-194 ~]#

ในส่วนนี้ถ้าเราตรวจสอบไม่ทันก็ไม่เป็นไรครับ เพราะว่าถ้าตัวระบบ RDS เกิดความเสียหาย มันจะสลับการทำงานจาก Main มาเป็น Sub โดยอัตโนมัติและทำให้สามารถใช้งานต่อเนื่องได้อย่างรวดเร็วมากครับ

ในกรณีที่เราอยากตรวจสอบให้เห็น Error แบบนี้จริงๆ เราอาจจะเห็นได้แค่ชั่วพริบตาเดียวเท่านั้นครับ อย่างไรก็ตามต่อให้เราตรวจสอบด้วยวิธีนี้ได้หรือไม่ได้ก็ไม่ใช่ปัญหาครับ เพราะว่าเราสามารถเข้าไปตรวจสอบ Logs & events ได้ในขั้นตอนถัดไปครับ

การตรวจสอบ Logs & events

ต่อไปให้กลับมาที่หน้า Console RDS มาที่หัวข้อ Recent events แล้วทำการตรวจสอบ Logs & events จากหน้าที่แสดงข้อความตามรูปภาพ จะเห็นว่า RDS Main เกิด Failover ไปแล้วครับ (ระหว่างที่ดูส่วนนี้อยู่ ให้ดูรูปโครงสร้างประกอบไปด้วยครับ)

Multi-AZ instance failover started.
DB instance restarted


ถัดมาให้คลิกที่อีกหน้านึง แล้วดูที่ข้อความตามตัวอย่างได้เลยครับ (ระหว่างที่ดูส่วนนี้อยู่ ให้ดูรูปโครงสร้างประกอบไปด้วยครับ)

Multi-AZ instance failover completed
The user requested a failover of the DB instance.


จากที่ผมได้ทดลอง Failover ตั้งแต่เริ่มต้นfailover startedจนถึงfailover completedจะใช้เวลาประมาณ 30 วินาที

การตรวจสอบการเข้าถึง EndPoint จาก EC2

ตรวจสอบว่าสามารถเข้าถึง EndPoint จาก EC2 ได้โดยไม่มีการเปลี่ยนแปลง พูดง่ายๆก็คือเราสามารถใช้ EndPoint เดิมในการเชื่อมต่อไปยัง RDS ได้ เพราะว่าต่อให้เกิดการ Failover แต่ EndPoint ก็จะไม่เปลี่ยนแปลงนั่นเอง

รันคำสั่งนี้เพื่อตรวจสอบการเชื่อมต่อ RDD (MySQL) (ก่อนรันคำสั่งนี้เปลี่ยนข้อมูลต่างๆ ให้เป็นของคุณ)

mysql -h [endpoint_rds] -u admin -p[your_password] -e "show databases;"

Output↓↓↓
ถ้าแสดงแบบนี้ก็ถือว่าเราสามารถเข้าถึง Database RDS ได้ครับ

root@ip-172-31-20-194:~

[root@ip-172-31-27-236 ~]# mysql -h tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pAws_2022 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tinnakorn          |
+--------------------+
[root@ip-172-31-20-194 ~]#

การลบ AWS Resource ที่สร้างขึ้นในบทความนี้

การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ

การลบฟังก์ชันที่ได้สร้างขึ้นใน Service ต่างๆ

ลบตามขั้นตอนดังนี้:

  • Amazon RDS
    • Databases
  • Amazon EC2
    • Key Pairs
    • Instance
    • Security Groups (1.EC2 | 2.RDS)

วิธีการลบ RDS

ดูตัวอย่างการลบที่นี่: วิธีการลบ RDS

การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2

ดูตัวอย่างการลบที่นี่: การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2

สุดท้ายนี้

Snow
Forest

สิ่งที่เราได้ทำไปทั้งหมดหรือสิ่งที่เกิดขึ้นใน RDS นี้เราสามารถตรวจสอบได้แค่ใน Logs & events เท่านั้น (เราจะไม่เห็นการเปลี่ยนแปลงของตัว RDS แต่ภายในตัว RDS ได้เปลี่ยนเป็น Instance ที่มีอยู่ใน AZ อื่นโดยอัตโนมัติ)

บทความที่เกี่ยวข้อง