4 điểm bởi GN⁺ 2024-10-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • Streaming Replication của PostgreSQL là một cách hiệu quả để duy trì một hoặc nhiều bản sao gần như theo thời gian thực của DB chính trên các máy chủ standby
  • Máy chủ chính liên tục truyền các bản ghi Write-Ahead Log (WAL) tới máy chủ standby ngay khi chúng được tạo ra, giúp giảm thiểu độ trễ trong quá trình sao chép
  • Được thiết kế để cải thiện tính sẵn sàng cao và khả năng mở rộng, cho phép offload các truy vấn đọc sang máy chủ standby để giảm tải cho máy chủ chính
  • Hỗ trợ cả chế độ đồng bộ và bất đồng bộ, cho phép linh hoạt cân bằng giữa tính nhất quán dữ liệu và hiệu năng
  • Bao gồm quá trình máy chủ standby kết nối tới máy chủ chính để yêu cầu WAL streaming, sau đó áp dụng các bản ghi đã nhận vào bản sao DB của chính nó
  • So với việc chuyển log dựa trên tệp, giải pháp này mang lại failover nhanh hơn và giảm rủi ro mất dữ liệu, rất phù hợp với các môi trường phân tán về mặt địa lý

Streaming Replication hoạt động như thế nào?

  • Dữ liệu WAL được truyền liên tục theo thời gian thực từ máy chủ chính sang máy chủ standby, giúp DB trên standby luôn gần như đồng nhất với máy chủ chính
  • Nhờ đó có thể sử dụng các bản sao cho failover hoặc xử lý tác vụ đọc, giúp hệ thống mở rộng quy mô lên nhiều lần

Tệp cấu hình PostgreSQL và vị trí

  • Các tệp cấu hình PostgreSQL đóng vai trò quan trọng trong việc quản lý thiết lập và hành vi của máy chủ cơ sở dữ liệu.
    • postgresql.conf: Tệp cấu hình chính chứa hầu hết các thiết lập của máy chủ. Tùy hệ điều hành, tệp này có thể nằm ở nhiều vị trí khác nhau như /etc/postgresql/<version>/main/postgresql.conf (Debian/Ubuntu) hoặc /var/lib/pgsql/<version>/data/postgresql.conf (Red Hat/CentOS)
    • pg_hba.conf: Kiểm soát xác thực client, định nghĩa cách client kết nối tới máy chủ. Thường nằm trong cùng thư mục với postgresql.conf
    • pg_ident.conf: Được dùng để ánh xạ tên người dùng nhưng ít được sử dụng hơn
    • recovery.conf: Được dùng để cấu hình máy chủ standby trong các phiên bản trước PostgreSQL 12, nhưng từ các phiên bản sau đó nội dung đã được chuyển sang postgresql.confpostgresql.auto.conf
  • Vị trí chính xác có thể khác nhau tùy theo hệ điều hành, phương thức cài đặt và phiên bản PostgreSQL
    • Có thể dùng câu lệnh SQL SHOW config_file; để tìm vị trí các tệp này từ bên trong instance PostgreSQL

Ví dụ và cấu trúc WAL (Write Ahead Logs)

  • Có thể xem WAL bằng lệnh pg_waldump
  • Mỗi dòng đại diện cho một bản ghi WAL chứa thông tin về thao tác DB
  • Các thành phần của mỗi bản ghi:
    • rmgr: trình quản lý tài nguyên (ví dụ: Heap, Btree, Transaction)
    • len: độ dài bản ghi
    • tx: ID giao dịch
    • lsn: số thứ tự log
    • prev: LSN trước đó
    • desc: mô tả thao tác
  • Các loại thao tác có thể thấy:
    • thao tác INSERT (Heap và Btree)
    • thao tác MULTI_INSERT (Heap2)
    • giao dịch COMMIT
    • thao tác tệp (CREATE)
    • Full Page Writes (FPW)
  • Đầu ra WAL cho thấy chi tiết luồng giao dịch, thay đổi dữ liệu và hoạt động hệ thống, rất hữu ích cho việc phân tích hành vi DB, xử lý sự cố và khôi phục theo thời điểm

Cách làm việc với Docker

  • Các thiết lập quan trọng liên quan đến Streaming Replication trong postgresql.conf:
    • wal_level, max_wal_senders, max_replication_slots, hot_standby, v.v.
  • Những thành phần cần có cho ví dụ Docker Compose:
    • init-master.sh: Thiết lập PostgreSQL master cho mục đích sao chép. Tạo người dùng replication và slot, cập nhật các thiết lập liên quan đến WAL
    • init-replica.sh: Chuẩn bị replica PostgreSQL để kết nối tới master và bắt đầu sao chép. Chờ cho tới khi master sẵn sàng, sau đó thực hiện bản sao lưu cơ sở và cấu hình replica
    • start-replica.sh: Khởi động replica PostgreSQL trong container Docker. Chạy script init-replica.sh rồi khởi động PostgreSQL
    • docker-compose.yml: Định nghĩa các service master và replica, đồng thời thiết lập các biến môi trường, volume, lệnh cần thiết, v.v.
  • Sau khi cấp quyền thực thi cho các script, chạy docker-compose up -d để khởi động master và replica
  • Có thể kết nối tới master và kiểm tra trạng thái sao chép bằng pg_stat_replication
  • Có thể kết nối tới replica và kiểm tra có đang ở chế độ khôi phục hay không bằng pg_is_in_recovery()

Ý kiến của GN⁺

  • Streaming Replication có thể cải thiện đáng kể hiệu năng và khả năng phục hồi của hạ tầng cơ sở dữ liệu. Dù để chuẩn bị cho kịch bản failover hay phân tán tải đọc sang replica, cơ chế này đều giúp DB mở rộng tốt hơn và duy trì hiệu năng ổn định
  • Việc trình bày toàn bộ quy trình cấu hình và đầu ra là rất quan trọng. Nó mang lại góc nhìn tổng thể về nhiều thành phần liên quan và giúp hiểu rõ hơn điều gì đang diễn ra
  • Hiểu cách Streaming Replication hoạt động và cấu hình nó đúng cách là rất quan trọng. Hy vọng bài viết này đã làm rõ quy trình và mang lại cái nhìn sâu hơn về cách replication vận hành
  • Những sản phẩm hoặc dự án khác có chức năng tương tự gồm có Replication của MySQL hoặc Data Guard của Oracle. Các giải pháp này cũng hoạt động bằng cách truyền các thay đổi từ master sang replica, nhưng chi tiết triển khai có thể khác nhau
  • Khi sử dụng Streaming Replication, cần cân nhắc băng thông mạng và độ trễ. Việc truyền dữ liệu giữa master và replica có thể tiêu tốn đáng kể tài nguyên mạng. Khả năng mở rộng số lượng replica cũng là một yếu tố quan trọng
  • Cần đánh giá cả yêu cầu về tính nhất quán dữ liệu. Replication đồng bộ có thể ảnh hưởng đến hiệu năng ghi nhưng cung cấp tính nhất quán mạnh hơn. Replication bất đồng bộ cho hiệu năng tốt hơn nhưng có một chút khả năng mất dữ liệu

1 bình luận

 
GN⁺ 2024-10-14
Ý kiến trên Hacker News
  • Có ý kiến cho rằng bài viết này rất hay, nhưng từ góc nhìn của một lập trình viên full-stack muốn tự quản lý cơ sở dữ liệu thì vẫn thiếu các trường hợp áp dụng thực tế

    • Có câu hỏi về cách kiểm tra replica đang trễ bao lâu so với master
    • Đề xuất một cách giám sát replica là dùng một tác vụ cron đơn giản để kiểm tra trạng thái
    • Vấn đề phức tạp hơn là câu hỏi về cách chuyển sang replica khi máy chủ chính bị sập
    • Có băn khoăn nên chuyển đổi tự động hay thủ công
    • Có nghi vấn liệu có cần hai replica để tránh kịch bản split-brain hay không
    • Có câu hỏi về cách khôi phục lại trạng thái ban đầu sau khi chuyển đổi
  • Có ý kiến cho rằng giải pháp dễ nhất cho replication của PostgreSQL là Kubernetes operator

    • Ví dụ được nhắc đến là CloudNativePG
    • Giải thích rằng không chỉ cần replication mà còn cần failover, khôi phục, giám sát, tự phục hồi, backup, v.v.
    • Có câu hỏi liệu ngoài Kubernetes còn có triển khai miễn phí/mã nguồn mở nào khác không
  • Một trong những lý do để dùng Kubernetes và Helm là vì có thể giải quyết vấn đề này

    • Giải thích rằng với gói Bitnami PostgreSQL có thể cấu hình gần như mọi thứ mà không cần thiết lập thêm nhiều
    • Giải thích rằng Postgres-ha tạo proxy để xử lý sự cố một cách chuyên biệt, nhờ đó có thể failover không gián đoạn
  • Khuyến nghị StackGres cho người dùng Kubernetes

  • Cuối cùng, có ý kiến hoài nghi rằng bài viết này có vẻ được viết bởi AI