Deploying Amazon RDS Multi-AZ and Read Replica, Simulate Failover

Deploying Amazon RDS Multi-AZ and Read Replica, Simulate Failover

avatar

Phong Nguyen

2024.06.12

Lab này hướng dẫn bạn các bước để khởi chạy Amazon Aurora RDS DB instance with multi-AZ enabled. Sau đó cũng sẽ mô phỏng quá trình failover cơ sở dữ liệu từ AZ này sang AZ khác.

Lab Introduction

  • AWS experience: Intermediate
  • Time to complete: 1 hour 30 minutes
  • AWS Region: US East (N. Virginia) us-east-1
  • Cost to complete: ~0.01$
  • Services used: Amazon RDS

What is Amazon RDS?

Amazon RDS

  1. Amazon RDS là một Relational Database service cung cấp tính sẵn sàng và thông lượng cao.
  2. RDS có tính năng Multi-AZRead Replica để chắc chắn data không bị mất.
  3. RDS cũng cung cấp khả năng mở rộng cao, bạn có thể mở rộng quy mô và thu nhỏ tùy theo nhu cầu của mình.
  4. RDS cung cấp các database engines quen thuộc như: MySQL, Amazon Aurora, PostgreSQL, MariaDB, Oracle Database and SQL Server.

Multi-AZ

  1. Multi-Availability zone (Multi-AZ) là tính năng của RDS cung cấp khả năng failover đảm bảo tính sẵn sàng cao của DB.
  2. Khi triển khai DB Multi-AZ, Nó sẽ tạo cho bạn 1 Primary DB instance và standby instances trên AZ khác và có cơ chế đồng bộ dữ liệu từ primary sang secondary. Chúng ta sẽ không thao tác được đến standby, Nó chỉ được sử dụng trong trường hợp Failover xảy ra.
  3. Stanby không được nhìn thấy ở giao diện Console, tuy nhiên tại tab configure khi click vào master thì có thể biết được standby đang ở AZ nào.
  4. Mục đích chính của Multi-AZ là cung cấp tùy chọn chuyển đổi dự phòng cho primary RDS instances.
  5. Amazon RDS sử dụng cơ chế Failover cho các phiên bản Oracle, MYSQL, MariaDB và PostgreSQL.
  6. Quá trình chuyển đổi dự phòng RDS diễn ra tự động và được quản lý bởi AWS mà không cần sự can thiệp của con người.
  7. Triển khai Multi-AZ phù hợp cho môi trường production, tuy nhiên nếu là môi trường dev, hãy cân nhắc yếu tố chi phí vì so với single AZ thì Multi AZ có chi phí gấp đôi.

Reasons for Failover

  • Quá trình chuyển đổi dự phòng sẽ diễn ra do một trong những lý do sau:
    • Host Failure 
    • DB instance class modification.
    • Instance rebooting
    • Availability zone failure
    • RDS maintenance

Amazon Aurora and Read Replica

  • Amazon Aurora hơi khác so với các loại DB phía trên
  • Hiệu suất cao: Aurora cung cấp tốc độ nhanh gấp 5 lần so với MySQL Standard và nhanh gấp 3 lần so với PostgreSQL Standard. Nó sử dụng một kiến trúc lưu trữ độc đáo được thiết kế để tối ưu hóa hiệu suất đọc và ghi.
  • Khả năng mở rộng: Aurora tự động mở rộng dung lượng lưu trữ lên đến 128 terabyte mỗi cơ sở dữ liệu mà không làm gián đoạn hoạt động của ứng dụng. Nó cũng cho phép mở rộng quy mô đọc bằng cách thêm tối đa 15 read replicas, có thể phục vụ hàng triệu yêu cầu đọc mỗi giây.
  • Độ tin cậy và tính sẵn sàng cao: Aurora maintains 6 bản copy data trên 3 AZs
  • Tính tương thích: Amazon Aurora hỗ trợ cả MySQL và PostgreSQL, cho phép người dùng dễ dàng chuyển đổi ứng dụng hiện có mà không cần thay đổi mã nguồn.
  • Quản lý đơn giản: Là một AWS managed service, Aurora tự động xử lý các tác vụ quản lý cơ sở dữ liệu thông thường như sao lưu, vá lỗi, và cập nhật phần mềm, giúp giảm bớt gánh nặng cho các nhà quản trị hệ thống.
  • Bảo mật: Aurora cung cấp nhiều lớp bảo mật bao gồm mã hóa dữ liệu khi lưu trữ và khi truyền, quản lý truy cập bằng IAM, và tích hợp với Amazon VPC để cô lập cơ sở dữ liệu của bạn.
  • Failover được thực hiện tự động
  • Aurora cost cao hơn RDS (hơn 20%). Tuy nhiên thì hiệu suất cao hơn so với RDS.

Architecture Diagram

Task Details

  1. Create Bastion host
  2. Create an Amazon Aurora database
  3. Get Aurora (MySQL) database Endpoint
  4. Connecting the Bastion host
  5. Execute Database Operations via SSH
  6. Forcing a Failover to Test Multi-AZ
  7. Testing the Failover Condition
  8. Clean up

Prerequisites

  • An AWS account
  • SQL knowledge

1. Create Bastion host

Trong bước này, chúng ta sẽ khởi chạy một EC2 instance. EC2 này sẽ được dùng để kết nối với Amazon Aurora RDS DB sau này.

1.1 Create a Security Group for bastion host

  • Name: d-sg-cmp-bastion-host

  • Description: Allow to connect with RDS

  • VPC: Default

  • Inbound rules

    TypeProtocolPort rangeSource
    SSHTCP220.0.0.0/0
  • Outbound rules

    TypeProtocolPort rangeSource
    All trafficAllAll0.0.0.0/0
  • Tags

    Keyvalue
    Named-sg-cmp-bastion-host

1.2 Launch an EC2 Instance bastion host (cài đặt sql client để tương tác với RDS)

  • Name: d-ec2-cmp-bastion-host
  • OS: Default (Amazon Linux 2023)
  • Instance type: Default (t2.micro)
  • Key pair: Create new keypair with name: d-key-SAA-common
  • Network Setting:
    • VPC: Default
    • Subnet: us-east-1a
    • Auto-assign public IP: Enable
    • Select existing security group: d-sg-cmp-bastion-host
  • Advanced details (User data)
#!/bin/bash
# Download the MySQL repository package
wget https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm
# Install the MySQL repository package
sudo dnf install mysql80-community-release-el9-5.noarch.rpm -y
# Enable the MySQL community repository
sudo dnf repolist enabled | grep "mysql.*-community.*"
# Install MySQL
sudo dnf install mysql -y

2. Create an Amazon Aurora database

2.1 Create a Security Group Aurora database

Chúng ta sẽ tạo SG cho Db cho phép kết nối từ Bastion host.

  • Name: d-sg-cmp-rds-multi-az

  • Description: Security group for RDS Aurora

  • VPC: Default

  • Inbound rules

    TypeProtocolPort rangeSource
    MYSQL/AuroraTCP3306{d-sg-cmp-bastion-host}
  • Outbound rules

    TypeProtocolPort rangeSource
    All trafficAllAll0.0.0.0/0
  • Tags

    Keyvalue
    Named-sg-cmp-rds-multi-az

2.2 Create an Amazon Aurora database with Multi-AZ enabled

Dưới đây là các parameter setting: Các setting mình không đề cập thì để Default

  • Choose a database creation method: Standard create
  • Engine options:
    • Engine type: Aurora (MySQL Compatible)
    • Engine version: Leave it as Default
  • Templates: Dev/Test
  • Settings
    • DB Instance identifier (DB Name): d-rds-cluster-aurora-mysql
    • Master username: Ex admin
    • Credentials management: Self managed
    • Master password: Ex MyPassword1!
    • Confirm master password: Ex MyPassword1!
  • Instance configuration
    • Burstable classes (includes t classes): db.t3.medium
  • Availability & durability
    • Choose Multi-AZ deployment: Create Aurora Replica or Reader node in a different AZ
  • Connectivity:
    • Compute resource: Don’t connect to an EC2 compute resource
    • VPC: Default VPC
    • DB subnet group: default 
    • Public access: Yes (IMPORTANT)
    • Security Group: d-sg-cmp-rds-multi-az
    • RDS Proxy: Uncheck
  • Additional configuration:
    • Initial database name: mydb
    • Enable encryption: Uncheck
  • Các settings khác để default

Dưới đây là hình ảnh minh họa chi tiết

Vào Amazon RDS Console -> Create database

Click Create database button

Sẽ mất khoảng 10-15 phút để tạo cơ sở dữ liệu. Vui lòng đợi cho đến khi trạng thái cơ sở dữ liệu thay đổi từ creating to Available.

3. Get Aurora (MySQL) database Endpoint

Để connect đến RDS, chúng ta cần Endpoint

Chúng ta sẽ copy writer endpoint để thực hiện kết nối.

Chúng ta cũng để ý thấy rằng Write Instance đang ở AZ us-east-1f còn Reader instance đang ở us-east-1c

Trường hợp của mình thì endpoint như bên dưới, endpoint các bạn sẽ khác.

Master (Writer): d-rds-cluster-aurora-mysql.cluster-c0jrr52qinsk.us-east-1.rds.amazonaws.com

4. Connecting the Bastion host

Thực hiện ssh đến bastion host

5. Execute Database Operations via SSH

Chuyển sang root user sử dụng command bên dưới

sudo su

Log into the RDS instance using the below command:

mysql -h <Hostname> -u <username> -p

Thay thế hostnameusername

  • Host name : d-rds-cluster-aurora-mysql.cluster-c0jrr52qinsk.us-east-1.rds.amazonaws.com (Writer cluster endpoint mà mình đã copy ở bước trên)
  • Username : admin
  • Password : Enter MyPassword1!

Liệt kê tất cả các cơ sở dữ liệu bằng lệnh dưới đây. Bạn sẽ thấy cơ sở dữ liệu mydb đã được tạo lúc chúng ta tạo RDS Cluster.

show databases;

Bây giờ chúng ta sẽ tạo DB, tạo table, tạo một số record cho table

Create database aurora_db;
Show databases;

Sử dụng database vừa tạo

use aurora_db;

Create table có tên students

CREATE TABLE students ( subject_id INT AUTO_INCREMENT, subject_name VARCHAR(255) NOT NULL,  teacher VARCHAR(255),start_date DATE, lesson TEXT,PRIMARY KEY (subject_id));
Select * from students;
Show tables;

Insert data into the table:

INSERT INTO students(subject_name, teacher) VALUES ('AWS SAA', 'Phong Nguyen');
INSERT INTO students(subject_name, teacher) VALUES ('AWS DVA', 'Minh Bui');

Select data

Select * from students;

Các thao tác với DB hoàn tất, chúng ta sử dụng exit để log-out khỏi DB

exit;

6. Forcing a Failover to Test Multi-AZ

Ở bước này, chúng ta sẽ mô phỏng một kịch bản chuyển đổi dự phòng trong đó primary instance bị lỗi và Read replicas chỉ có quyền đọc sẽ đảm nhiệm vai trò là phiên bản chính mới.

Đợi vài phút và kết quả trông như bên dưới, lúc này thì có sự hoán đổi từ Reader sang Writer

7. Testing the Failover Condition

Ở bước này chúng ta tiếp tục kết nối đến DB (lúc này là new wrire instance) để verify xem data lúc nãy chung ta đã tạo có còn ở đó không. Bước này đảm bảo quá trình Failover diễn ra thành công và New Writer instance hoạt động như mong đợi.

  • SSH đến Bastion host

  • Log into the RDS instance using the below command:

    mysql -h <Hostname> -u <username> -p
    
  • Host name : d-rds-cluster-aurora-mysql.cluster-c0jrr52qinsk.us-east-1.rds.amazonaws.com (Writer cluster endpoint mà mình đã copy ở bước trên)

  • Username : admin

  • Password : Enter MyPassword1!

  • Kiểm tra database đã tạo trước đó

    show databases;
    
    use aurora_db;
    
    select * from students;
    

8. Clean up

  1. Terminated EC2: d-ec2-cmp-bastion-host
  2. Delete RDS Cluster
  • Delete Reader

  • Delete Writer

  • Delete Aurora Cluster

  1. Delete Security group Sau khoảng 4-5 phút khi DB delete hoàn toàn thì chúng ta sẽ delete security group
  • d-sg-cmp-rds-multi-az
  • d-sg-cmp-bastion-host