Truyền trực tuyến PostgreSQL so với sao chép dựa trên tệp (Về mặt hành vi và cấu hình máy chủ)


8

Tôi đang cố gắng hiểu cách sử dụng tốt nhất sao chép PostgreSQL và cách thức hoạt động để tôi có thể khắc phục sự cố trong môi trường sản xuất.

Tôi đang gặp khó khăn để hiểu sự khác biệt giữa 2 loại sao chép này về mặt (1) Cấu hình (2) Cách 2 máy chủ Master / Slave thực hiện trong mỗi kịch bản

Bản sao trên PostgreSQL (9.2+) về cơ bản là các tệp XLOG có kích thước 16 MB (tùy thuộc vào cài đặt tần số để tạo từng tệp) đang được tạo trên Master và được gửi bằng phương thức nào đó tới Slave.

Thiết lập của tôi (cho mục đích của câu hỏi này)

Cấu hình của Postgresql.conf trên Master
archive_command = 'rsync -av% p postgres @ [SlaveIP]: [wal_archive_folder] /% f'

Cấu hình của Recovery.conf trên Slave để đọc tệp nhật ký
restore_command = 'cp [wal_archive_folder] /% f \ "% p \"'
primary_conninfo = 'host = [MasterIP] port = 5432 user = postgres'

Câu hỏi của tôi là phần nào của cấu hình này làm cho bản sao "phát trực tuyến" này so với "vận chuyển nhật ký"? Master của tôi được cấu hình để sử dụng rsync để gửi nhật ký đến nô lệ (đây có phải là nhật ký vận chuyển không?) Slave của tôi được cấu hình để có thể kết nối với chủ trong recovery.conf (đây có phải là luồng không?)

Phần thứ hai của câu hỏi: Chuyện gì đang xảy ra? Tôi hiểu rằng có một giao thức khác trên PostgreSQL thông qua WAL_sender & WAL_receiver. Nhưng tôi không rõ nếu điều này chỉ được sử dụng để phát trực tuyến và nếu vậy, rsync được sử dụng trong Master như thế nào?

:) Cảm ơn bạn!! Và xin lỗi nếu đây là một câu hỏi rõ ràng. Tôi đã làm một loạt các blog / sách đọc nhưng có một thời gian khó hiểu. Wiki Postgres có chiều sâu đến nỗi phải mất một thời gian dài để vượt qua tất cả (và tôi có thời hạn)


Wiki có xu hướng khá lỗi thời, cũng như chuyên sâu. Nó thường chứa đầy các tài liệu hướng tới phát triển và thiết kế tính năng. Hướng dẫn sử dụng chính thường là một tài nguyên tốt hơn cho những thứ như thế này.
Craig Ringer

Câu trả lời:


17

"Sao chép phát trực tuyến" đề cập đến việc gửi liên tục các bản ghi WAL qua kết nối TCP / IP giữa bản gốc và bản sao, sử dụng giao thức walsender qua các replicationkết nối. Bậc thầy đọc WAL của chính nó pg_xlogvà gửi nó đến bản sao theo yêu cầu. Nó được cấu hình với một lệnh primary_conninfotrong recovery.confpg_hba.confcác mục trên bản gốc để cho phép replicationkết nối. Bạn cũng cần wal_keep_segmentsvà một số tùy chọn khác được đề cập trong các tài liệu.

"Vận chuyển nhật ký" đề cập đến việc gửi các bản ghi WAL định kỳ dưới dạng toàn bộ lưu trữ WAL thông qua giao thức truyền tệp đến một vị trí lưu trữ mà từ đó bản sao có thể tìm nạp chúng. Nó được cấu hình với một lệnh restore_commandtrong recovery.confvà một archive_commandtrong tổng thể. PostgreSQL không quan tâm các tệp đang ở đâu hoặc chúng được chuyển như thế nào, chỉ có điều archive_commandchúng đặt chúng ở đó và restore_commandtìm nạp kho lưu trữ được yêu cầu; điều này cho phép xây dựng các hệ thống như PGBarman và WAL-E.

Sao chép phát trực tuyến không có nhiều độ trễ, vì các bản ghi được gửi khi chúng được tạo. Tuy nhiên, nó đòi hỏi cả chủ và bản sao phải trực tuyến và có thể giao tiếp trực tiếp. Nó cũng yêu cầu bản sao phải đủ tốt để chủ vẫn có các bản sao trên đĩa của WAL mà bản sao cần và thường yêu cầu bạn dành thêm pg_xlogkhông gian để giữ lại WAL cho bản sao.

Bản sao vận chuyển bản ghi có độ trễ nhiều hơn vì bản sao chỉ nhìn thấy WAL sau khi toàn bộ kho lưu trữ được gửi. Tuy nhiên, nó có thể hoạt động ngay cả khi bản gốc và bản sao không thể giao tiếp trực tiếp qua TCP / IP bằng cách sử dụng vị trí lưu trữ được chia sẻ. Nó vẫn tiếp tục hoạt động ngay cả khi bản sao bị hỏng trong một thời gian, bởi vì chủ nhân sẽ loại bỏ WAL pg_xlogchỉ sau khi lưu trữ nó, vì vậy WAL vẫn còn trong kho lưu trữ và có thể sử dụng được bởi bản sao mặc dù chủ không thể gửi nó bằng cách truyền phát nữa. Lưu ý rằng archive_commandkhông bao giờ bỏ cuộc, vì vậy pg_xlogcó thể lấp đầy nếu việc lưu trữ không thành công; vì lý do đó, tốt hơn là lưu trữ đến một vị trí đáng tin cậy và sau đó có máy chủ bản sao tìm nạp từ vị trí đó.

Nói chung, bạn thực sự kết hợp cả hai, tức là sử dụng cả hai. Trong trường hợp đó, sao chép phát trực tuyến được sử dụng khi mọi thứ đều ổn. Nếu bản sao bị bỏ lại quá xa và chủ đã loại bỏ các xlog mà nó yêu cầu, một vấn đề kết nối sẽ phát sinh, v.v., thì bản sao sẽ chuyển sang đọc WAL lưu trữ cho đến khi bắt kịp. Nó sẽ định kỳ thử lại chuyển sang phát lại cho đến khi thành công.

Nếu bạn chỉ sử dụng một, hãy sử dụng vận chuyển nhật ký, vì sao chép phát trực tuyến mà không có dự phòng vận chuyển nhật ký là (cho đến khi PostgreQuery 9.4) có khả năng bị trễ sao chép gây ra lỗi không thể tạo lại bản sao.


PostgreQuery 9.4 thay đổi điều này một chút, vì sao chép phát trực tuyến hiện có thể sử dụng "vị trí sao chép". Điều đó cho phép chủ theo dõi số lượng bản sao WAL cần, và tránh vứt nó đi cho đến khi bản sao được phát lại. Vì vậy, không cần thêm nữa wal_keep_segmentsnếu bạn sử dụng vị trí sao chép (không phải mặc định).

Xem bài viết của tôi phát trực tuyến các vị trí sao chép trong PostgreQuery 9.4 .

9.4 cũng giới thiệu các nền tảng để phát trực tuyến sao chép logic , đây là một cơ chế khác , được thiết kế để sử dụng cho các hệ thống sao chép logic như Londiste, Slony-I và tính năng sao chép đa chủ không đồng bộ hai chiều mới .


Rất hữu ích, tôi tự hỏi nếu bạn nghĩ bài viết này: blog.amd.co.at/coat/2009/05/ chủ đề với câu hỏi của tôi. Tôi đã được thông báo "vận chuyển log ổn định hơn" và bài viết này dường như chia sẻ ý kiến ​​đó.
Dina

1
@Dina Ít nhất đã lỗi thời, ví dụ: Vận chuyển nhật ký có một nhược điểm là các máy chủ nô lệ không thể được sử dụng cho các truy vấn miễn là hiện tại chúng đang sao chép dữ liệu . Họ có thể thực hiện các truy vấn chỉ đọc nếu ở hot_standbychế độ. Ngoài ra, truyền phát và ghi nhật ký vận chuyển đều sử dụng WAL, chúng chỉ là những cách khác nhau để chuyển nó. Bạn có thể và nên sử dụng nhật ký vận chuyển để bổ sung sao chép phát trực tuyến. Nhìn chung, bài viết là OK nhưng không đặc biệt khai sáng và một chút lỗi thời; các tài liệu chính thức là một nguồn tài nguyên tốt hơn.
Craig Ringer

Câu trả lời rất hữu ích Chris, vì vậy bài viết của bạn ( blog.2ndquadrant.com/postgresql-9-4-slots )
Max L.

@Dina nếu một khi bạn được thiết lập sao chép phát trực tuyến (mặc định không đồng bộ), bạn muốn định cấu hình thiết lập của mình thành sao chép đồng bộ, bạn có thể thực hiện việc này bằng cách đặt synchronous_standby_namestham số thành giá trị không trống, ví dụ : standby_1. Bạn làm điều này trên primarymáy chủ. Sau đó, trên standbymáy chủ, bạn sửa đổi primary_conninfocài đặt bằng cách thêm application_name=standby_1ví dụ : primary_conninfo = 'host=x port=y user=z application_name=standby_1'. Đây là từ postgresql.org/docs/9.6/static/warm-standby.html , phần 26.2.8.
dw8547
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.