pgBouncer hoạt động tuyệt vời nhưng đôi khi không có sẵn


9

Tôi đang chạy pgBouncer trước cơ sở dữ liệu 9 postgres bận rộn. Trong hầu hết thời gian nó hoạt động tốt. Nhưng cứ sau vài giờ tôi sẽ nhận được một email lỗi từ ứng dụng của mình ngoại trừ psycopg2:

Toán tửError ('không thể kết nối với máy chủ: Không thể gán địa chỉ được yêu cầu Có phải máy chủ đang chạy trên máy chủ "neo-hulk" và chấp nhận kết nối TCP / IP trên cổng 6432?')

Đây là một ứng dụng python với một nhóm công nhân cần tây đang chạy các nhiệm vụ. Khi những lỗi đó xuất hiện, tôi kiểm tra db pgbouncer và kích thước nhóm nằm trong giới hạn. Sau một số thử nghiệm, tôi đã đặt kích thước tối đa của nhóm là 400 và kích thước nhóm thành 200. Chế độ nhóm là "phiên" (yêu cầu chủ yếu là tự động cam kết, hầu như không có giao dịch).

Điều gì khiến pgBouncer 'biến mất' như thế? nó chỉ trong một khoảng thời gian ngắn (và tổng cộng chúng ta đang nói về một lượng nhỏ yêu cầu so với khối lượng yêu cầu tuyệt đối của nó) nhưng những yêu cầu đó không quan trọng.

Cảm ơn!


Hệ điều hành và phiên bản? Phiên bản hạt nhân nếu Linux? Chính xác các phiên bản PostgreSQL và PGBouncer? Bạn đã chạy PGBouncer ở cấp độ nhật ký gỡ lỗi và xem nếu nó báo cáo bất cứ điều gì hữu ích?
Craig Ringer

Debian 6. Linux phiên bản 2.6.32-5-amd64 (Debian 2.6.32-48squeeze1) phiên bản pgbouncer 1.5.4 Postgres 9.1. Nhật ký không ghi nhật ký kết nối / ngắt kết nối vì tôi nghĩ nó hơi nhiều, nhưng không có lỗi nào xảy ra khi những lỗi ứng dụng đó bị ném. Lỗi xuất phát từ việc psycopg2 nghĩ rằng không có máy chủ db để nói chuyện, mặc dù vấn đề này không tồn tại trước pgbouncer
Harel

1
Hừm, vậy là PGBouncer hiện tại, và kernel thì cổ nhưng khá ổn định. Tôi nghĩ rằng bạn cần phải kích hoạt đăng nhập chi tiết hơn trong PGBouncer với -vvvvà xem liệu bạn có thể kết hợp đầu ra nhật ký bất thường với lỗi của bạn không.
Craig Ringer

Tôi đã thực hiện "set verbose = 1; tải lại;" trong vỏ pgbouncer và không thể tìm thấy bất cứ điều gì khác thường trong nhật ký. đây là một hệ thống sản xuất nên không thể dừng dịch vụ chạy dưới dạng không daemon với -vvv. Hy vọng rằng tôi đã có kết quả tương tự. lưu ý rằng lỗi cho thấy nó không thể kết nối với pgbouncer, nghĩa là không thể tìm thấy nó trong cổng đó. Có hàng ngàn kết nối được thực hiện mọi lúc và thật kỳ lạ khi một số ít trong số chúng thất bại như thế.
Harel

Khó khăn; Nghe có vẻ như là một điều kiện cuộc đua tiềm năng, nhưng trong những gì / ở đâu ...
Craig Ringer

Câu trả lời:


15

Phần " Không thể gán địa chỉ được yêu cầu " trong thông báo lỗi xuất phát từ ngăn xếp TCP kernel. Khi gặp phải không liên tục, điều này thường có nghĩa là không gian của các ổ cắm có sẵn đã cạn kiệt do có quá nhiều ổ cắm ở trạng thái chờ ( TIME_WAIThoặc ít có thể FIN_WAIT_1hoặc FIN_WAIT_2)

Phạm vi của các cổng ổ cắm có thể được đầu ra bởi cat /proc/sys/net/ipv4/ip_local_port_range. Giá trị mặc định trên kernel Linux stock là nói chung 32768 61000.

Bạn có thể kiểm tra kết quả của netstat -ton|grep WAIT(các) máy khách và trên máy chủ của pgBouncer khi hệ thống bận. Các -olá cờ sẽ hiển thị các quầy timeout liên quan đến trạng thái chờ đợi.

Nếu tổng số ổ cắm TCP gần bằng 61000-32768=28232thì sự cạn kiệt của phạm vi này có thể là vấn đề của bạn. Do ổ cắm đóng dành 60 giây ở TIME_WAITtrạng thái bình thường, nếu máy chủ khách kết nối hơn 28,02 lần trong một phút, các kết nối mới sẽ không thành công với lỗi được đề cập cho đến khi các cổng được giải phóng.

Như một giải pháp đầu tiên, phạm vi cổng TCP có thể được mở rộng:

 # echo "1025 65535" >/proc/sys/net/ipv4/ip_local_port_range

Nếu nó không thỏa đáng, hãy kiểm tra tcp_tw_recycletcp_tw_reusecờ, cũng có thể điều chỉnh thông qua /proc/sys/net/ipv4sysctl.

Chúng được định nghĩa là (từ man tcp):

       tcp_tw_recycle (Boolean; default: bị vô hiệu hóa; kể từ Linux 2.4)
              Cho phép tái chế nhanh các ổ cắm TIME_WAIT. Kích hoạt tính năng này
              tùy chọn không được khuyến nghị vì điều này gây ra vấn đề khi làm việc‐
              ing với NAT (Dịch địa chỉ mạng).

       tcp_tw numuse (Boolean; default: bị vô hiệu hóa; kể từ Linux 2.4.19 / 2.6)
              Cho phép sử dụng lại ổ cắm TIME_WAIT cho các kết nối mới khi có
              an toàn từ quan điểm giao thức. Nó không nên được thay đổi mà không có
              tư vấn / yêu cầu của các chuyên gia kỹ thuật.

Cá nhân tôi đã thành công tcp_tw_recyclekhi gặp phải vấn đề này với ứng dụng máy khách MySQL, nhưng đừng coi đây là một khuyến nghị, sự hiểu biết của tôi về TCP là hời hợt nhất.


1
Câu trả lời đó cho thấy bất cứ điều gì lỗi về sự hiểu biết hời hợt về TCP. Cảm ơn vì điều đó. Tôi đã tăng phạm vi cổng và để nó chạy một lúc để xem nó có ảnh hưởng gì không. (Tôi có cần khởi động lại sau khi cài đặt không?)
Harel

Tôi nghĩ rằng việc tăng cổng đã làm điều đó. Cho đến nay tôi đã không nhận được bất kỳ lỗi. Số lượng thô của các dòng netstat hiển thị gần 20K trong máy khách nên từ đó đến giới hạn mặc định 28K không dài. Cảm ơn vì điều đó!
Harel

1
Tốt Bạn muốn đặt các thiết lập trong /etc/sysctl.confkhi net.ipv4.ip_local_port_range = 1025 65535để có nó tồn tại qua khởi động lại.
Daniel Vérité

Cảm ơn. Tôi đã nhận được lỗi từ đó nhưng không phải là lỗi như vậy. Để nó chạy trong một vài ngày và sẽ làm cho perm thay đổi. Tôi rất vui vì điều này cho đến nay dường như có hiệu quả vì những thay đổi khác làm tôi sợ :)
Harel
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.