pgBouncer는 훌륭하지만 때때로 사용할 수 없게됩니다


9

바쁜 postgres 9 데이터베이스 앞에서 pgBouncer를 실행하고 있습니다. 대부분의 경우 잘 작동합니다. 그러나 몇 시간마다 psycopg2를 제외하고 응용 프로그램에서 오류 전자 메일을받습니다.

OperationalError ( '서버에 연결할 수 없습니다 : 요청한 주소를 할당 할 수 없습니다. 서버가 "neo-hulk"호스트에서 실행 중이고 포트 6432에서 TCP / IP 연결을 수락합니까?')

이것은 작업을 실행하는 셀러리 작업자가 많은 파이썬 앱입니다. 이러한 오류가 발생하면 pgbouncer db를 확인하고 풀 크기가 한도 내에 있습니다. 실험 후 풀 최대 크기를 400으로 설정하고 풀 크기를 200으로 설정했습니다. 풀 모드는 "세션"입니다 (요청은 대부분 자동 커밋, 트랜잭션은 거의 없음).

pgBouncer가 어떻게 그런 식으로 사라지나요? 짧은 시간 동안 만 (그리고 전체 요청에 비해 적은 양의 요청에 대해 이야기하고 있지만) 실패한 요청은 중요합니다.

감사!


운영 체제 및 버전? 리눅스라면 커널 버전? 정확한 PostgreSQL 및 PgBouncer 버전? 디버그 로그 수준에서 PgBouncer를 실행하고 유용한 정보가 있는지 확인 했습니까?
Craig Ringer

데비안 6. Linux 버전 2.6.32-5-amd64 (Debian 2.6.32-48squeeze1) pgbouncer 버전 1.5.4 Postgres 9.1. 로그는 조금 생각 한대로 연결 / 연결 끊기를 기록하지 않지만 해당 앱 오류가 발생할 때 오류가 없습니다. 이 문제는 pgbouncer 이전에는 존재하지 않았지만 psycopg2에서 대화 할 db 서버가 없다고 생각하는 오류입니다.
Harel

1
흠, 현재 PgBouncer와 커널은 고대이지만 꽤 안정적입니다. PgBouncer에서보다 자세한 로깅을 활성화 -vvv하고 비정상적인 로그 출력을 오류와 일치시킬 수 있는지 확인 해야한다고 생각합니다 .
Craig Ringer

"set verbose = 1; reload;"를 수행했습니다. pgbouncer 셸에서 로그에서 평범하지 않은 것을 찾을 수 없습니다. 이것은 프로덕션 시스템이므로 -vvv를 사용하여 비 데몬으로 실행되도록 서비스를 중지 할 수 없습니다. 잘만되면 나는 같은 결과를 얻었습니다. 이 오류는 pgbouncer에 전혀 연결할 수 없음을 나타냅니다. 즉, 해당 포트에서 수신 대기하는 것을 찾을 수 없습니다. 항상 수천 개의 연결이 이루어졌으며 소수의 연결이 실패한다는 것은 이상합니다.
Harel

교활한; 그것은 잠재적 인 경쟁 조건처럼 들리 겠지만에서 무엇을 / ...
크레이그 벨소리

답변:


15

은 " 할당 할 수 없습니다 요청 주소 오류 메시지에서"부분은 커널 TCP 스택에서 온다. 간헐적으로 발생하는 경우, 이는 일반적으로 대기 상태 ( TIME_WAIT또는 이하 FIN_WAIT_1또는 FIN_WAIT_2) 에 너무 많은 소켓으로 인해 사용 가능한 소켓 공간이 소진되었음을 의미합니다.

소켓 포트 범위는로 출력 할 수 있습니다 cat /proc/sys/net/ipv4/ip_local_port_range. 기본 Linux 커널의 기본값은 일반적으로 32768 61000입니다.

netstat -ton|grep WAIT시스템이 사용 중일 때 클라이언트와 pgBouncer의 호스트 에서 결과를 확인할 수 있습니다 . -o플래그는 대기 상태에 관한 타임 아웃 카운터를 표시합니다.

총 TCP 소켓 61000-32768=28232수가이 범위에 가까우면 이 범위가 소진 될 수 있습니다. 닫힌 상태의 소켓은 TIME_WAIT정상적인 상태에서 60 초를 소비하기 때문에 클라이언트 호스트가 1 분 안에 28232 번 이상 연결하면 포트가 해제 될 때까지 언급 된 오류와 함께 새 연결이 실패합니다.

첫 번째 해결 방법으로 TCP 포트 범위를 확장 할 수 있습니다.

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

이 만족스럽지의 경우를 확인 tcp_tw_recycle하고 tcp_tw_reuse플래그도를 통해 조정 가능 /proc/sys/net/ipv4하고 sysctl.

그들은 (에서 man tcp) 로 정의됩니다 .

       tcp_tw_recycle (부울; 기본값 : 비활성화; Linux 2.4부터)
              TIME_WAIT 소켓을 빠르게 재활용 할 수 있습니다. 이것을 가능하게하기
              작업시 문제가 발생하므로 옵션을 권장하지 않습니다.
              NAT (Network Address Translation)를 사용하여 연결합니다.

       tcp_tw_reuse (부울; 기본값 : 비활성화; Linux 2.4.19 / 2.6부터)
              TIME_WAIT 소켓을 새 연결에 재사용 할 수 있습니다.
              프로토콜 관점에서 안전합니다. 없이 변경해서는 안됩니다
              기술 전문가의 조언 / 요청.

개인적으로 나는 tcp_tw_recycleMySQL 클라이언트 앱 에서이 문제에 직면했을 때 성공 했지만 TCP에 대한 나의 이해는 피상적이라고 생각합니다.


1
이 답변은 TCP에 대한 버그 표면적 이해를 보여줍니다. 고마워 포트 범위를 늘리고 잠시 동안 실행하여 효과가 있는지 확인했습니다. (설정 한 후 재부팅해야합니까?)
Harel

포트가 증가했다고 생각합니다. 지금까지 오류가 발생하지 않았습니다. netstat 행의 대략적인 수는 클라이언트에서 20K에 가깝게 표시되므로 28K까지의 기본 한계는 길지 않습니다. 고마워요!
Harel

1
좋은! 당신의 설정을 넣을 /etc/sysctl.conf으로 net.ipv4.ip_local_port_range = 1025 65535는 재부팅 유지해야합니다.
Daniel Vérité

감사. 그 이후로 오류가 발생했지만 그중 하나는 아니므로 여전히 좋습니다. 며칠 동안 실행 시키면 파마가 변경됩니다. 다른 변화로 인해 겁이 나기 때문에 지금까지는 효과가있는 것이 기쁘다. :)
Harel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.