PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sự khác biệt giữa sao chép luồng và sao chép hợp lý

TL; DR :Bản sao lôgic gửi các thay đổi theo từng hàng, bản sao vật lý gửi các thay đổi khối đĩa. Sao chép lôgic sẽ tốt hơn cho một số nhiệm vụ, sao chép vật lý cho những nhiệm vụ khác.

Lưu ý rằng trong PostgreSQL 12 (hiện tại tại thời điểm cập nhật), bản sao lôgic ổn định và đáng tin cậy, nhưng khá hạn chế. Sử dụng sao chép vật lý nếu bạn đang hỏi câu hỏi này.

Sao chép truyền trực tuyến có thể được sự sao chép hợp lý. Tất cả đều hơi phức tạp.

WAL-vận chuyển so với phát trực tuyến

Có hai cách chính để gửi dữ liệu từ bản chính sang bản sao trong PostgreSQL:

  • WAL-vận chuyển hoặc lưu trữ liên tục , nơi các tệp ghi nhật ký riêng lẻ được sao chép từ pg_xlog bởi archive_command đang chạy trên tổng thể đến một số vị trí khác. Một restore_command được định cấu hình trong recovery.conf của bản sao chạy trên bản sao để tìm nạp các lưu trữ để bản sao có thể phát lại WAL.

    Đây là những gì được sử dụng để sao chép theo thời gian (PITR), được sử dụng như một phương pháp sao lưu liên tục.

    Không cần kết nối mạng trực tiếp với máy chủ chính. Việc sao chép có thể có độ trễ lâu dài, đặc biệt là không có archive_timeout bộ. Vận chuyển WAL không thể được sử dụng để sao chép đồng bộ.

  • sao chép trực tuyến , trong đó mỗi thay đổi được gửi đến một hoặc nhiều máy chủ bản sao trực tiếp qua kết nối TCP / IP khi nó xảy ra. Bản sao phải có kết nối mạng trực tiếp mà bản chính được định cấu hình trong recovery.conf của chúng của primary_conninfo tùy chọn.

    Việc sao chép truyền trực tuyến có rất ít hoặc không có độ trễ miễn là bản sao đủ nhanh để theo kịp. Nó có thể được sử dụng để sao chép đồng bộ . Bạn không thể sử dụng sao chép trực tuyến cho PITR vì vậy nó không được sử dụng nhiều để sao lưu liên tục. Nếu bạn đánh rơi một bảng trên bản chính, rất tiếc, nó cũng bị rơi trên bản sao.

Do đó, hai phương pháp có mục đích khác nhau.

Phát trực tuyến không đồng bộ so với đồng bộ

Trên hết, có đồng bộ không đồng bộ sao chép trực tuyến:

  • Trong sao chép phát trực tuyến không đồng bộ (các) bản sao được phép lùi lại sau bản chính trong thời gian khi bản chính nhanh hơn / bận hơn. Nếu bản chính gặp sự cố, bạn có thể mất dữ liệu chưa được sao chép.

    Nếu bản sao không đồng bộ nằm quá xa so với bản chính, bản sao có thể loại bỏ thông tin mà bản sao cần nếu max_wal_size (trước đây được gọi là wal_keep_segments) is too low and no slot is used, meaning you have to re-create the replica from scratch. Or the master's pg_wal (was pg_xlog) có thể làm đầy và dừng chương trình chính hoạt động cho đến khi dung lượng ổ đĩa được giải phóng nếu max_wal_size quá cao hoặc một vị trí đã được sử dụng.

  • Trong nhân rộng đồng bộ master không hoàn thành cam kết cho đến khi một bản sao xác nhận rằng nó đã nhận được giao dịch. Bạn không bao giờ mất dữ liệu nếu bản chính gặp sự cố và bạn phải thất bại trước bản sao. Master sẽ không bao giờ vứt bỏ dữ liệu mà bản sao cần hoặc lấp đầy xlog của nó và hết dung lượng đĩa vì sự chậm trễ của bản sao. Đổi lại, nó có thể khiến bản chính chậm lại hoặc thậm chí ngừng hoạt động nếu các bản sao gặp sự cố và nó luôn có một số tác động đến hiệu suất đối với bản chính do độ trễ của mạng.

    Khi có nhiều bản sao, chỉ một bản sao là đồng bộ tại một thời điểm. Xem synchronous_standby_names .

Bạn không thể vận chuyển nhật ký đồng bộ.

Bạn thực sự có thể kết hợp vận chuyển nhật ký và sao chép không đồng bộ để bảo vệ khỏi việc phải tạo lại một bản sao nếu nó bị tụt lại quá xa mà không có nguy cơ ảnh hưởng đến bản chính. Đây là cấu hình lý tưởng cho nhiều lần triển khai, kết hợp với việc giám sát xem bản sao ở sau bản chính bao xa để đảm bảo nó nằm trong giới hạn khôi phục thảm họa có thể chấp nhận được.

Hợp lý và vật lý

Trên hết đó chúng tôi có logic so với vật lý sao chép trực tuyến, như được giới thiệu trong PostgreSQL 9.4:

  • Trong sao chép trực tuyến vật lý các thay đổi được gửi ở mức gần như khối đĩa, chẳng hạn như "tại vị trí bù 14 của đĩa trang 18 của quan hệ 12311, đã ghi tuple với giá trị hex 0x2342beef1222 ....".

    Sao chép vật lý gửi mọi thứ :nội dung của mọi cơ sở dữ liệu trong cài đặt PostgreSQL, tất cả các bảng trong mọi cơ sở dữ liệu. Nó gửi các mục nhập chỉ mục, nó sẽ gửi toàn bộ dữ liệu bảng mới khi bạn VACUUM FULL , nó sẽ gửi dữ liệu cho các giao dịch đã lùi lại, v.v. Vì vậy, nó tạo ra rất nhiều "nhiễu" và gửi nhiều dữ liệu dư thừa. Nó cũng yêu cầu bản sao phải hoàn toàn giống hệt nhau, vì vậy bạn không thể làm bất cứ điều gì yêu cầu giao dịch, như tạo bảng tạm thời hoặc đã mở khóa. Truy vấn bản sao làm chậm quá trình sao chép, do đó, các truy vấn dài trên bản sao cần phải được hủy bỏ.

Đổi lại, thật đơn giản và hiệu quả để áp dụng các thay đổi trên bản sao và bản sao giống hệt bản chính một cách đáng tin cậy. DDL được sao chép một cách minh bạch, giống như mọi thứ khác, vì vậy nó không yêu cầu xử lý đặc biệt. Nó cũng có thể truyền các giao dịch lớn khi chúng xảy ra, do đó, có rất ít độ trễ giữa cam kết trên bản chính và cam kết trên bản sao ngay cả đối với những thay đổi lớn.

Nhân rộng vật lý đã trưởng thành, được thử nghiệm tốt và được áp dụng rộng rãi.

  • sao chép luồng hợp lý , mới trong phiên bản 9.4, gửi các thay đổi ở cấp độ cao hơn và có chọn lọc hơn nhiều.

Nó chỉ sao chép một cơ sở dữ liệu tại một thời điểm. Nó chỉ gửi các thay đổi hàng và chỉ cho các giao dịch đã cam kết và nó không phải gửi dữ liệu chân không, thay đổi chỉ mục, v.v. Nó chỉ có thể gửi dữ liệu một cách chọn lọc cho một số bảng trong cơ sở dữ liệu. Điều này làm cho sự tái tạo hợp lý nhiều tiết kiệm băng thông hơn.

Hoạt động ở cấp độ cao hơn cũng có nghĩa là bạn có thể thực hiện các giao dịch trên cơ sở dữ liệu bản sao. Bạn có thể tạo bảng tạm thời và không khóa. Ngay cả những bảng bình thường, nếu bạn muốn. Bạn có thể sử dụng các trình bao bọc dữ liệu nước ngoài, các khung nhìn, tạo các hàm, bất cứ điều gì bạn thích. Không cần phải hủy các truy vấn nếu chúng chạy quá lâu.

Bản sao lôgic cũng có thể được sử dụng để xây dựng bản sao đa chủ trong PostgreSQL, điều này không thể sử dụng bản sao vật lý.

Tuy nhiên, đổi lại, nó không thể (hiện tại) phát trực tiếp các giao dịch lớn khi chúng xảy ra. Nó phải đợi cho đến khi họ cam kết. Vì vậy, có thể có một khoảng thời gian dài giữa một giao dịch lớn cam kết trên bản chính và được áp dụng cho bản sao.

Nó phát lại các giao dịch theo đúng thứ tự cam kết, vì vậy các giao dịch nhanh nhỏ có thể bị kẹt sau một giao dịch lớn và bị trì hoãn khá lâu.

DDL không được xử lý tự động. Bạn phải tự mình giữ các định nghĩa bảng đồng bộ giữa bản chính và bản sao, hoặc ứng dụng sử dụng bản sao hợp lý phải có các phương tiện riêng để thực hiện việc này. Có thể phức tạp để làm được điều này đúng.

Quá trình áp dụng bản thân nó phức tạp hơn là "viết một số byte ở nơi tôi được yêu cầu". Nó cũng chiếm nhiều tài nguyên hơn trên bản sao so với bản sao vật lý.

Các triển khai sao chép lôgic hiện tại chưa hoàn thiện hoặc chưa được áp dụng rộng rãi, hoặc đặc biệt dễ sử dụng.

Quá nhiều lựa chọn, hãy cho tôi biết phải làm gì

Phù. Phức tạp hả? Và tôi thậm chí còn chưa biết chi tiết về việc sao chép bị trì hoãn, các vị trí, max_wal_size , tiến trình, cách hoạt động của quảng cáo, Postgres-XL, BDR và ​​multimaster, v.v.

Vì vậy, bạn nên làm gì ?

Không có câu trả lời đúng duy nhất. Nếu không thì PostgreSQL sẽ chỉ hỗ trợ một cách đó. Nhưng có một số trường hợp sử dụng phổ biến:

Để sao lưu và khôi phục thảm họa sử dụng pgbarman để tạo bản sao lưu cơ sở và giữ lại WAL cho bạn, giúp dễ dàng quản lý sao lưu liên tục. Bạn vẫn nên sử dụng pg_dump định kỳ sao lưu như một bảo hiểm bổ sung.

Để có tính khả dụng cao với rủi ro mất dữ liệu bằng không sử dụng sao chép đồng bộ trực tuyến.

Để có tính khả dụng cao với rủi ro mất dữ liệu thấp và hiệu suất tốt hơn bạn nên sử dụng sao chép luồng không đồng bộ. Đã bật tính năng lưu trữ WAL cho dự phòng hoặc sử dụng vị trí sao chép. Theo dõi khoảng cách bản sao đi sau bản chính bằng các công cụ bên ngoài như Icinga.

Tài liệu tham khảo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra xem một dịch vụ mà tôi không biết tên có đang chạy trên Ubuntu hay không

  2. postgresql làm cho khóa chính hiện có tự động tăng lên khi chèn

  3. Làm thế nào để trả về các loại bảng tùy chỉnh từ Npgsql và các thủ tục được lưu trữ?

  4. Sự khác biệt về ngày của PostgreSQL

  5. [Video] Giới thiệu về các kiểu dữ liệu JSON trong PostgreSQL