🤖 AI vẫn chưa thể thay thế mình đâu, bạn có thể khám phá những gì mình đang làm tại đây!

Có nên chia hai endpoint Read/Write (R/W) cho Amazon RDS?

K
Võ Cao Kỳ

2025/03/11

Amazon RDS (Relational Database Service) cung cấp khả năng mở rộng và quản lý cơ sở dữ liệu dễ dàng trên AWS. Một trong những câu hỏi phổ biến khi triển khai RDS là liệu có nên tách endpoint Read/Write (R/W) hay không? Bài viết này sẽ giúp bạn hiểu rõ lợi ích, nhược điểm và cách triển khai Read/Write Splitting cho RDS.

Read/Write Splitting là gì?

Read/Write Splitting là mô hình phân tách truy vấn đọc (SELECT) và ghi (INSERT, UPDATE, DELETE) vào các endpoint khác nhau:

  • Primary Endpoint: Nhận các truy vấn ghi (Write).
  • Read Replica Endpoint: Xử lý các truy vấn đọc (Read).

Lợi ích của việc tách Read/Write endpoint

Tăng hiệu suất đọc

  • Read replica giúp giảm tải cho Primary database.
  • Các truy vấn SELECT có thể được xử lý bởi read replica, giúp các truy vấn ghi (INSERT, UPDATE, DELETE) nhanh hơn.

Cải thiện khả năng mở rộng (Scalability)

  • Có thể thêm nhiều read replica để mở rộng khi lưu lượng truy vấn đọc tăng.
  • Primary DB chỉ tập trung xử lý ghi, giảm tình trạng bị nghẽn (bottleneck).

Tăng tính sẵn sàng (High Availability)

  • Nếu Primary DB bị lỗi, có thể chuyển đổi read replica thành master để tránh downtime.
  • Đảm bảo hệ thống luôn sẵn sàng ngay cả khi có sự cố.

Nhược điểm cần lưu ý

Độ trễ khi đồng bộ (Replication Lag)

  • Read replica có thể bị chậm so với Primary database do quá trình replication.
  • Nếu ứng dụng cần dữ liệu thời gian thực, hãy cẩn thận khi sử dụng read replica.

Tăng chi phí vận hành

  • Mỗi read replica là một instance RDS riêng, nên sẽ tốn thêm chi phí.
  • Cần cân nhắc nếu ứng dụng không có quá nhiều truy vấn đọc.

Phức tạp hơn khi triển khai

  • Cần thay đổi code để sử dụng read replica (ví dụ: routing query).
  • Cần cơ chế chuyển đổi read/write tự động để đảm bảo tính nhất quán.

Khi nào nên tách endpoint Read/Write?

  • Khi hệ thống có nhiều truy vấn đọc (SELECT) hơn ghi (INSERT/UPDATE/DELETE).
  • Khi cần tăng khả năng mở rộng (scalability) và hiệu suất.
  • Khi ứng dụng có thể chịu được độ trễ nhỏ trong việc cập nhật dữ liệu.

Khi nào KHÔNG cần tách Read/Write?

  • Khi ứng dụng có lượng truy vấn thấp, ít cần mở rộng.
  • Khi cần dữ liệu real-time, không thể chấp nhận replication lag.

Cách triển khai Read/Write Splitting

Ví dụ: Trong Laravel với MySQL RDS

index.php
'mysql' => [
    'read' => [
        'host' => [
            '192.168.1.1',
            '196.168.1.2',
        ],
    ],
    'write' => [
        'host' => [
            '196.168.1.3',
        ],
    ],
    'sticky' => true,
    'driver' => 'mysql',
    'database' => 'database',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
],

💡 Mẹo:

Laravel sẽ tự động gửi truy vấn SELECT đến Read Replica, còn INSERT, UPDATE, DELETE sẽ vào Primary DB.

Kết luận: NÊN hay KHÔNG?

  • Nếu hệ thống của bạn có nhiều truy vấn đọc và cần mở rộng, thì nên tách R/W endpoint.
  • Nếu ứng dụng nhỏ, không có nhiều truy vấn đọc, thì chưa cần thiết.

Cảm ơn tài liệu tham khảo từ 💓


Lưu ý: Tất cả các bài viết trên blog này được viết dựa trên kinh nghiệm cá nhân và quá trình tìm hiểu của mình. Mình hy vọng chúng có thể giúp ích cho bạn trong công việc và học tập, nhưng hãy xem đây như một nguồn tham khảo thay vì hướng dẫn tuyệt đối. Công nghệ luôn thay đổi, mỗi dự án có những đặc thù riêng, vì vậy bạn nên kiểm tra, thử nghiệm và điều chỉnh cho phù hợp với nhu cầu thực tế. Nếu có góp ý hay câu hỏi, đừng ngần ngại chia sẻ nhé!

Copyright © 2025 Vo Cao Ky

Cảm ơn Nuxt.js, ShadcnUI đã giúp mình build website này.