Làm cách nào để tính max_connections cho PostgreSQL và default_pool_size cho pgbouncer?


17

Có một quy tắc hoặc một cái gì đó tôi có thể sử dụng để tính toán một số tốt cho max_connections, default_pool_sizemax_client_conn?

Mặc định là số lẻ. PostgreSQL mặc định là max_connections = 100 trong khi pgbouncer mặc định là default_pool_size = 20. Không nên default_pool_size luôn cao hơn max_connections? Nếu không, vấn đề là gì? Tôi nghĩ pgbouncer có nghĩa là cho phép chúng tôi xử lý nhiều kết nối hơn bằng cách hạ thấp chi phí của họ (bằng cách sử dụng lại các kết nối của PostgreQuery). Tôi bối rối.

Tôi đang tìm kiếm lời khuyên tương tự như những lời khuyên được tìm thấy trong wiki của PostgreSQL , như "tham số này sẽ chiếm ~ 50% bộ nhớ của bạn".

Tôi nhớ có một bảng tính cho MySQL sẽ cho phép bạn tính toán các loại tham số này. Thật tuyệt vời khi có một cái gì đó tương tự như vậy cho PostgreSQL / pgbouncer.

Câu trả lời:


12

Trước tiên, xin vui lòng đọc câu hỏi kinh điển của chúng tôi về Kế hoạch năng lực .
Lời khuyên cụ thể mà bạn đang yêu cầu là tư vấn lập kế hoạch năng lực và bạn sẽ phải tự mình giải quyết vấn đề đó cho môi trường cụ thể của bạn.

Thứ hai, bạn đang nhìn vào điều này sai.
Dung lượng bộ nhớ (hoặc bất kỳ tài nguyên nào khác) mà bạn không quyết định số lượng kết nối bạn đã đặt, số lượng kết nối bạn cần cho biết mức độ khó khăn mà máy chủ bạn phải mua.
Các yêu cầu tài nguyên trên mỗi kết nối được đưa ra trong hướng dẫn chi tiết đáng kể, cũng như được thảo luận trên Wiki mà bạn liên kết đến. Chỉ ra những gì môi trường của bạn cần (hoặc đưa ra một phỏng đoán có giáo dục) và đảm bảo phần cứng bạn sẽ chạy có thể xử lý những gì bạn sẽ ném vào nó.


Cụ thể lại: giới hạn kết nối và kích thước nhóm, bạn nên có các kết nối "đủ" để đáp ứng các yêu cầu của ứng dụng của bạn - trên một máy chủ hoặc thông qua một nhóm / bouncer.

"Đủ" là một số tương đối: Một ứng dụng tạo (và liên tục sử dụng lại) một kết nối chỉ yêu cầu một kết nối. Một ứng dụng thiết lập kết nối cho mỗi người dùng cuối đăng nhập yêu cầu nhiều kết nối DB như người dùng có.

Các giá trị mặc định cho cả Postgres và pgbouncerđược coi là mặc định :

  • 100 kết nối cơ sở dữ liệu là rất nhiều cho người điển hình ném Postgres vào một môi trường.
    Các nhà phát triển có thể sẽ không cần nhiều hơn 10. Bất kỳ ai khác sẽ biết đủ để tăng số lượng.

  • 20 kết nối từ pgbouncermỗi nhóm DB có nghĩa là bạn có thể nhận được 4 nhóm trỏ đến một máy chủ và không vượt quá giới hạn kết nối Postgres mặc định.
    Có thể có nhiều tài nguyên được gộp chung trong việc pgbouncerchỉ vào một cơ sở dữ liệu phụ trợ và bạn luôn muốn có một số kết nối có sẵn trên các máy chủ phụ trợ của mình.

Nếu mặc định không phù hợp với môi trường của bạn, bạn sẽ phải thay đổi chúng.

Hãy nhớ rằng các kết nối gộp không có nghĩa là "luôn luôn kết nối mọi kết nối cơ sở dữ liệu có sẵn".
Điểm pgbouncernhư bạn lưu ý là sử dụng lại các kết nối. Việc đạt được hiệu quả ở đây không yêu cầu bạn buộc mọi kết nối khả dụng, chỉ đơn giản là bạn không ngắt kết nối, kết nối lại, đàm phán lại SSL, xác thực lại cơ sở dữ liệu và chạy lại các truy vấn thiết lập kết nối của bạn mỗi lần.


8
Tôi không thấy quan điểm mua thêm phần cứng trước khi cấu hình mọi thứ đúng cách. "Bất cứ ai khác sẽ biết đủ để tăng số lượng" . Chà, tôi có thể học ở đâu để biết đủ? Tôi không tìm thấy nhiều tài liệu về các kết nối. Có phải chỉ là thử nghiệm và lỗi? Bảng tính tôi đã đề cập cho MySQL được sử dụng để làm việc như một lá bùa. Sử dụng nhiều kết nối hơn chỉ định bởi nó sẽ dẫn đến việc máy chủ hết bộ nhớ. Ngay bây giờ tôi có 4GB, tôi đã hy vọng sẽ phải tăng mặc định. Ngoài ra, 20x4 = 80, 20 còn lại để làm gì?
ChocoDeveloper

1
@ChocoDeveloper Vui lòng đọc lại toàn bộ câu trả lời của tôi (bạn đang hỏi một số điều mà tôi đã giải quyết) và dành vài phút với tài liệu tôi đã liên kết. Bạn vẫn đang nhìn về phía sau này (xem đoạn đầu tiên trong câu trả lời của tôi). Hãy nhớ rằng Postgres KHÔNG phải là MySQL: Bạn cần quên mọi thứ bạn nghĩ bạn biết từ kinh nghiệm điều chỉnh MySQL của bạn. Postgres giống như Oracle. Nghiên cứu hướng dẫn , và tiến hành theo các hướng dẫn mà nó cung cấp cho bạn.
voretaq7

1

Lưu ý định nghĩa của tài liệu vềdefault_pool_size

Có bao nhiêu kết nối máy chủ để cho phép mỗi cặp người dùng / cơ sở dữ liệu.

Vì vậy, nếu cấu hình mặc định là kích thước nhóm 20, trong tổng số 100 kết nối, điều này ngụ ý 5 cặp người dùng / cơ sở dữ liệu riêng biệt sẽ phải tối đa hóa kích thước nhóm của họ trước khi đạt đến giới hạn chung. Ngược lại, nếu bạn đang sử dụng pgbouncer để định tuyến đến một cơ sở dữ liệu thông qua một người dùng, thì giới hạn kết nối hiệu quả của bạn là 20, không phải 100, do đó bạn phải đặt kích thước nhóm cho trường hợp sử dụng đó cho phù hợp. YMMV.

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.