고기 대신 SW 한점/Public Cloud

AWS PostgreSQL, Fast Failover 방법

지식한점 2023. 1. 26. 14:36
반응형

PostgreSQL JDBC에서 제공하는 Simple Connection Fail-over 기능, AWS PostgreSQL JDBC(현재 public preview)에 구현된 Fail-over 사용 또는 Amazon RDS Proxy로 conncetion 관리를 할수 있습니다.

Option 1: PostgreSQL JDBC

PostgreSQL JDBC에서는 Simple Connection Fail-over를 지원하고 있습니다.

Connection fail-over를 지원하기 위해 여러 endpoint를 쉼표로 구분하여 JDBC URL에 정의할 수 있습니다. 드라이버는 연결이 성공할 때까지 순서대로 node에 대해 각각 한 번 연결을 시도합니다. 아무 것도 성공하지 못하면 정상적인 연결 예외가 발생합니다.

jdbc:postgresql://host1:port1,host2:port2/database

 

 

예를 들어 애플리케이션에서 2개 connection pool을 만들어 하나는 쓰기용이고 다른 하나는 읽기용을 사용할 수 있습니다.

Write pool은 primary 노드에 연결합니다. 예:

jdbc:postgresql://writer_endpoint:port,reader_endpoint:port/db_name?targetServerType=primary

 

Read pool은 replica 노드들 간에서 load balancing을 합니다(Replica 1개의 경우 해당 replica에만 연결합니다.). Replica가 가용하지 못하는 경우 Primary node를 사용합니다. 예:

jdbc:postgresql://writer_endpoint:port,reader_endpoint:port/db_name?targetServerType=preferSecondary&loadBalanceHosts=true

 

여러 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로 설정하면 애플리케이션을 후보 호스트 목록에서 선택한 임의의 호스트에 연결합니다.
출처: 빠른 장애 조치를 위한 Aurora PostgreSQL 연결 문자열 설정

Aurora PostgreSQL Best Practice - Fast failover - connection string에서도 자세한 설명을 확인 할 수 있습니다.

 

예:

jdbc:postgresql://myauroracluster.cluster-c9bfei4hjlrd.us-east-1-beta.rds.amazonaws.com:5432,
myauroracluster.cluster-ro-c9bfei4hjlrd.us-east-1-beta.rds.amazonaws.com:5432
/postgres?user=<primaryuser>&password=<primarypw>&loginTimeout=2
&connectTimeout=2&cancelSignalTimeout=2&socketTimeout=60
&tcpKeepAlive=true&targetServerType=primary

 

DNS Caching:

기본 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.

JAVA_OPTS=“${JAVA_OPTS} -Dsun.net.inetaddr.ttl=1”
JAVA_OPTS=“${JAVA_OPTS} -Dsun.net.inetaddr.negative.ttl=3”

또는

// 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 에서도 자세한 설명을 확인 할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.html#AuroraPostgreSQL.BestPractices.FastFailover.Configuring.Timeouts

Option 2: AWS JDBC Driver for PostgreSQL

Amazon Web Services JDBC Driver for PostgreSQL의 Failover를 적용합니다. 현재 시점 해당 driver는 public preview 로 제공합니다.

1. gradle에 AWS PostgreSQL JDBC를 추가합니다.

build.gradle

  //postgre
  //implementation group: "org.postgresql", name: "postgresql", version: "42.2.16"
  implementation group: 'software.aws.rds', name: 'aws-postgresql-jdbc', version: '0.1.0'

 

2. application.yml 에서 datastore driver-class를 세팅합니다.

spring.datastore.driver-class-name: software.aws.rds.jdbc.postgresql.Driver

또는

resources.driver-class: software.aws.rds.jdbc.postgresql.Driver

 

3. JDBC URL를 변경합니다.

jdbc url: jdbc:postgresql:// -> jdbc:postgresql:aws://

 

Option 3: AWS RDS Proxy

RDS Proxy를 사용하여 Amazon RDS DB 인스턴스와 Amazon Aurora DB 클러스터에 대한 연결 관리를 간소화할 수 있습니다.

Amazon RDS Proxy 사용은 아래 문서에서 자세하게 확인이 가능합니다.
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy.html

 

Amazon RDS 프록시 사용 - Amazon Relational Database Service

MariaDB 데이터베이스와 관련된 프록시의 경우 초기화 쿼리에서 구성 파라미터 sql_auto_is_null을 true로 설정하거나 0이 아닌 값으로 설정하지 마시기 바랍니다. 이렇게 하면 잘못된 애플리케이션 동

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy-planning.html

 

RDS Proxy 사용 대상 계획 - Amazon Relational Database Service

RDS Proxy 사용 대상 계획 RDS Proxy를 사용하여 가장 많은 혜택을 누릴 수 있는 DB 인스턴스, 클러스터 및 애플리케이션을 결정할 수 있습니다. 이렇게 하려면 다음 요소를 고려하십시오. “연결이 너

docs.aws.amazon.com

 

Summary:

AWS PostgreSQL JDBC는 GA 후 테스트를 거쳐 사용하는 건을 권장드리고 Amazon RDS Proxy에 대해서는 간단하게만 언급드리며 해당 서비스에 궁금점이 있는 경우 요청을 주시면 따로 설명 세션을 준비하겠습니다.

 

References:

반응형