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에 설정 가능한 파라미터
다음 파라미터를 적극적으로 설정하면 애플리케이션을 한 호스트에 연결하기 위해 너무 오래 기다리지 않도록 할 수 있습니다.
|
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 에서도 자세한 설명을 확인 할 수 있습니다.
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
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/rds-proxy-planning.html
Summary:
AWS PostgreSQL JDBC는 GA 후 테스트를 거쳐 사용하는 건을 권장드리고 Amazon RDS Proxy에 대해서는 간단하게만 언급드리며 해당 서비스에 궁금점이 있는 경우 요청을 주시면 따로 설명 세션을 준비하겠습니다.
References:
- Amazon Web Services JDBC Driver for PostgreSQL: GitHub - awslabs/aws-postgresql-jdbc: Note: The Amazon Web Services (AWS) JDBC Driver for PostgreSQL project has moved to a new repository. Visit us at our new repository for the latest version and information (link below). The Amazon Web Services (AWS) JDBC Driver for PostgresSQL is a driver that enables applications to take full advantage of the features of clustered PostgreSQL databases.
- JVM Networking Properties: Networking Properties (Java SE 11 )
- Aurora PostgreSQL Best Practices: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.html#AuroraPostgreSQL.BestPractices.FastFailover.Configuring.Timeouts
- Amazon Aurora Database Administrator’s Handbook: https://d1.awsstatic.com/whitepapers/RDS/amazon-aurora-connection-management-handbook.pdf
'고기 대신 SW 한점 > Public Cloud' 카테고리의 다른 글
Autoscaling+HPA - Kubernets Probes with Sprint Boot App (0) | 2023.02.02 |
---|---|
Autoscaling+HPA - Instance Type Profiling (0) | 2023.02.01 |
Istio - Observability (0) | 2023.01.17 |
[Public Cloud] Pod test (0) | 2023.01.10 |
[Public Cloud] Kyverno ? (0) | 2023.01.10 |