Trong PostgreSQL, synchronous replicationasynchronous replication là hai phương pháp chính để đồng bộ hóa dữ liệu giữa các máy chủ chính (primary) và các máy chủ phụ (replica). Cả hai phương pháp này đều giúp tăng cường tính sẵn sàng và an toàn của dữ liệu, nhưng chúng khác nhau về cách xử lý việc ghi và xác nhận dữ liệu giữa các máy chủ.

1. Asynchronous Replication (Sao chép không đồng bộ)

Khái niệm:

Trong asynchronous replication, dữ liệu được ghi vào máy chủ chính (primary), sau đó các bản sao (replica) sẽ nhận các thay đổi từ máy chủ chính khi có thời gian. Điều này có nghĩa là máy chủ chính không cần đợi phản hồi từ các bản sao trước khi xác nhận một giao dịch đã hoàn thành với người dùng.

Cơ chế hoạt động:

  • Khi một giao dịch được thực hiện, PostgreSQL sẽ ghi dữ liệu thay đổi vào bản ghi WAL (Write-Ahead Log) trên máy chủ chính.
  • Máy chủ chính xác nhận rằng giao dịch đã hoàn tất với người dùng ngay sau khi ghi vào WAL, mà không cần đợi bản sao nhận dữ liệu.
  • Bản sao sẽ đọc và áp dụng các thay đổi từ WAL của máy chủ chính trong thời gian của riêng nó.

Ưu điểm:

  • Hiệu suất cao: Do máy chủ chính không cần chờ đợi phản hồi từ các bản sao, giao dịch được hoàn tất nhanh chóng.
  • Đơn giản hơn: Cấu hình dễ dàng hơn, ít yêu cầu về tài nguyên hệ thống hơn.

Nhược điểm:

  • Mất mát dữ liệu: Trong trường hợp máy chủ chính gặp sự cố trước khi bản sao nhận được hoặc áp dụng các thay đổi từ WAL, dữ liệu có thể bị mất.
  • Chậm trễ dữ liệu: Dữ liệu trên các bản sao có thể không hoàn toàn đồng bộ với máy chủ chính tại một thời điểm nhất định, dẫn đến một khoảng thời gian chậm trễ.

Sơ đồ:

Primary       Replica
  |-------------→|
Ghi hoàn tất   Ghi sau

Cấu hình:

Để thiết lập asynchronous replication, bạn chỉ cần cấu hình tham số synchronous_commit ở chế độ mặc định (off) hoặc local.

synchronous_commit = 'off'  # Chế độ sao chép không đồng bộ

2. Synchronous Replication (Sao chép đồng bộ)

Khái niệm:

Synchronous replication đảm bảo rằng dữ liệu đã được ghi và áp dụng trên ít nhất một bản sao (hoặc nhiều bản sao tùy cấu hình) trước khi giao dịch được xác nhận hoàn thành. Điều này đảm bảo rằng không có dữ liệu nào bị mất trong trường hợp máy chủ chính gặp sự cố ngay sau khi hoàn tất giao dịch.

Cơ chế hoạt động:

  • Khi một giao dịch được thực hiện, máy chủ chính ghi các thay đổi vào WAL và sau đó gửi chúng đến các bản sao.
  • Máy chủ chính sẽ chờ phản hồi từ ít nhất một bản sao xác nhận rằng nó đã nhận và ghi dữ liệu từ WAL.
  • Chỉ khi bản sao phản hồi xác nhận, máy chủ chính mới gửi phản hồi về việc giao dịch hoàn tất cho người dùng.

Ưu điểm:

  • An toàn dữ liệu cao: Không có khả năng mất dữ liệu khi máy chủ chính gặp sự cố, vì ít nhất một bản sao đã nhận và ghi các thay đổi.
  • Tính nhất quán cao: Các bản sao luôn đồng bộ hóa với máy chủ chính tại thời điểm giao dịch hoàn tất.

Nhược điểm:

  • Hiệu suất thấp hơn: Do máy chủ chính phải đợi phản hồi từ ít nhất một bản sao trước khi hoàn tất giao dịch, điều này có thể gây ra độ trễ cho các giao dịch.
  • Yêu cầu về tài nguyên: Đòi hỏi tài nguyên hệ thống lớn hơn để đảm bảo tốc độ ghi và phản hồi nhanh giữa các máy chủ.

Sơ đồ:

Primary       Replica
  |-------------→|
  ←-------------→|
Ghi hoàn tất   Ghi trước

Cấu hình:

Để thiết lập synchronous replication, bạn cần cấu hình tham số synchronous_commit và chỉ định các bản sao đồng bộ trong synchronous_standby_names.

synchronous_commit = 'on'  # Chế độ sao chép đồng bộ
synchronous_standby_names = 'ANY 1 (replica1, replica2)'

Cấu hình này yêu cầu bất kỳ một bản sao nào (có thể là replica1 hoặc replica2) phải xác nhận dữ liệu trước khi giao dịch được xác nhận.


3. So sánh chính giữa Synchronous và Asynchronous Replication

Đặc điểmAsynchronous ReplicationSynchronous Replication
Tốc độNhanh hơnChậm hơn (do phải chờ bản sao phản hồi)
Mất mát dữ liệuCó thể mất dữ liệu nếu máy chủ chính gặp sự cốKhông mất dữ liệu
Độ trễ dữ liệu trên bản saoDữ liệu có thể không đồng bộ hoàn toànDữ liệu luôn đồng bộ hoàn toàn
Phản hồi giao dịchNgay lập tức sau khi ghi vào WALPhải đợi bản sao xác nhận

4. Khi nào nên sử dụng Asynchronous và Synchronous Replication?

  • Asynchronous replication: Thích hợp cho các hệ thống ưu tiên hiệu suất cao hơn và có thể chấp nhận một mức độ mất dữ liệu nhỏ trong trường hợp máy chủ chính gặp sự cố.
    • Ví dụ: Các ứng dụng đọc nhiều hơn ghi, nơi tính nhất quán dữ liệu không cần nghiêm ngặt.
  • Synchronous replication: Thích hợp cho các hệ thống mà tính toàn vẹn và an toàn dữ liệu là tối quan trọng, như các hệ thống tài chính hoặc ứng dụng quan trọng khác.
    • Ví dụ: Hệ thống ngân hàng, nơi không thể chấp nhận mất dữ liệu.

Kết luận:

Việc lựa chọn giữa synchronous replicationasynchronous replication phụ thuộc vào yêu cầu về hiệu suất và độ an toàn dữ liệu của bạn. Nếu tính nhất quán và an toàn dữ liệu là yếu tố ưu tiên hàng đầu, synchronous replication là sự lựa chọn tốt hơn. Ngược lại, nếu hiệu suất và tốc độ là quan trọng hơn, asynchronous replication có thể là lựa chọn phù hợp.