ทดลองใช้งาน Multi-AZ ด้วย RDS (MySQL) บน AWS
สวัสดีครับ ครั้งนี้ผมจะมาแนะนำการ ทดลองใช้งาน Multi-AZ ด้วย RDS (MySQL) เนื่องจากผมเห็นว่าฟังก์ชัน Multi-AZ ของ RDS นี้ใช้งานง่ายและมีประโยชน์มากๆ จึงนำมาเขียนลงในบทความนี้ครับ
RDS มีฟังก์ชัน Multi-AZ ที่ได้มีการพัฒนาให้มีความน่าเชื่อถือเพิ่มมากขึ้น ซึ่งผมจะมาแนะนำการใช้งานฟังก์ชัน Multi-AZ ของ RDS ในครั้งนี้ครับ ! ไปเริ่มกันเลยครับ
เป้าหมายในการทำ
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:
8
GiBgp2 ▼
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
Settings
DB instance identifier:
tinnakorn-test-rds
Credentials Settings
Master username:
admin
Master password:Aws_2022
Confirm password:Aws_2022
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
สุดท้ายนี้
สิ่งที่เราได้ทำไปทั้งหมดหรือสิ่งที่เกิดขึ้นใน RDS นี้เราสามารถตรวจสอบได้แค่ใน Logs & events เท่านั้น (เราจะไม่เห็นการเปลี่ยนแปลงของตัว RDS แต่ภายในตัว RDS ได้เปลี่ยนเป็น Instance ที่มีอยู่ใน AZ อื่นโดยอัตโนมัติ)