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ởiarchive_command
đang chạy trên tổng thể đến một số vị trí khác. Mộtrestore_command
được định cấu hình trongrecovery.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ủaprimary_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ộ và 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ếumax_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
- lưu trữ liên tục và PITR
- tính khả dụng cao, cân bằng tải và nhân rộng
- cài đặt sao chép
- recovery.conf
- pgbarman
- repmgr
- wiki:sao chép, phân cụm và tổng hợp kết nối