Bởi Yassin Abouel Seoud | vào ngày 10 tháng 11 năm 2023
Cơ sở dữ liệu khách hàng không ngừng phát triển. Khi tăng dung lượng lưu trữ cho cơ sở dữ liệu trong Amazon Relational Database Service (Amazon RDS), bạn không thể thực hiện thêm các sửa đổi về dung lượng lưu trữ trong 6 giờ hoặc cho đến khi quá trình tối ưu hóa lưu trữ hoàn tất trên instance, tùy theo thời gian nào dài hơn. Tính năng Autoscaling storage của Amazon RDS sẽ tăng dung lượng lưu trữ thêm 10 GiB, 10% dung lượng lưu trữ hiện tại được phân bổ hoặc mức tăng dung lượng lưu trữ dự đoán trong 7 giờ tiếp theo dựa trên 1 giờ vừa qua, tùy theo vào mức nào lớn nhất. Tính năng Autoscaling storage của Amazon RDS phù hợp với phần lớn cơ sở dữ liệu và kiểu sử dụng. Tuy nhiên, nếu bạn thường xuyên thực hiện tải dữ liệu lớn và tính năng Autoscaling storage không cung cấp đủ dung lượng thì cơ sở dữ liệu có thể vẫn ở trạng thái quá tải trong vài giờ. Điều này có thể gây hại cho cơ sở dữ liệu và cũng ngăn cản việc ghi và kết nối khi bộ nhớ đầy.
Trong bài viết này, chúng tôi giới thiệu cho bạn một giải pháp tự động sử dụng Amazon CloudWatch và AWS Lambda để chọn mức độ mở rộng dung lương lưu trữ phù hợp khi hết dung lượng. Bạn càng mở rộng dung lượng lưu trữ thì càng ít có khả năng hết dung lượng trong khoảng thời gian tối ưu bộ nhớ tối thiểu 6 giờ. Việc chia tỷ lệ bộ nhớ quá nhiều sẽ dẫn đến dư thừa dung lượng trống, vì vậy hãy đảm bảo bạn chọn tỷ lệ phù hợp nhất với trường hợp sử dụng và kiểu dữ liệu của bạn. Giải pháp này không thay thế tính năng Autoscaling storage mà được đặt sau tính năng Autoscaling storage dành cho những khách hàng cần mở rộng quy mô cơ sở dữ liệu của họ nhiều hơn mức tăng mặc định.
Tổng quan của giải pháp
Với giải pháp này, chúng tôi sử dụng CloudWatch để giám sát dung lượng lưu trữ trống của cơ sở dữ liệu RDS và gửi thông báo tới Amazon Simple notification Service (Amazon SNS) khi dung lượng lưu trữ trống thấp hơn mức bạn xác định. Sau đó, Amazon SNS gọi Lambda function với một sự kiện bao gồm tên của cơ sở dữ liệu trong cảnh báo dung lượng lưu trữ trống. Lambda function lấy dung lượng lưu trữ trong cơ sở dữ liệu này, thêm phần trăm dung lượng lưu trữ do người dùng chỉ định và sửa đổi cơ sở dữ liệu bằng giá trị lưu trữ mới này. Khi cơ sở dữ liệu tăng, CloudWatch Alarm sẽ trở về trạng thái OK. Nếu cơ sở dữ liệu lại vượt quá ngưỡng đặt trước của bạn, chu kỳ sẽ lặp lại vì CloudWatch Alarm sẽ quay trở lại trạng thái cảnh báo và tăng quy mô lưu trữ cho cơ sở dữ liệu một lần nữa.
Giải pháp này không cho phép bạn thực hiện sửa đổi dung lượng lưu trữ đối với cơ sở dữ liệu RDS trong khoảng 6 giờ tối ưu hoá dung lượng lưu trữ. Nó chỉ cho phép bạn chọn tỷ lệ phần trăm mở rộng lớn hơn, chẳng hạn như 20%, 30% hoặc 40%, để giảm khả năng lại hết dung lượng trong khoảng 6 giờ.
Sơ đồ sau minh họa kiến trúc giải pháp:
Trong các phần sau, chúng ta sẽ thảo luận cách thiết lập tất cả tài nguyên cần thiết cho giải pháp mở rộng quy mô lưu trữ của Amazon RDS.
Điều kiện tiên quyết
Đối với hướng dẫn này, bạn cần có các điều kiện tiên quyết sau:
- Tài khoản AWS
- Đã có cơ sở dữ liệu RDS để theo dõi và mở rộng quy mô khi cần thiết
Tạo tài nguyên với AWS CloudFormation
Chúng tôi sử dụng AWS CloudFormation template để thiết lập tài nguyên. CloudFormation stack tạo ra Lambda function, thực thi với Lambda AWS Identity and Access Management (IAM) role, SNS topic và đăng ký SNS. Thực hiện theo các hướng dẫn bên dưới hoặc xem video hướng dẫn ở cuối bài viết này.
- Tải xuống CloudFormation template (tệp YAML).
- Trên bảng điều khiển AWS CloudFormation, hãy chọn Region bạn muốn triển khai giải pháp này.
- Tạo một stack với các tài nguyên mới.
- Tải lên tệp YAML
- Nhập tên cho stack và chọn IAM role cho stack của bạn.
Nếu không có IAM role nào được chọn, AWS CloudFormation sẽ sử dụng thông tin xác thực từ người dùng hiện tại.
Tạo CloudWatch alarm
Sau khi tạo CloudFormation stack, bạn có thể tạo CloudWatch Alarm:
- Trên bảng điều khiển CloudWatch, chọn Alarm trong ngăn điều hướng.
- Chọn Create alarm.
- Nhập tên cơ sở dữ liệu vào thanh tìm kiếm, và chọn RDS > DBInstanceIdentifier.
- Chọn FreeStorageSpace làm số liệu và chọn Select Metric.
- Chọn các điều kiện để CloudWatch alarm được kích hoạt, cụ thể là cơ sở dữ liệu sẽ mở rộng tới bao nhiêu byte dung lượng trống.
Để kích hoạt CloudWatch alarm trước khi tự động kích hoạt storage autoscaling, chúng tôi khuyên bạn nên đặt cảnh báo để kích hoạt ở mức 15% tổng dung lượng lưu trữ. Nếu bạn có cơ sở dữ liệu 100 GB thì 15% trong số đó (15 GB hoặc 15.000.000.000 byte) sẽ là thời điểm cảnh báo sẽ kích hoạt mở rộng quy mô.
Lambda function sẽ tự động tăng CloudWatch alarm threshold theo tỷ lệ phần trăm tương tự như dung lượng lưu trữ cơ sở dữ liệu, để nếu cơ sở dữ liệu tăng từ 100 GB lên 200 GB thì cảnh báo sẽ kích hoạt ở mức 30 GB dung lượng lưu trữ trống thay vì 15 GB.
Bằng cách đặt dung lượng lưu trữ trống thành 15% tổng dung lượng lưu trữ cơ sở dữ liệu, nó cho phép chúng ta duy trì tính năng Amazon RDS storage autoscaling ở mức 10% dung lượng trống làm phương án dự phòng trong trường hợp giải pháp không thành công.
Nếu bạn tiếp tục bật tính năng storage autoscaling (được khuyến nghị), hãy đảm bảo tăng giá trị cho ngưỡng lưu trữ tối đa của Amazon RDS vì cơ sở dữ liệu RDS của bạn sẽ không bao giờ có thể mở rộng quy mô vượt quá mức đó ngay cả với giải pháp tự động hóa này.
- Ở bước tiếp theo, hãy chọn Select an existing SNS topic và nhập topic RDS-SNS-Storage-Scaler để thông báo khi CloudWatch alarm ở trạng thái cảnh báo
- Nhập tên cho CloudWatch Alarm và tạo nó.
Lambda function code
Với CloudWatch alarm đã được tạo, bất cứ khi nào dung lượng lưu trữ trống đạt đến mức bạn đã chọn, nó sẽ gửi thông báo đến SNS topic để gọi Lambda function. Sau đó, Lambda function sẽ tăng dung lượng lưu trữ của cơ sở dữ liệu RDS. Hãy xem chi tiết một phần của Lambda code:
import sys, botocore, boto3, json, math
def lambda_handler(event, context):
ScalingUnder1000GB = 1.2
Scaling1000GBto5000GB = 1.15
ScalingOver5000GB = 1.10
Trong dòng 3–5, chúng tôi xác định ba biến cho tỷ lệ phần trăm mà bạn có thể sửa đổi dựa trên tùy chọn của mình:
- ScalingUnder1000GB = 1.2
- Scaing1000GBto5000GB = 1.15
- ScalingOver5000GB = 1.10
Theo mặc định, Lambda function này tăng tỷ lệ lưu trữ cho cơ sở dữ liệu dưới 1.000 GB lên 20%, cơ sở dữ liệu từ 1.000–5.000 GB lên 15% và cơ sở dữ liệu trên 5.000 GB lên 10%. Tuy nhiên, bạn có thể sửa đổi các giá trị này trong Lambda function để thay đổi quy mô cơ sở dữ liệu nhỏ hơn hoặc lớn hơn. Số lượng tối thiểu để tăng quy mô lưu trữ Amazon RDS là 10%.
CloudFormation template mà chúng tôi cung cấp đủ để triển khai cho single-Region. Nếu bạn đang triển khai giải pháp này cho sequential Regions, thì bạn cần sử dụng CloudFormation template sau, nó chỉ tạo Lambda function và SNS topic. Bạn không cần tạo lại IAM role cho sequential Regions vì IAM là dịch vụ toàn cầu.
Dọn dẹp
Nếu muốn ngừng sử dụng giải pháp này để không còn mở rộng dung lượng lưu trữ cho các RDS instance, thì bạn có thể xóa CloudFormation stack, thao tác này sẽ xóa Lambda function, SNS topic, Lambda execution role và chính sách. Cuối cùng, bạn cũng phải xóa CloudWatch alarm mà bạn đã tạo.
Kết luận
Trong bài viết này, chúng tôi đã giới thiệu cho bạn giải pháp sử dụng CloudWatch alrm để liên tục giám sát dung lượng lưu trữ trống cho cơ sở dữ liệu RDS và gửi thông báo đến SNS topic khi cơ sở dữ liệu sắp hết dung lượng. Sau đó, SNS topic sẽ gọi Lambda function để tăng dung lượng lưu trữ của cơ sở dữ liệu RDS theo dung lượng bạn chọn và bạn có thể liên tục thay đổi dung lượng lưu trữ theo tỷ lệ. Bạn có thể sử dụng cùng một SNS topic và Lambda function để giám sát và mở rộng quy mô nhiều cơ sở dữ liệu bằng cách tạo một số CloudWatch alrm. Tải xuống CloudFormation template để bắt đầu với giải pháp này và thoải mái thêm nhận xét vào bài đăng này nếu có bất kỳ câu hỏi hoặc phản hồi nào.