Thông thường, khi chạy ứng dụng trên máy chủ vật lý hoặc tự dựng server bằng EC2, bạn sẽ phải tự tay cài đặt MySQL, thiết lập sao lưu, giám sát hiệu năng… khá tốn công sức và dễ gặp lỗi nếu chưa có nhiều kinh nghiệm. Vậy có cách nào triển khai cơ sở dữ liệu mà không cần lo từ khâu cài đặt cho đến backup không? Câu trả lời là có – đó chính là AWS RDS (Relational Database Service).
Trong bài viết này, chúng ta sẽ tìm hiểu RDS là gì và cách cấu hình AWS RDS từng bước, đồng thời giải thích các khái niệm quan trọng như Read Replica, Multi-AZ, Backup, cũng như cách kết nối bằng client MySQL.
Xem thêm:
Application Load Balancer (ALB) trong AWS – Bài 10
1. AWS RDS là gì?
Amazon Relational Database Service (Amazon RDS) là dịch vụ cho phép bạn triển khai và quản lý cơ sở dữ liệu quan hệ trên AWS.
Nói nôm na, thay vì bạn tự cài MySQL hay SQL Server trên máy chủ EC2 và phải cấu hình từ A đến Z, thì RDS sẽ giúp bạn triển khai và quản lý cơ sở dữ liệu một cách dễ dàng mà không cần phải lo về phần cài đặt thủ công hay quản trị hạ tầng phức tạp.
Các engine CSDL mà RDS hỗ trợ gồm:
- PostgreSQL
- MySQL
- MariaDB
- Oracle
- Microsoft SQL Server
- IBM DB2
- Amazon Aurora (cơ sở dữ liệu độc quyền của AWS)
2. Vì sao nên dùng RDS thay vì tự cài DB trên EC2?
Lý do nên sử dụng RDS thay vì tự triển khai trên EC2:
- Tự động cài đặt và cập nhật hệ điều hành.
- Tự động backup và phục hồi – có thể khôi phục về bất kỳ thời điểm nào bạn muốn.
- Có dashboard để theo dõi hiệu suất – biết được DB đang hoạt động tốt hay đang bị nghẽn.
- Read Replica: Tăng hiệu suất read mà không ảnh hưởng đến cơ sở dữ liệu chính.
- Triển khai Multi-AZ – đảm bảo hệ thống không bị downtime khi có sự cố.
- Scale up & scale down: Linh hoạt trong việc nâng cấp tài nguyên hệ thống.
3. RDS Read Replicas là gì?
Read Replica giống như một bản sao chỉ đọc của cơ sở dữ liệu chính. Nếu bạn có một ứng dụng mà nhiều user cần đọc dữ liệu cùng lúc (ví dụ: hệ thống xem bài viết, xem danh sách sản phẩm…), thì bạn nên dùng Read Replica để giảm tải cho DB chính.
Đặc điểm của Read Replica:
- Sao chép bất đồng bộ từ DB chính → nghĩa là có độ trễ nhỏ.
- Có thể tạo đến 15 bản sao tùy nhu cầu.
- Dùng cho mục đích read-only, không hỗ trợ ghi dữ liệu.
Lưu ý: Read Replica KHÔNG dùng để tăng tính sẵn sàng, chỉ giúp chia tải đọc.

4. Multi-AZ là gì? Khác gì với Read Replica?
Multi-AZ dùng để đảm bảo tính sẵn sàng (availability) của hệ thống.
- Khi bật Multi-AZ, AWS sẽ tự động tạo một DB phụ (standby) ở một vùng khác.
- DB phụ này không được sử dụng để đọc/ghi bình thường.
- Nếu DB chính gặp lỗi, AWS sẽ tự động failover sang DB phụ, giữ cho hệ thống không bị gián đoạn.

Cơ chế chuyển đổi dự phòng (Failover) với Multi-AZ:
Multi-AZ đảm bảo tính liên tục bằng cách sử dụng một tên DNS duy nhất. Khi xảy ra sự cố với cơ sở dữ liệu chính, failover tự động sẽ chuyển sang bản sao dự phòng. Đây là lựa chọn tối ưu cho các yêu cầu về phục hồi sau thảm họa (Disaster Recovery), nhưng không giúp mở rộng lưu lượng đọc, vì bản sao dự phòng chỉ được sử dụng trong trường hợp khẩn cấp.

5. Chi phí khi dùng Read Replica
Với RDS, bạn sẽ không mất phí mạng khi dữ liệu được truyền giữa các AZ trong cùng một region. Tuy nhiên, nếu sử dụng Read Replica giữa các region khác nhau, sẽ có chi phí mạng phát sinh.

6. Cơ chế backup và monitoring của RDS
6.1. Tự động sao lưu
AWS RDS hỗ trợ tính năng automated backup, giúp bạn yên tâm nếu chẳng may dữ liệu bị lỗi hoặc bị xóa nhầm.
- Backup hàng ngày được thực hiện trong khung giờ bạn chỉ định.
- Ghi lại transaction logs mỗi 5 phút.
- Cho phép bạn khôi phục về bất kỳ thời điểm nào trong vòng 1–35 ngày (có thể chọn thời gian lưu giữ).
6.2. Snapshot thủ công
- Snapshot thủ công sẽ không bị xóa tự động.
- Dùng snapshot để giảm chi phí nếu bạn không cần dùng DB liên tục.
- Ví dụ: nếu mỗi tháng bạn chỉ cần chạy DB vài giờ → có thể xóa DB, giữ lại snapshot, khi cần thì khôi phục lại.
7. Hướng dẫn tạo database trên Amazon RDS
Mô hình triển khai:

7.1. Chuẩn bị các thành phần Network
- Tạo Virtual Private Cloud (VPC)
- Tạo Subnets multiple Availability Zones
- Tạo Security Group cho Amazon EC2 instances
- Tạo Security Group cho Amazon RDS DB instances
- Tạo DB Subnet Group cho Amazon RDS
Create a Virtual Private Cloud (VPC)
- Đăng nhập vào AWS Management Console tại: https://console.aws.amazon.com/vpc/
- Trong Amazon VPC Console, chọn Create VPC.
- Trong phần Resources to create, chọn VPC and more để tạo toàn bộ môi trường VPC.
- Cấu hình VPC:
- Name tag auto-generation: tuỳ chọn bật/tắt (nếu bật, hệ thống tự tạo tên tài nguyên).
- IPv4 CIDR block:
10.0.0.0/16 - IPv6 CIDR block (tuỳ chọn): No IPv6 CIDR block.
- Tenancy: chọn Default (khuyến nghị để tiết kiệm chi phí).
- Number of Availability Zones: chọn ít nhất 2 AZs.
- Number of public subnets: chọn số lượng subnet công khai bạn cần (VD: 2).
- Number of private subnets: chọn số lượng subnet riêng (VD: 2, dùng cho RDS).
- NAT gateways: None.
- VPC endpoints: chọn S3 Gateway nếu bạn muốn truy cập S3 nội bộ mà không cần Internet.
- DNS options: giữ nguyên mặc định (DNS resolution + DNS hostname: enabled).
- Xem lại cấu hình trong phần Preview, sau đó chọn Create VPC để triển khai.





Create Security Group for Amazon EC2 instances
- Truy cập EC2 Console → Security Groups → Create security group.
- Cấu hình:
- Name:
ec2-sg - Description: Security group for EC2
- VPC: chọn VPC vừa tạo
- Name:
- Thêm các inbound rules: 80, 443, 22, TCP/5000.
- Tạo security group.




Create Security Group for Amazon RDS DB instances
- Truy cập EC2 Console → Security Groups → Create security group.
- Cấu hình:
- Name:
rds-sg - Description: Security group for RDS
- VPC: chọn VPC đã tạo
- Name:
- Thêm inbound rule:
- Type: MySQL/Aurora (port 3306)
- Source: Chọn security group ID của EC2 instances muốn kết nối tới database
- Tạo security group.

Create DB Subnet Group for Amazon RDS
- Truy cập RDS Console → Subnet groups → Create DB subnet group.
- Cấu hình:
- Name:
my-db-subnet-group - Description: Subnet group for RDS
- VPC: chọn VPC vừa tạo
- Availability Zones: chọn ít nhất 2 AZ
- Subnets: chọn private subnets đã tạo
- Name:
- Nhấn Create để hoàn tất.



7.2. Tạo EC2 Instance (Amazon Linux)
Bước 1: Truy cập EC2 Console
- Mở: https://console.aws.amazon.com/ec2/
- Nhấn Launch instance → chọn Launch instance
Bước 2: Cấu hình cơ bản
| Mục | Cấu hình khuyến nghị |
|---|---|
| Name | web-server-demo |
| AMI | Amazon Linux 2023 (Free tier eligible) |
| Instance type | t2.micro |
| Key pair | Chọn key đã tạo |
| Security Group | chọn security group đã tạo ở phần trước |
Bước 3: Mạng & IP
- Subnet: Chọn subnet công khai (Public subnet)
- Auto-assign Public IP: Bật
Bước 4: Khởi tạo & kiểm tra
- Nhấn Launch instance
- Chọn View all instances
- Chờ trạng thái
runningvà kiểm tra Public IPv4 DNS - Instance sẵn sàng khi pass status checks






7.3. Tạo RDS DB Instance
Bước 1:Tạo Cơ sở dữ liệu
- Truy cập: https://console.aws.amazon.com/rds/
- Trong menu trái chọn Databases → Create database
- Chọn Standard create
Bước 2: Chọn Engine
- Engine type: Chọn MySQL
- Chọn Phiên bản (version) tương ứng
Bước 3: Chọn Template
- Chọn: Free Tier
- DB Instance Identifier:
db-instance
Bước 4: Cài đặt thông tin đăng nhập
- Mở phần Credential settings
- Bỏ chọn “Auto generate password” nếu muốn đặt mật khẩu thủ công
- Đặt Master username và Master password
Bước 5: Cấu hình kết nối mạng
- Trong phần Connectivity:
- Chọn Connect to an EC2 compute resource
- EC2 Instance:
web-server-demo - Chọn VPC, subnet group (nên là private subnet)
- Chọn Security group:
my-db-subnet-group














7.4. Application Deployment
# Install MySQL Community repository
sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
sudo dnf install -y mysql80-community-release-el9-1.noarch.rpm
# Install MySQL server
sudo dnf install -y mysql-community-server --nogpgcheck
# Start MySQL server
sudo systemctl start mysqld
# Enable MySQL to start on boot
sudo systemctl enable mysqld
# Check MySQL version
mysql -V
# Connect to MySQL and create a new database (you might want to add specific SQL commands here)
mysql -h $DB_HOST -P 3306 -u $DB_USER -p
# Example: mysql -h first-cloud-db-instance.cnk2iquwom9q.ap-southeast-1.rds.amazonaws.com -P 3306 -u admin -p
CREATE DATABASE IF NOT EXISTS first_cloud_users;
USE first_cloud_users;
CREATE TABLE `user`
(
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`first_name` VARCHAR(45) NOT NULL,
`last_name` VARCHAR(45) NOT NULL,
`email` VARCHAR(100) NOT NULL UNIQUE,
`phone` VARCHAR(15) NOT NULL,
`comments` TEXT NOT NULL,
`status` ENUM('active', 'inactive') NOT NULL DEFAULT 'active'
) ENGINE = InnoDB;
INSERT INTO `user`
(`first_name`, `last_name`, `email`, `phone`, `comments`, `status`)
VALUES
('Amanda', 'Nunes', 'anunes@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Alexander', 'Volkanovski', 'avolkanovski@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Khabib', 'Nurmagomedov', 'knurmagomedov@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Kamaru', 'Usman', 'kusman@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Israel', 'Adesanya', 'iadesanya@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Henry', 'Cejudo', 'hcejudo@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Valentina', 'Shevchenko', 'vshevchenko@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Tyron', 'Woodley', 'twoodley@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Rose', 'Namajunas', 'rnamajunas@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Tony', 'Ferguson', 'tferguson@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Jorge', 'Masvidal', 'jmasvidal@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Nate', 'Diaz', 'ndiaz@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Conor', 'McGregor', 'cmcGregor@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Cris', 'Cyborg', 'ccyborg@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Tecia', 'Torres', 'ttorres@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Ronda', 'Rousey', 'rrousey@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Holly', 'Holm', 'hholm@ufc.com', '012345 678910', 'I love AWS FCJ', 'active'),
('Joanna', 'Jedrzejczyk', 'jjedrzejczyk@ufc.com', '012345 678910', 'I love AWS FCJ', 'active');
SHOW DATABASES;
USE database_name;
SHOW TABLES;
SHOW TABLES;
DESCRIBE table_name;
#update he thong
sudo dnf update -y
#install git
sudo dnf search git
sudo dnf install git -y
#check version
git --version
git clone https://github.com/ttnguyenblog/aws-rds.git
sudo su
cd aws-rds
# Check if NVM is installed
if ! command -v nvm &> /dev/null; then
# Step 1: Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.nvm/nvm.sh
fi
# Verify nvm installation
nvm --version
# Install the LTS version of Node.js
nvm install --lts
# Use the installed LTS version
nvm use --lts
# Verify Node.js and npm installation
node -v
npm -v
# Step 4: Create package.json file (if it doesn't exist yet)
if [ ! -f package.json ]; then
npm init -y
echo -e **${GREEN}Created file package.json.${NC}**
fi
#Step 5: Install necessary npm packages
echo -e **Installing required npm packages...**
npm install express dotenv express-handlebars body-parser mysql
#Step 6: Install nodemon as a development dependency
echo -e **Installing nodemon as a development dependency...**
npm install --save-dev nodemon
npm install -g nodemon
# Step 7: Add npm start script to package.json
if ! grep -q '**start**:' package.json; then
npm set-script start **index.js** # Replace **your-app.js** with your entry point file
echo -e **${GREEN}Added npm start script to package.json.${NC}**
fi
echo -e **${GREEN}Installation completed. You can now start building and running your Node.js application using 'npm start'.${NC}**
#Config file .env
vi .env
DB_HOST=Endpoint RDS
DB_NAME=Database Name
DB_USER=admin
DB_PASS='Password DB'
# DB_HOST=first-cloud-db-instance.cnk2iquwom9q.ap-southeast-1.rds.amazonaws.com
# DB_NAME=first_cloud_users
# DB_USER=admin
# DB_PASS='Password DB'
# Run app
npm start
#Test the application in the browser
http://<ip>:5000
8. Cách lựa chọn Single-AZ instance, Multi-AZ instance, or Multi-AZ database cluster
Khi tạo 1 RDS Mysql hoặc PostgreSQL chúng ta có 2 lựa chọn Deployment:
- Single-AZ instance
- Multi-AZ DB instance deployment (2 instances)
- Multi-AZ DB cluster deployment (3 instances)
Vậy đâu là lựa chọn tốt?
Single-AZ Instance
Đặc điểm:
- Chạy trên một instance duy nhất với Amazon EBS storage
- Không có standby instance → không thể failover khi AZ gặp sự cố
- RPO: khoảng 5 phút (dựa trên việc sao lưu transaction logs lên S3)
- RTO: từ vài phút đến vài giờ
- Phù hợp với: Môi trường development/testing, không yêu cầu high availability
Multi-AZ Instance
Đặc điểm:
- Có 2 instance: primary (phục vụ read/write) và standby (passive, không phục vụ traffic)
- Sao chép đồng bộ (synchronous replication)
- RPO: 0 (không mất dữ liệu khi failover)
- RTO: 1-2 phút cho automatic failover
- Backup được thực hiện từ standby instance
- Phù hợp với: Ứng dụng mission-critical cần high availability với RTO/RPO thấp
Multi-AZ DB Cluster (Mới nhất)
Đặc điểm nổi bật:
- Có 3 instance: 1 primary writer + 2 readable standby instances
- Sử dụng local NVMe SSD cho hiệu suất cao
- Semi-synchronous replication với cơ chế quorum (2 trong 3)
- Commit latency nhanh gấp 2 lần so với Multi-AZ instance
- Failover time: 25-75 giây (nhanh hơn Multi-AZ instance)
- Standby instances có thể phục vụ read traffic
Ưu điểm:
- Latency thấp hơn nhờ ghi vào local storage trước
- Khả năng chịu lỗi cao hơn với 2 standby instances
- Hỗ trợ read scalability
- Chỉ hỗ trợ MySQL và PostgreSQL
Khuyến Nghị Lựa Chọn
- Single-AZ: Dev/test environments
- Multi-AZ Instance: Production apps cần HA nhưng không cần read scaling
- Multi-AZ Cluster: Mission-critical apps cần HA + read scalability + performance cao nhất
- Multi-AZ DB Cluster được AWS khuyến nghị cho các ứng dụng quan trọng nhờ kết hợp được cả high availability và read scalability với hiệu suất vượt trội.
Cảm ơn bạn đã tham khảo AWS Certified Solutions Architect Associate trên ttnguyen.net.
Tài liệu tham khảo:
https://aws.amazon.com/vi/blogs/database/choose-the-right-amazon-rds-deployment-option-single-az-instance-multi-az-instance-or-multi-az-database-cluster/
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.MultiAZSingleStandby.html
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts.html