문제

JDBC 마스터/슬레이브로 구성된 ActiveMQ 시스템의 결함 공차를 테스트하고 있습니다. 이 설정에는 하나의 Postgres 데이터베이스와 두 개의 중개인이 있습니다. 하나는 마스터 브로커이고 다른 하나는 슬레이브 브로커입니다. 이 메커니즘이 작동하는 방식은 마스터가 DB의 테이블에 독점적 인 잠금을 취하는 것입니다. 노예는이 작업을 수행하려고 시도하고 자물쇠가 가능해질 때까지 기다립니다. 마스터가 죽으면 자물쇠가 풀리고 슬레이브가 인수됩니다. 그러나 마스터가 데이터베이스와 네트워크 연결을 잃으면 잠금이 해제되지 않아 교착 시나리오가 발생합니다. 여기서 필요한 것으로 보이는 것은 Postgres에게 지정된 기간 내에 갱신되지 않으면 잠금을 자동으로 해제하도록 지시하는 방법입니다. Posa 3 책의 책은 이것을 임대 패턴이라고 부릅니다. Postgres 가이 작업을 수행 할 수 있습니까? 그렇지 않은 경우 다른 데이터베이스 공급 업체가 지원합니까?

도움이 되었습니까?

해결책

이것은 교착 상태가 아니며 연결 문제가 손실됩니다.

교착 상태는 두 번의 거래가 서로 이전에 잠긴 리소스를 잠그려고 할 때 발생합니다. PostgreSQL 이러한 상황을 감지합니다.

당신의 경우, master 자원을 잠그고 slave 기다립니다 master, 그리고 master 연결이 손실되어 수신하지 않는 사용자 입력을 기다립니다.

언제든지 PostgreSQL 연결 손실을 감지하면 트랜잭션이 자동으로 롤백됩니다.

연결 손실 감지를 제어하려면 다음을 사용할 수 있습니다. PostgreSQL 연결 옵션:

tcp_keepalives_idle (integer)

지원하는 시스템에서 TCP_KEEPIDLE 소켓 옵션은 다른 유휴 연결에서 keepalives를 보내는 사이의 초 수를 지정합니다. 0의 값은 시스템 기본값을 사용합니다. 만약에 TCP_KEEPIDLE 지원되지 않으면이 매개 변수는 0이어야합니다. 이 매개 변수는 UNIX- 도메인 소켓을 통한 연결에 대해 무시됩니다.

tcp_keepalives_interval (integer)

지원하는 시스템에서 TCP_KEEPINTVL 소켓 옵션은 몇 초 만에 재전송하기 전에 keepalive에 대한 응답을 기다리는 시간을 지정합니다. 0의 값은 시스템 기본값을 사용합니다. 만약에 TCP_KEEPINTVL 지원되지 않으면이 매개 변수는 0이어야합니다. 이 매개 변수는 UNIX- 도메인 소켓을 통한 연결에 대해 무시됩니다.

tcp_keepalives_count (integer)

지원하는 시스템에서 TCP_KEEPCNT 소켓 옵션, 연결이 죽은 것으로 간주되기 전에 얼마나 많은 똑똑한지를 잃을 수 있는지 지정합니다. 0의 값은 시스템 기본값을 사용합니다. 만약에 TCP_KEEPCNT 지원되지 않으면이 매개 변수는 0이어야합니다. 이 매개 변수는 UNIX- 도메인 소켓을 통한 연결에 대해 무시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top