2015-04-04 19 views
26

Tôi vẫn quấn đầu quanh Kubernetes và làm thế nào để nó hoạt động. Hiện tại, tôi đang cố gắng tìm hiểu cách mô hình hóa một thứ gì đó giống như một cụm PostgreSQL với nhân bản trực tuyến, mở rộng quy mô và tự động chuyển đổi dự phòng/lỗi (pgpool-II, repmgr, chọn chất độc của bạn).Làm cách nào để tạo mô hình cụm chuyển đổi dự phòng PostgreSQL với Docker/Kubernetes?

Vấn đề chính của tôi với cách tiếp cận là bản chất kép của một cá thể PostgreSQL, cấu hình khôn ngoan - đó là chế độ chờ chính hoặc lạnh/nóng/nóng. Nếu tôi tăng số lượng bản sao, tôi hy vọng tất cả chúng sẽ xuất hiện dưới dạng standbys, vì vậy tôi sẽ tưởng tượng tạo một bộ điều khiển nhân rộng postgresql-standby riêng biệt với một vỏ postgresql-master. Tuy nhiên tôi cũng mong đợi một trong những standbys để trở thành một bậc thầy trong trường hợp chủ hiện tại là xuống, do đó, nó là một bộ điều khiển nhân rộng postgresql phổ biến sau khi tất cả.

Ý tưởng duy nhất tôi đã có cho đến nay là đặt cấu hình sao chép trên ổ đĩa ngoài và quản lý trạng thái và trạng thái thay đổi bên ngoài vùng chứa.

(trong trường hợp của PostgreSQL cấu hình có lẽ đã được trên một khối lượng bên trong thư mục data của nó, mà tự nó rõ ràng là một cái gì đó tôi muốn trên một khối lượng, nhưng đó là bên cạnh điểm)

Là đúng approaach, hoặc là có cách nào khác sạch hơn?

+0

Tôi có thể giúp xem Kelsey Hightower's [talk] (https://youtu.be/9W-ngbpBSMM) ... – errordeveloper

+5

@errordeveloper: funny, 40% thời gian giới thiệu được dành cho việc Kubernetes hoạt động như thế nào - - cũng đại diện cho trải nghiệm của tôi. Các tl; dr từ video là: PostgreSQL không được xây dựng để được thu nhỏ theo chiều ngang mà không cần tái cấu hình nỗ lực, do đó, nó phải là một nhóm và không phải là một bộ điều khiển nhân rộng. –

+1

Đó là sự thật, mặc dù có thể được tối ưu hóa với hình ảnh VM được nướng trước và một vài phím tắt khác. – errordeveloper

Trả lời

0

Bạn có thể thử PostDock, hoặc bằng docker-compose hoặc Kubernetes. Hiện nay tôi đã thử nó trong dự án của chúng tôi với Docker-soạn, với sơ đồ như hình dưới đây:

pgmaster (primary node1) --| 
|- pgslave1 (node2)  --| 
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)----client 
|- pgslave3 (node4)  --| 
    |- pgslave4 (node5) --| 

Tôi đã thử nghiệm các tình huống sau, và tất cả đều hoạt động rất tốt:

  • thức lây nhiễm: thay đổi được thực hiện tại nút chính (tức là, chính) sẽ được nhân rộng đến tất cả các nút chờ (nghĩa là, phụ))
  • Lỗi: dừng nút chính và nút dự phòng (ví dụ node4) sẽ tự động đảm nhiệm vai trò chính.
  • Ngăn chặn hai nút chính: phục hồi nút chính trước đó (node1), node4 sẽ tiếp tục làm nút chính, trong khi node1 sẽ được đồng bộ hóa nhưng dưới dạng nút dự phòng.

Đối với ứng dụng khách, những thay đổi này đều trong suốt. Máy khách chỉ trỏ đến nút pgpool, và tiếp tục làm việc tốt trong tất cả các kịch bản nói trên.

Lưu ý: Trong trường hợp bạn gặp sự cố khi chạy PostDock, bạn có thể thử my forked version of PostDock.

Pgpool-II với Watchdog

Một vấn đề với kiến ​​trúc nói trên là pgpool đó là điểm duy nhất của thất bại. Vì vậy, tôi cũng đã thử bật Watchdog for pgpool-II bằng IP ảo được ủy nhiệm, để tránh điểm duy nhất của lỗi.

master (primary node1) --\ 
|- slave1 (node2)  ---\ /pgpool1 (active) \ 
| |- slave2 (node3) ----|---|      |----client 
|- slave3 (node4)  ---/  \ pgpool2 (standby)/
    |- slave4 (node5) --/ 

Tôi đã thử nghiệm các tình huống sau, và tất cả đều hoạt động rất tốt:

  • kịch bản bình thường: cả pgpools khởi động, với IP ảo sẽ tự động áp dụng cho một trong số họ, trong trường hợp của tôi, pgpool1
  • Lỗi: tắt pgpool1. IP ảo sẽ được tự động áp dụng cho pgpool2, do đó sẽ trở thành hoạt động.
  • Khởi động pgpool không thành công: bắt đầu lại pgpool1. IP ảo sẽ được giữ với pgpool2 và pgpool1 hiện đang hoạt động như chế độ chờ.

Đối với ứng dụng khách, những thay đổi này đều trong suốt. Máy khách chỉ trỏ tới IP ảo và tiếp tục làm việc tốt trong tất cả các kịch bản nói trên.

Bạn có thể tìm thấy dự án này tại my GitHub repository on the watchdog branch.

Các vấn đề liên quan