有没有办法增加 DNS 缓存 TTL 在网络



当 Netty 收到来自主机名称服务器的响应时,主机名已成功解析。一段时间后(不到一分钟),当没有收到来自名称服务器的同一主机的响应时,netty 抛出了 io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException 异常。我们可以设置一些缓存 TTL 来解决此类问题吗?

Netty 请求 dns 主机名:hostname.removed.by.me.com

2019-01-21 21:38:30,204+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0x00c6985d] WRITE: [17454: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0x00c6985d] WRITE: [22100: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0xf7e571f5] WRITE: [7006: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-4] DEBUG - [id: 0xf7e571f5] WRITE: [643: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)

已成功解决:

2019-01-21 21:38:30,205+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0xf7e571f5] RECEIVED: [643: /10.12.1.197:53], DatagramDnsResponse(from: /10.12.1.197:53, to: /0:0:0:0:0:0:0:0:51179, 643, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
    DefaultDnsRawRecord(removed.by.me.com. 28 IN SOA 66B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,206+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0xf7e571f5] RECEIVED: [7006: /10.12.1.197:53], DatagramDnsResponse(from: /10.12.1.197:53, to: /0:0:0:0:0:0:0:0:51179, 7006, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
    DefaultDnsRawRecord(hostname.removed.by.me.com. 11 IN A 4B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,206+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0x00c6985d] RECEIVED: [22100: /10.12.1.198:53], DatagramDnsResponse(from: /10.12.1.198:53, to: /0:0:0:0:0:0:0:0:51178, 22100, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
    DefaultDnsRawRecord(removed.by.me.com. 433 IN SOA 66B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)
2019-01-21 21:38:30,207+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] DEBUG - [id: 0x00c6985d] RECEIVED: [17454: /10.12.1.198:53], DatagramDnsResponse(from: /10.12.1.198:53, to: /0:0:0:0:0:0:0:0:51178, 17454, QUERY(0), NoError(0), RD RA)
    DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
    DefaultDnsRawRecord(hostname.removed.by.me.com. 11 IN A 4B)
    DefaultDnsRawRecord(OPT flags:0 udp:4000 0B)

不到一分钟后,再次请求相同的主机名的 dns。

2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0x00c6985d] WRITE: [51012: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0x00c6985d] WRITE: [18882: /10.12.1.198:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)
2019-01-21 21:39:19,278+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0xf7e571f5] WRITE: [51838: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN A)
2019-01-21 21:39:19,279+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-1] DEBUG - [id: 0xf7e571f5] WRITE: [32353: /10.12.1.197:53], DefaultDnsQuestion(hostname.removed.by.me.com. IN AAAA)

没有收到来自名称服务器的响应,netty 抛出了异常:

2019-01-21 21:39:24,279+0000 [toe=00d7vsrry4eguu] [redisson-netty-17-6] ERROR - Unable to resolve hostname.removed.by.me.com io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Search domain query failed. Original hostname: 'hostname.removed.by.me.com' failed to resolve 'hostname.removed.by.me.com' after 2 queries 
    at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:845) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:806) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:333) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:322) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext.access$500(DnsResolveContext.java:62) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsResolveContext$3.operationComplete(DnsResolveContext.java:379) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:121) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext.setFailure(DnsQueryContext.java:216) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext.access$300(DnsQueryContext.java:43) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.resolver.dns.DnsQueryContext$4.run(DnsQueryContext.java:166) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:127) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462) [netty-transport-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.30.Final.jar:4.1.30.Final]
    at java.lang.Thread.run(Thread.java:745) [?:1.7.0_60]
Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/10.12.1.197:53] query timed out after 5000 milliseconds (no stack trace available)

有什么方法可以增加 DNS 缓存 TTL 以免发生此类问题?

DefaultDnsCache 类中有一个构造函数,该构造函数具有用于设置缓存条目的最小和最大 TTL 的参数。 如果要使用 DnsNameResolverBuilder 构建解析器,并为其提供配置了最小 TTL 的解析器缓存,则可能有助于解决您的问题。

但是,您应该警惕将最小 TTL 设置得太高,因为这可能会导致更阴险的中断......当权威服务器将 TTL 设置为较小的值以允许传播 DNS 更改时。

我还建议您研究一下为什么TTL如此之小。 管理员可能需要修复它。

未从名称服务器收到同一主机的响应时

此问题已在 Redisson 2.15.1/3.10.1 中得到解决

最新更新