PostgreSQL JDBC에서 제공하는 Simple Connection Fail-over 기능, AWS PostgreSQL JDBC(현재 public preview)에 구현된 Fail-over 사용 또는 Amazon RDS Proxy로 conncetion 관리를 할수 있습니다.
Connection fail-over를 지원하기 위해 여러 endpoint를 쉼표로 구분하여 JDBC URL에 정의할 수 있습니다. 드라이버는 연결이 성공할 때까지 순서대로 node에 대해 각각 한 번 연결을 시도합니다. 아무 것도 성공하지 못하면 정상적인 연결 예외가 발생합니다.
여러 replica를 사용하는 경우 특정 replica로 연결이 실패하면 모든 replica에 먼저 연결 시도를 하고 모든 replica를 사용하지 못하는 경우 primary를 사용합니다.
JDBC String에 설정 가능한 파라미터
다음 파라미터를 적극적으로 설정하면 애플리케이션을 한 호스트에 연결하기 위해 너무 오래 기다리지 않도록 할 수 있습니다.
targetServerType – 드라이버가 쓰기 노드에 연결되는지 아니면 읽기 노드에 연결되는지를 제어하려면 이 파라미터를 사용합니다. 애플리케이션이 쓰기 노드에만 다시 연결되도록 하려면 targetServerType 값을 primary로 설정합니다. targetServerType 파라미터에 사용할 수 있는 값에는 primary, secondary, any, preferSecondary가 있습니다. preferSecondary 값은 먼저 리더와의 연결 설정을 시도하지만 리더 연결을 설정할 수 없는 경우 라이터에 연결합니다.
loginTimeout – 소켓 연결이 설정된 후 애플리케이션이 데이터베이스에 로그인하기까지 대기하는 시간을 제어합니다.
connectTimeout – 소켓이 데이터베이스에 연결을 설정하기까지 대기하는 시간을 제어합니다.
애플리케이션을 얼마나 적극적으로 설정하고 싶은지에 따라, 다른 애플리케이션 파라미터를 수정하여 연결 프로세스의 속도를 높일 수 있습니다.
cancelSignalTimeout – 일부 애플리케이션에서는 시간 초과 쿼리에 "최대한" 취소 신호를 보내야 할 수 있습니다. 이 취소 신호가 장애 조치 경로에 있는 경우, 잘못된 호스트로 이 신호가 전달되지 않도록 적극적으로 설정하는 것을 고려해야 합니다.
socketTimeout – 이 파라미터는 소켓이 읽기 작업을 대기하는 시간을 제어합니다. 쿼리가 이 값보다 길게 대기하지 않도록 이 파라미터를 전역 "쿼리 제한 시간"으로 사용할 수 있습니다. 한 가지 좋은 방법은, 수명이 짧은 쿼리를 실행하는 연결 핸들러를 두고 이 값을 낮게 설정하는 한편, 장기 실행 쿼리를 위한 다른 연결 핸들러를 두고 이 값을 훨씬 높게 설정하는 것입니다. 그러면 서버가 다운될 경우 TCP keepalive 파라미터를 이용해 장기 실행 쿼리를 중단할 수 있습니다.
tcpKeepAlive – 이 파라미터를 활성화하면 사용자가 설정한 TCP keepalive 파라미터가 적용됩니다.
loadBalanceHosts – 이 파라미터를 true로 설정하면 애플리케이션을 후보 호스트 목록에서 선택한 임의의 호스트에 연결합니다.
기본 PostgreSQL JDBC Failover는 DNS Caching의 영향을 받을 수 있습니다. JVM option에 network ttl 관련 세팅값을 추가합니다.
DNS caching can occur anywhere from your network layer, through the operating system, to the application container. For example, Java virtual machines(JVMs) are notorious for caching DNS indefinitely unless configured otherwise.
// Sets internal TTL to match the Aurora RO Endpoint TTL java.security.Security.setProperty("networkaddress.cache.ttl" , "1"); // If the lookup fails, default to something like small to retry java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "3");
Aurora PostgreSQL Best Practice - Fast failover - DNS cache 에서도 자세한 설명을 확인 할 수 있습니다.