Sản xuất sao chép PostgreSQL đã sẵn sàng?


16

Làm thế nào để nhân rộng bản địa PostgreSQL so với MySQL?

Tôi biết sao chép không đồng bộ đã được hỗ trợ lâu hơn đồng bộ hóa, gần đây. Là đồng bộ đáng tin cậy để được sử dụng trong các dự án thực tế?

Câu trả lời:


31

Sản xuất đã sẵn sàng?

Vâng, nó đã sẵn sàng sản xuất và được sử dụng rộng rãi. Ví dụ, những người theo dõi Heroku dựa trên bản sao không đồng bộ tích hợp sẵn của PostgreQuery, cũng như các bản sao lưu AWS RDS và đọc bản sao. Nhân rộng trực tuyến được sử dụng gần như phổ biến với PostgreSQL.

Thiết lập sao chép không thực sự đáng yêu, nhưng các công cụ như repmgr giúp phần nào cho điều đó và nó đang cải thiện chậm với mỗi bản phát hành chính. Khả năng pg_basBackup lấy một bản sao của hệ thống bằng cách sử dụng sao chép phát trực tuyến (và làm như vậy từ chế độ chờ khác) là một trợ giúp lớn.

Nói chung, một tính năng đơn giản sẽ không được phát hành trong PostgreSQL cho đến khi nó được sản xuất. Lỗi xảy ra, giống như trong bất kỳ phần mềm nào, nhưng chúng thường được sửa ngay sau khi chúng được xác định. Các tính năng mới thực sự quan trọng đôi khi có lỗi và sự cố được phát hiện sau khi phát hành .0, nhưng nếu sửa chúng là ưu tiên cao; lỗi không chỉ còn lại xung quanh.

Tôi không nhận thấy bất kỳ vấn đề nghiêm trọng nào khi sao chép phát trực tuyến - đồng bộ hóa hoặc không đồng bộ - tôi cũng không thấy bất kỳ báo cáo nào trong một thời gian dài. Chúng kém ổn định hơn so với tiêu chuẩn thông thường của PG trong các phiên bản .0 của các phiên bản chính mà chúng được giới thiệu, nhưng cả hai đều trưởng thành nhanh chóng và sẵn sàng sản xuất.

(Cập nhật: Có một lỗi cụ thể trong phiên bản 9.3 mới trước 9.3.4 đã gây ra sự cố sao chép trong một số trường hợp; người dùng 9.3 nên cập nhật lên 9.3.4 ngay lập tức. Phiên bản cũ hơn không bị ảnh hưởng.)

Nhắc nhở duy nhất tôi muốn đề cập là một chi tiết nhỏ với sao chép đồng bộ: Nếu bạn cam kết với chủ, sau đó hủy truy vấn sau khi nó cam kết trong khi nó chờ bản sao để xác nhận, nó được coi là được cam kết trên bản gốc ngay cả trước khi được sao chép. Bạn nhận được hiệu ứng tương tự bằng cách khởi động lại bản gốc trong khi chờ bản sao trả lời. Trong thực tế điều này là không liên quan, nhưng đó là vấn đề duy nhất tôi có thể nghĩ đến.

So sánh với MySQL?

Bản sao gốc của PG khá khác với MySQL.

MySQL sử dụng bản sao logic trong đó nó gửi các thay đổi logic được thực hiện cho dữ liệu bảng, cấu trúc bảng, v.v. và bản sao áp dụng các thay đổi đó.

Bản sao của PostgreQuery ở mức thấp hơn (từ 9.5 trở xuống; các phiên bản trong tương lai cũng có thể thêm bản sao logic). Nó sẽ gửi các khối đã thay đổi trong các bảng. Nó đơn giản hơn, dễ dàng hơn để lấy đúng và áp đặt tải thấp hơn trên máy chủ bản sao, nhưng tiêu tốn nhiều băng thông mạng hơn và yêu cầu nhiều bộ nhớ hơn trên bản gốc để giữ các thay đổi chưa được sao chép. Nó được cấu hình tốt nhất để sử dụng sao chép phát trực tuyến với dự phòng lưu trữ WAL, khiến cho việc cấu hình phức tạp hơn so với MySQL. Nó sao chép các thay đổi cấp độ thấp như hoạt động VACUUM, không chỉ thay đổi các thay đổi, giữ trạng thái trên đĩa của bản sao giống như hoạt động của bản gốc. Không thể sao chép chỉ một cơ sở dữ liệu; toàn bộ hệ thống phải được nhân rộng, điều này có thể gây nản lòng nếu bạn có một cơ sở dữ liệu lớn, cao và không quan trọng và một cơ sở dữ liệu nhỏ, thấp và quan trọng.

Tất cả trong tất cả, nó phụ thuộc vào những gì bạn muốn làm với nó.

Tôi xem bản sao của PostgreSQL tốt hơn đáng kể cho các bản sao được sử dụng để sao lưu, tính sẵn sàng cao và khắc phục thảm họa. Đặc biệt là như vậy khi kết hợp với thời gian phục hồi (PITR) .

Mặt khác, nó không tốt cho các bản sao báo cáo chỉ đọc vì cần trì hoãn ứng dụng dữ liệu được sao chép trong khi chạy các giao dịch dài có nghĩa là bạn cần phải để nó hủy bỏ các truy vấn chạy rất lâu hoặc tụt hậu rất nhiều thêm không gian đĩa trên bản gốc và buộc nó phải làm việc chăm chỉ hơn để theo kịp.

Có công việc đang diễn ra để cho phép sao chép logic trong PostgreSQL , trong đó các thay đổi logic đối với cấu trúc bảng, nội dung bảng, v.v ... được sao chép, thay vì trạng thái trên đĩa của chúng. Thiết kế danh mục của PG và hỗ trợ cho mọi thứ do người dùng định nghĩa làm cho việc này khá phức tạp. Một số nền tảng đã được đưa ra cho 9,4, nhưng sao chép logic đầy đủ có thể không sử dụng được trước 9,6 hoặc muộn hơn.


Câu trả lời tuyệt vời cho một câu hỏi tôi cũng đã có. Cảm ơn Craig.
swasheck

6
Có một điều về đại diện đồng bộ hóa gây ngạc nhiên cho một số người dùng, nhưng thực sự có ý nghĩa nếu bạn nghĩ về nó: cam kết của một giao dịch được sao chép đồng bộ sẽ không quay trở lại cho đến khi giao dịch được duy trì trên ít nhất một cụm bên cạnh chủ . Những người đến từ một số hệ thống khác cảm thấy điều đó nên xảy ra trừ khi nỗ lực sao chép mất quá nhiều thời gian , điều đó có nghĩa là "nó đồng bộ trừ khi không", đó không phải là một sự đảm bảo chấp nhận được đối với cộng đồng PostgreQuery. Sử dụng nhiều mục tiêu đồng bộ hóa để tránh gian hàng nếu bản sao bị lỗi hoặc sử dụng async.
kgrittn

1
@kgrittn Điểm tốt lại nhiều mục tiêu. Tôi hơi kinh hoàng rằng bất kỳ ai cũng muốn / mong muốn cam kết quay lại trước khi giao dịch được nhân rộng trong bản sao đồng bộ ; Âm thanh như họ thực sự muốn sao chép không đồng bộ với giới hạn khoảng cách người theo tối đa mà tạm dừng ghi trên bản gốc cho đến khi người theo dõi bắt kịp? Một điều hoàn toàn hợp lý để muốn, nhưng không đồng bộ đại diện.
Craig Ringer

1
@CraigRinger: Những gì tôi thấy mọi người yêu cầu không hoàn toàn như những gì bạn đã nêu, đôi khi họ yêu cầu "Sử dụng đại diện đồng bộ hóa nhưng tự động quay lại đại diện async nếu quá trình đồng bộ hóa mất quá nhiều thời gian." Vì vậy, họ không muốn tạm dừng bản gốc nếu nó bị bỏ lại quá xa so với bản sao - đó chính xác là trường hợp họ muốn nó xác nhận cam kết nhanh chóng , mà không có bất kỳ ghi vào trang web nào khác. Đối với tôi nghe có vẻ như một trường hợp hứa hẹn nhiều hơn là được giao. Họ muốn trả trước "Vâng, bạn có đại diện đồng bộ hóa; bạn an toàn." và sau một sự cố "Dữ liệu đã cam kết đó đã biến mất; nó không thực sự được ghi ở bất kỳ nơi nào khác."
kgrittn

@CraigRinger có thể cập nhật nó với pg10 / logic?
Evan Carroll
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.