有什么办法可以增加 netty 中的 DNS 缓存 TTL?
Is there any way to increase DNS cache TTL in netty?
当 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.access0(DnsResolveContext.java:62) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
at io.netty.resolver.dns.DnsResolveContext.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.access0(DnsQueryContext.java:43) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
at io.netty.resolver.dns.DnsQueryContext.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.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
class 中有一个构造函数,它具有用于设置缓存条目的最小和最大 TTL 的参数。如果您要使用 DnsNameResolverBuilder
构建解析器并为其提供配置了最小 TTL 的解析器缓存,这可能有助于解决您的问题。
但是,您应该小心将最小 TTL 设置得太高,因为这可能会导致更隐蔽的中断......当权威服务器将 TTL 设置为较小的值以允许 DNS 更改传播时。
我还建议您研究一下为什么 TTL 这么小。管理员可能需要修复它。
when no response was received for the same host from nameservers
此问题已在 Redisson 2.15.1 / 3.10.1 中得到解决
当 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.access0(DnsResolveContext.java:62) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
at io.netty.resolver.dns.DnsResolveContext.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.access0(DnsQueryContext.java:43) [netty-resolver-dns-4.1.30.Final.jar:4.1.30.Final]
at io.netty.resolver.dns.DnsQueryContext.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.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
class 中有一个构造函数,它具有用于设置缓存条目的最小和最大 TTL 的参数。如果您要使用 DnsNameResolverBuilder
构建解析器并为其提供配置了最小 TTL 的解析器缓存,这可能有助于解决您的问题。
但是,您应该小心将最小 TTL 设置得太高,因为这可能会导致更隐蔽的中断......当权威服务器将 TTL 设置为较小的值以允许 DNS 更改传播时。
我还建议您研究一下为什么 TTL 这么小。管理员可能需要修复它。
when no response was received for the same host from nameservers
此问题已在 Redisson 2.15.1 / 3.10.1 中得到解决