JVM의 DNS Cache 설정에 따른 갱신시간 테스트

오규석
NAVER Pay Dev Blog
Published in
56 min readMar 7, 2023

안녕하세요. 네이버파이낸셜 카드결제개발팀 오규석입니다.

이번 포스팅에서는 JVM 에서의 DNS Cache가 무엇인지, 그리고 DNS Cache 설정값을 언제 어떤 상황에서 변경해야 하는지에 대해 테스트 및 리서치를 통해 알아본 결과를 공유하고자 합니다.

1. 테스트 동기

네이버파이낸셜에서 어떠한 장애 상황이 발생하더라도 카드결제 관련 서비스를 안정적으로 제공하기 위해 기존 서버 이중화를 넘어서는 DR(Disaster Recovery) 시스템 구축을 진행 중입니다. 이 때 DR의 핵심 목적인 High Availability 및 High Reliability를 달성하고자 GSLB를 도입하게 되었습니다.

GSLB는 Global Server Load Balancing의 약자로써 말 그대로 여러 리전에 분산된 서버들에 대한 로드밸런서로써의 역할을 수행하게 됩니다. GSLB는 통상시에는 DNS와 유사하게 GSLB의 도메인으로 요청한 주소에 대한 IP 를 로드밸런싱 기능을 통해 제공합니다. 하지만 일반적인 DNS와는 달리 GSLB는 각 서버에 대한 헬스체크 기능을 수행하기 때문에 GSLB에 어떤 요청을 할 때 장애가 발생하거나 기타 이유로 가용하지 않는 서버의 IP는 제외하고 가용한 서버의 IP만을 제공한다는 차이점이 존재합니다.

이 때 GSLB의 특징에서 언급한 바와 같이 GSLB는 DNS 기반으로 동작하기 때문에 아무리 GSLB가 헬스체크를 통해 가용한 서버의 IP만을 제공한다고 할지라도 정작 해당 도메인에 요청을 보내고자 하는 JVM에 위치한 서버 또는 클라이언트 애플리케이션이 기존 도메인에 매핑된 가용하지 않는 서버 IP를 사용하게 된다면 정작 구축해놓은 GSLB 환경이 아무 소용이 없을 것입니다.

이에 따라 본 포스팅에서는 통상적으로 서버 애플리케이션 개발에 사용되는 Spring Boot 및 Java 환경에서 OS 또는 DNS에서 도메인에 해당하는 IP 매핑값이 반영되는 시간이 어느 정도일지 알아보기 위해 테스트를 수행하였으며, 추가적으로 실험되지 않은 환경에서는 어떻게 작동하는지 리서치한 결과를 공유드리고자 합니다.

2. 테스트 환경

테스트 시 사용한 환경은 다음과 같으며, JDK 설정은 추가 설정이 없는 기본값을 따랐습니다.

  1. Macbook Pro(16형, 2021년 모델), Apple M1 Pro, 32GB RAM
  2. Mac OS
  3. OpenJDK 1.8, Hotspot (temurin-8.jdk)

3. 테스트 절차

테스트는 통상적인 Java 8 버전 JVM 및 Spring Boot 환경하에서의 수행을 확인하기 위해 Local 맥북 환경하에서 다음 과정에 따라 테스트를 수행하였습니다.

  1. Hosts 파일에 특정 Domain Name에 대한 IP를 최초 127.0.0.1로 설정
  2. 테스트 프로그램 시작
  3. 테스트 프로그램상에서 최초 IP 또는 변경된 IP가 확인되면 hosts 파일 내 IP를 127.0.0.2 ~ 127.0.0.4 까지 점진적으로 증가시키며 JVM상에서 변경된 IP가 적용되는지 확인

4. 테스트 코드

테스트 시 사용된 코드는 다음과 같습니다.

  • DnsTestApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DnsTestApplication {
public static void main(String[] args) {
SpringApplication.run(DnsTestApplication.class, args);
}
}
  • DnsTestListener.java
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.Executors;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class DnsTestListener implements ApplicationListener<ApplicationStartedEvent> {
@Value("${url.dns.test}")
private String dnsAddress;
private final DnsTestRunner dnsTestRunner = new DnsTestRunner();
private boolean isRunning = true;

@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
Executors.newSingleThreadExecutor().execute(dnsTestRunner);
}

@PreDestroy
public void destroy() {
isRunning = false;
}

public class DnsTestRunner implements Runnable {
@Override
public void run() {
while(isRunning) {
log.info("--------------------------------------------------------");
log.info("DNS Test ADDR: {}", dnsAddress);
try {
log.info("Result IP: {}", InetAddress.getByName(dnsAddress));
} catch (UnknownHostException e) {
log.error("DNS \"{}\" is UnknownHost", dnsAddress);
}

// 3초 sleep
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dns.test</groupId>
<artifactId>dns-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dns-test</name>
<description>dns-test</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
  • application.properties
server.port=28080
url.dns.test=www.naverdnstesturlforgslb.com

5. 기본 JVM 설정에서 테스트 결과

테스트 결과 로그는 다음과 같습니다.

테스트 결과의 로그시간과 IP를 확인해본 결과 약 30초 간격으로 변경된 DNS가 JVM에 반영되는 것을 확인하였습니다.

2022-10-24 18:11:03.151  INFO 54568 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 28080 (http)
2022-10-24 18:11:03.156 INFO 54568 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-10-24 18:11:03.156 INFO 54568 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-24 18:11:03.249 INFO 54568 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-10-24 18:11:03.249 INFO 54568 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1148 ms
2022-10-24 18:11:03.628 INFO 54568 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 28080 (http) with context path ''
2022-10-24 18:11:03.642 INFO 54568 --- [ main] c.d.t.dnstest.DnsTestApplication : Started DnsTestApplication in 2.033 seconds (JVM running for 2.677)
2022-10-24 18:11:03.643 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:03.643 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:03.689 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:06.695 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:06.695 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:06.695 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:09.699 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:09.699 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:09.699 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:12.703 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:12.704 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:12.704 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:15.711 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:15.722 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:15.722 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:18.723 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:18.724 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:18.724 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:21.728 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:21.728 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:21.728 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:24.733 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:24.733 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:24.733 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:27.738 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:27.740 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:27.740 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:30.742 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:30.744 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:30.744 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-24 18:11:33.748 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:33.752 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:33.767 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:36.769 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:36.771 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:36.772 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:39.774 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:39.776 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:39.777 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:42.782 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:42.783 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:42.783 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:45.786 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:45.786 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:45.787 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:48.793 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:48.799 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:48.809 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:51.815 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:51.818 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:51.818 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:54.821 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:54.822 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:54.823 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:11:57.827 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:11:57.828 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:11:57.828 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:12:00.833 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:00.833 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:00.833 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-24 18:12:03.839 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:03.840 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:03.859 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:06.860 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:06.861 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:06.861 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:09.862 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:09.863 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:09.863 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:12.865 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:12.868 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:12.868 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:15.874 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:15.875 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:15.876 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:18.881 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:18.881 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:18.881 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:21.884 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:21.885 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:21.885 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:24.891 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:24.899 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:24.902 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:27.904 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:27.905 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:27.905 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:30.908 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:30.908 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:30.908 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.3
2022-10-24 18:12:33.914 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:33.919 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:33.972 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.4
2022-10-24 18:12:36.973 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:36.974 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:36.974 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.4
2022-10-24 18:12:39.979 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-24 18:12:39.979 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-24 18:12:39.979 INFO 54568 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.4
Process finished with exit code 130 (interrupted by signal 2: SIGINT)

이에 따라 앞선 테스트의 결과를 정리하자면 다음과 같았습니다.

  1. 별도의 설정을 하지 않은 OpenJDK 8의 JVM 환경에서는 약 30초마다 JVM의 DNS 캐시를 변경하는 것으로 확인되었습니다.
  2. 다만 AWS 내 JVM TTL 설정 관련 문서 에서는 JVM에 대한 추가 설정 및 Security Manager 의 설정 여부에 따라 DNS 갱신시간(TTL)이 달라질 수 있거나 심지어 갱신 없이 무제한이 될 수도 있기에 명시적으로 설정하는 것을 권장하였습니다.
  3. 기타 여러 레퍼런스를 확인하여 보니 JVM의 버전에 따라 10초~30초로 버전 및 운영체제 종류 등의 환경에 따라서도 변화하는 것으로 보였습니다.

6. 추가 실험

앞선 실험 결과에서 언급하였듯이 여러 레퍼런스에서는 JVM TTL을 명시적으로 설정하는 방법에 대해 설명된 부분이 많았습니다. 이에 따라 추가적으로 JVM TTL을 직접 조정하였을 때의 결과는 어떻게 될것인지 추가 테스트를 기획하였습니다.

이에 따라 DNS 캐시의 TTL 시간을 10초 이내로 조정하기 위해 networkaddress.cache.ttlnetworkaddress.cache.negative.ttl 프로퍼티를 수정하여 JVM 상의 Positive Cache TTL 및 Negative Cache TTL을 1초로 변경 후 테스트를 수행하였지만, 실제 Cache내 만료 및 갱신시간은 그대로 30초로 변화가 없었습니다.

상세 추가 테스트 결과 로그는 아래와 같습니다.

2022-10-25 14:36:58.871  INFO 19611 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 28080 (http)
2022-10-25 14:36:58.875 INFO 19611 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-10-25 14:36:58.876 INFO 19611 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-25 14:36:58.998 INFO 19611 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-10-25 14:36:58.999 INFO 19611 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1440 ms
2022-10-25 14:36:59.464 INFO 19611 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 28080 (http) with context path ''
2022-10-25 14:36:59.477 INFO 19611 --- [ main] c.d.t.dnstest.DnsTestApplication : Started DnsTestApplication in 2.345 seconds (JVM running for 2.867)
2022-10-25 14:36:59.478 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:36:59.478 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:36:59.480 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:36:59.480 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:36:59.484 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:02.490 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:02.490 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:02.490 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:02.490 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:02.490 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:05.493 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:05.499 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:05.500 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:05.500 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:05.501 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:08.505 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:08.512 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:08.512 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:08.512 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:08.513 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:11.518 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:11.520 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:11.523 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:11.523 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:11.524 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:14.529 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:14.531 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:14.531 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:14.531 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:14.532 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:17.537 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:17.541 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:17.541 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:17.542 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:17.542 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:20.547 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:20.550 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:20.550 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:20.551 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:20.551 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:23.556 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:23.558 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:23.558 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:23.559 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:23.560 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:26.563 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:26.565 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:26.565 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:26.565 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:26.566 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.2
2022-10-25 14:37:29.570 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------
2022-10-25 14:37:29.582 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Cache TTL: 1 seconds
2022-10-25 14:37:29.582 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Negative Cache TTL: 1 seconds
2022-10-25 14:37:29.583 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : DNS Test ADDR: www.naverdnstesturlforgslb.com
2022-10-25 14:37:29.715 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : Result IP: www.naverdnstesturlforgslb.com/127.0.0.1
2022-10-25 14:37:32.720 INFO 19611 --- [pool-1-thread-1] c.d.t.dnstest.DnsTestListener : --------------------------------------------------------

해당 결과가 나오게 된 원인을 확인하기 위해 자바의 InetAddressCachePolicy.java 소스 코드를 분석해본 결과 security manger가 비활성되어있는 경우 설정값과 관계없이 DEFAULT_POSITIVE값인 30초를 TTL 시간으로 사용한다는것을 확인할 수 있었습니다.

...
package sun.net;
import java.security.PrivilegedAction;
import java.security.Security;
public final class InetAddressCachePolicy {
...
/* default value for positive lookups */
public static final int DEFAULT_POSITIVE = 30;

/* The Java-level namelookup cache policy for successful lookups:
*
* -1: caching forever
* any positive value: the number of seconds to cache an address for
*
* default value is forever (FOREVER), as we let the platform do the
* caching. For security reasons, this caching is made forever when
* a security manager is set.
*/
private static int cachePolicy = FOREVER;
...
static {
...
if (tmp != null) {
cachePolicy = tmp.intValue();
if (cachePolicy < 0) {
cachePolicy = FOREVER;
}
propertySet = true;
} else {
/* No properties defined for positive caching. If there is no
* security manager then use the default positive cache value.
*/
if (System.getSecurityManager() == null) {
cachePolicy = DEFAULT_POSITIVE;
}
}
...
}
...
}

이에 따라 JVM상에서 DNS 캐시의 TTL(time-to-live) 시간은 다음과 같이 정의할 수 있었습니다.

1. Security Manager를 설정하지 않은 경우

- 기본값: 30초 (변경불가, reflection 등을 쓰지 않는 한….)

2. Security Manager를 설정한 경우

- 기본값: 무한

- 설정값을 통해 변경 가능

7. 마치며

지금까지 JVM의 DNS Cache 설정에 따른 실제 갱신시간을 테스트를 통해 알아보았습니다. 서버가 구동되는 환경은 각각 다르고 모든 환경에서 테스트가 이루어진 것은 아니라 일반화할 수는 없지만, Java 또는 JVM 환경에서 작동하는 애플리케이션 개발 시 도메인에 할당된 IP가 중간에 변경되는 상황에 도움이 되시길 기대합니다.

--

--