도메인명에 매핑된 ip 정보가 있을 텐데 이를 캐싱처리를 하는 것이 -> DNS Caching
JVM단에서 이러한 캐싱 처리를 하고 있으니 -> JVM DNS Caching
VIP, GSLB와 같은 기능을 이용하는 경우 상황에 따라서
VIP의 경우에는 RIP가 변경될 수 도 있고
GSLB의 경우에는 매핑이나 비율이 바뀌어야 되는데
캐싱처리 영향으로 의도한 바가 정확히 동작하지 않을 수 있다.
보통의 HA(high availabilty)(고가용성)을 이루기 위해 VIP, GSLB 등을 사용한다.
이러한 상황을 방지하기 위해서 TTL 설정이 필요하다.
설정 방법
Java 8 버전 $JAVA_HOME/jre/lib/security/java.security
8 버전 이상 $JAVA_HOME/conf/security/java.security
networkaddress.cache.ttl=5 # 성공한 DNS 룩업에 대해 캐싱 여부
networkaddress.cache.negative.ttl # 실패한 DNS 룩업에 대해 캐싱 여부
설정값이 -1이면 TTL이 무한이고, 0이면 캐싱을 하지 않고 매번 조회한다는 의미이다.
InetAddressCachePolicy
해당 캐시값을 처리하는 코드를 확인해 보면 아래와 같다
- security의 설정 값을 먼저 읽고
- 없으면
- system의 설정 값을 읽는다 (sun.net.inetaddr.ttl)
- 없으면
- 디폴트 30초!
static {
Integer tmp = java.security.AccessController.doPrivileged(
new PrivilegedAction<Integer>() {
public Integer run() {
try {
String tmpString = Security.getProperty(cachePolicyProp);
if (tmpString != null) {
return Integer.valueOf(tmpString);
}
} catch (NumberFormatException ignored) {
// Ignore
}
try {
String tmpString = System.getProperty(cachePolicyPropFallback);
if (tmpString != null) {
return Integer.decode(tmpString);
}
} catch (NumberFormatException ignored) {
// Ignore
}
return null;
}
});
if (tmp != null) {
cachePolicy = tmp < 0 ? FOREVER : tmp;
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;
}
}
}