Bài viết thuộc series: Xây dựng hạ tầng phục vụ hàng triệu người dùng trên AWS
Giới thiệu
Ở bài trước chúng ta đã xây dựng hạ tầng phục vụ cho 1k người dùng. Ở bài này chúng ta sẽ mở rộng hệ thống lên 10k người dùng.
Hướng dẫn tạo lại hạ tầng ở bài trước
Hạ tầng ta đã tạo ở bài trước.
Các bạn có thể xem lại bài 1 để tạo lại hạ tầng trước đó (ở bài này ta sẽ không tạo S3), hoặc theo hướng dẫn của mình là dùng Terraform, sử dụng Terraform sẽ nhanh hơn nhiều.
Các bạn tải code ở đây Million Users. Di chuyển tới thư mục 02
. Các bạn sẽ thấy một tệp tin tên là vars.tf
, mở tệp tin đó lên và sửa lại các biến cho phù hợp với bạn. Với giá trị:
variable "ec2_keypair" {
type = string
default = "default"
}
Là tên của AWS Key Pair (tên của Key Pair các bạn tạo ở bài 0, dùng để truy cập vào EC2). Còn các giá trị còn lại là thông số của WordPress. Sau khi sửa xong thì ta chạy câu lệnh:
terraform init && terraform apply
Đợi Terraform chạy xong ta sẽ thấy kết quả sau.
alb = "wordpress-1815278234.ap-southeast-1.elb.amazonaws.com"
database = {
"endpoint" = "mysql-cluster.cluster-cz2tvtl6lcep.ap-southeast-1.rds.amazonaws.com"
"name" = "devopsvn"
"password" = "devopsvn"
"username" = "devopsvn"
}
Vấn đề với hạ tầng hiện tại
Hạ tầng hiện tại của ta sẽ rất ổn định với số lượng hàng ngàn người dùng, nhưng nếu số lượng người dùng tăng lên hàng chục ngàn thì nó bắt đầu có vấn đề. Cụ thể vấn đề sẽ xảy ra ở tầng Database, vì hiện tại ta chỉ mới áp dụng mở rộng ở tầng ứng dụng còn tầng Database thì chưa. Ví dụ ta có trường hợp sau:
Hạ tầng ta đang có một con EC2 và một con Database, số lượng người dùng bây giờ tầm vài trăm và mọi thứ vẫn bình thường.
Tiếp tục số lượng người dùng sẽ tăng lên hàng ngàn, bây giờ thì một con EC2 nó không thể chịu tải nổi, nhưng vì ta đã sử dụng AutoScaling Group nên số lượng EC2 sẽ tự động mở rộng ra. Và mọi thứ vẫn chạy tốt.
Tiếp theo số lượng người dùng tăng lên hàng chục ngàn, số lượng EC2 cũng được mở rộng theo nhưng bây giờ thì Database của ta sẽ bị quá tải, vì mỗi con EC2 nó sẽ tạo một kết nối tới Database và con Database nó không hề được cấu hình tự động mở rộng. Lúc này thì hệ thống của ta đã bị quá tải hoặc có thể là chết luôn.
Nên tiếp theo ta sẽ tiến hành mở rộng Database.
Mở rộng Database
Để mở rộng Database thì ta cũng có hai phương pháp là Vertical Scaling và Horizontal Scaling, nhưng nó sẽ không hề đơn giản như cách ta làm cho ứng dụng. Đầu tiên ta sẽ xem xét Vertical Scaling.
Vertical Scaling
Đây là phương pháp ta mở rộng Database bằng cách thêm CPU và Memory:
- Trường hợp Database triển khai ở Data Center: nếu ta cần mở rộng Database ở dưới Data Center thì ta cần liên hệ với IT của tổ chức sở hữu Data Center. Quá trình này sẽ đi qua khá nhiều bước, từ bước gửi yêu cầu cho tới bước đợi xác nhận, xong ta lại phải đợi IT làm, thường sẽ mất tầm 1 ngày cho tới vài tuần. Quá trình này rất mất thời gian và công sức
- Trường hợp Database triển khai ở Cloud: nếu Database của ta ở trên Cloud thì việc mở rộng sẽ rất đơn giản, ta chỉ cần lên Web Console của nhà cung cấp Cloud và thực hiện. Ta sẽ không mất quá nhiều thời gian, nhưng ta sẽ gặp vấn đề về chi phí. Ở trên Cloud thì Database càng mạnh sẽ càng tốn tiền, có thể gấp 2 tới 3 lần so với chi phí ở Data Center
Nên thông thường để mở rộng Database ta sẽ xem xét phương pháp Horizontal Scaling trước, nếu không còn cách nào khác thì ta mới dùng phương pháp Vertical Scaling.
Horizontal Scaling
Việc mở rộng Database bằng phương pháp Horizontal Scaling cũng không hề đơn giản, nhưng nếu bạn sử dụng Cloud thì sẽ đơn giản hơn so với tự làm ở dưới Data Center. Để mở rộng Database bằng phương pháp Horizontal Scaling ta có hai cách sau:
- Partitioning: chia một con Database lớn thành các Database nhỏ. Dữ liệu sẽ được phân bổ ở các con Database nhỏ khác nhau
- Replication: thêm các con Database phụ chỉ có chức năng Read Only, được gọi là Replica. Dữ liệu sẽ được đồng bộ từ con Database chính sang các con Database phụ
Việc lựa chọn khi nào sử dụng Partitioning hoặc Replication mình sẽ không nói ở bài này, các bạn có thể tham khảo lý thuyết CAP (Consistency, Availability & Partition Tolerance) cho Database. Và ta sẽ sử dụng Replication cho hạ tầng WordPress.
Thêm Replica cho AWS RDS
Với AWS việc mở rộng Database bằng cách Replication rất đơn giản. Truy cập AWS RDS Console ta sẽ thấy Database của ta.
Bấm vào mysql-cluster
và chọn nút Action -> Add reader.
Các bạn điền vào như sau:
- DB instance identifier điền vào mysql-instance-02
- Instance configuration -> Burstable classes -> db.t3.small
- Connectivity -> Publicly accessible
- Các lựa chọn còn lại để mặc định
Chờ AWS tạo RDS Replica.
Sau khi tạo thành công AWS RDS Replica, tiếp theo ta cần cập nhật lại WordPress để nó biết khi nào nên dùng RDS Master và khi nào nên dùng RDS Replica.
Cập nhật WordPress
Thông thường để thực hiện việc này thì ta phải tự code hoặc xài thư viện có sẵn tùy thuộc vào ngôn ngữ bạn sử dụng. Còn đối với WordPress thì ta sẽ dùng HyperDB Plugin.
Truy cập WordPress Admin bằng URL của Load Balancer và thêm đường dẫn /wp-admin
, đăng nhập và chọn phần WordPress Plugin, kiếm HyperDB và cài đặt nó.
Sau khi cài đặt xong thì Activate nó lên. Tiếp theo ta truy cập AWS EC2 Console và kiếm EC2 WordPress, bấm vào nó để xem Public IP và dùng IP đó truy cập tới EC2.
ssh -i ~/.ssh/default.pem ec2-user@13.228.23.26
Di chuyển tới thư mục /var/www/html
, tạo một tệp tin tên là db-config.php
với nội dung sau.
<?php
/**
* Register the primary server to HyperDB
*/
$wpdb->add_database(array(
'host' => 'mysql-cluster.cluster-cz2tvtl6lcep.ap-southeast-1.rds.amazonaws.com',
'user' => 'devopsvn',
'password' => 'devopsvn',
'name' => 'devopsvn',
'write' => 1,
'read' => 1,
));
$wpdb->add_database(array(
'host' => 'mysql-cluster.cluster-ro-cz2tvtl6lcep.ap-southeast-1.rds.amazonaws.com',
'user' => 'devopsvn',
'password' => 'devopsvn',
'name' => 'devopsvn',
'read' => 1,
));
Các bạn bấm vào mysql-cluster
sẽ thấy hai giá trị URL của ta ở trên.
Cuối cùng di chuyển tệp tin db.php
ở trong HyperDB Plugin ra bên ngoài wp-content/
.
sudo mv wp-content/plugins/hyperdb/db.php wp-content
Để kiểm tra thì các bạn tải lại trang vài lần và vào phần Monitoring của mysql-cluster
kiểm tra xem con mysql-instance-02
có kết nối hay không.
Nếu thấy có kết nối tới mysql-instance-02
thì ta đã cấu hình thành công. Tiếp theo để toàn bộ EC2 được tạo ra từ AutoScaling Group đều có cấu hình của HyperDB thì ta cần đóng gói con EC2 hiện tại lại thành AMI, các bạn xem lại bài 1. Các bạn nhớ tạo AMI để ta thực hành các bài tiếp theo dễ dàng hơn.
Hạ tầng hiện tại của ta sau khi tạo xong RDS Replica. Bây giờ nếu hệ thống xử lý gặp vấn đề quá tải thì ta chỉ cần thêm RDS Replica là được.
Kết luận
Vậy là ta đã tìm hiểu xong cách mở rộng kiến trúc hạ tầng để phục vụ cho hàng chục ngàn người dùng. Ở bài tiếp theo ta sẽ tìm hiểu cách mở rộng hạ tầng hiện tại để có thể phục vụ cho hàng trăm ngàn người dùng. Các bạn nhớ xóa mysql-instance-02
bằng tay và chạy terraform destroy
để xóa hạ tầng.
Tác giả Quân Huỳnh
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?