-
Notifications
You must be signed in to change notification settings - Fork 1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ttl 的默认值不正常 #1756
Comments
另外假设这个问题已被解决,默认的 ttl 变为同上游一致,那么缓存的预获取功能,究竟会被哪些选项所影响?
如果追加写入以下配置:
那么 smartdns 会主动进行轮询,效果应当如下:
考虑文档说明:
如果追加写入以下配置:
效果应当如下:
而如果此时增加
即一旦配置预获取,ttl 就会变得无意义?不知道理解是否有误? smartdns 在何时会进行预获取?或者说
另外文档提到频繁更新的 dns 记录会有问题,请问具体是什么问题呢?没太读懂,还望解释一下,谢谢。 |
首先我不主张修改ttl,ttl应该有域名所有者自主决定。 我的设置
以域名 ntp.17xiu8.com 为例,域名所有者(也就是我)设置ttl为3600。使用上游 119.29.29.29 查询ttl为3600。 综上根据我的测试结果,我认为rr-ttl-min没有将所有的域名ttl改为1,符合预期;rr-ttl-max 和 rr-ttl-reply-max 也符合预期。 |
并不希望修改 ttl,主要是 rr-ttl-min 的默认值并非是预期的。 |
你就把它设的足够小嘛。 |
关于 workaround 的话,#1756 (comment) 里已经补充过了,但非预期行为属于 bug,可以看下怎么能修掉。 |
rr-ttl-min 3600 会导致写入缓存的ttl最小值为3600
建议将这部分经常改变的域名不缓存,且不能使用阿里作为上游
能否明确的说一下 哪个配置导致了哪个非预期行为。1楼说得当上游返回ttl大于 rr-ttl-min 时也会被改成rr-ttl-min 在我这没法重现,我自己也没遇到过这个问题。
这样设置的话会有两种可能。一是在缓存的ttl降到0后的43200秒发起预读,此期间如果有客户端查询将收到ttl=5(由serve-expired-reply-ttl 定义)的结果;二是这个域名一段时间没有客户端查询不触发预读,缓存ttl降到0后的345600(会生效吗?就我所知最大有效值应该是65534)秒从缓存中删掉这个记录。
我认为ttl值在记录没有过期时是有意义的,它指示客户端应保留记录(缓存)多久。预读是增加有效缓存,加快下游查询应答速度的手段,不能改变或代替记录ttl值的功能。 |
tll-min的值默认设置为600这个是为了避免上游返回TTL过小,导致的客户端频繁查询问题。 如果是你自己内部的一些域名要IP频繁变化,可以用domain-rule来设置ttl值。 |
@PikuZheng
大部分域名倒是不会频繁改动,这里主要是顺便多问一些,毕竟目前没有监看面板等功能,也没法知道哪些域名会频繁改变。另外,多久变一次算得上经常改变?是否能简单说一下原因为何不能?cloudflare 呢?
owner 已回复该问题,既然算预期行为,那么便属于是文档未同步,修改下即可。
那么在缓存的 ttl 降到 0 后,未到 serve-expired-prefetch-time 规定的秒数,客户端就发起了查询,是否也会收到 ttl=5(由 serve-expired-reply-ttl 定义),并同时向上游做查询?
看来默认值确实为 600,建议把文档更新一下,否则容易产生误导,谢谢。 |
@pymumu 这个已经读过了,就是读后才有上面的疑问 |
是的,大部分域名解析都不会频繁改变。腾讯云认为“频繁改变的域名,应(域名所有者)将ttl设为60”(但是允许最小设置为1)。
正确
设置为0逻辑上不通,应该是无效值 |
Lines 1611 to 1616 in 07c1382
serve-expired-prefetch-time 0 时,将其值改为 serve-expired-ttl 的一半且不超过28800 |
原来如此,阿里云的具体缓存行为倒是没注意到,cf 生效非常快,可算是即时更新的。
了解,这里只是假设,意思就是一旦缓存 ttl 过期,就尽快发起预读,比如假设这个值是 1 的话,是不是有一个周期为 ttl+1 的循环,不断进行预读? |
时间上是正确的,但是否预读取决于下游查询这个域名的频率。一段时间没有下游查询,就不预读了 |
这个应该意思是缓存超时后就不预读吧,还是另有其他值,比如在未过期前预读 n 次?伪代码应该类似下面这样?
然后其中的 |
就我所知是否预读有复杂算法 参考 #1016 (comment) |
@PikuZheng 感谢解惑,还有一个问题,如果禁用缓存,是不是意味着每次客户端查询,都将会进行一次向上游的查询,并且会附带 经过计算的 ttl? |
下面给出我的配置和理解(如果有误欢迎指正),供以后他人参考:
不考虑是否做预读的这一层判断,假设过期前会一直更新。
|
正确
查询没有ttl,应答才有。在不缓存的情况下,ttl值应该是上游应答的值 |
问题现象
ttl 相关的默认值在文档中为“远程查询结果”:
但实测却发现并非是这样,
rr-ttl-min
的默认值貌似为 600。另外对于上游 ttl 为一天的记录,设置
rr-ttl-min 60
后,下发的 ttl 也会变为 60……,这不是 rr-ttl 的效果嘛,怎么rr-ttl-min
也这样……运行环境
重现步骤
本机配置 dns server 到 smartdns,
配置上游域名 test1m.scruel.com 的 ttl 为一分钟,随后执行 dig,可见 dig 结果中的 ttl 是十分钟即 600,而不是上游的 60:
改用 1.1.1.1 做 dig 则正常获得 ttl 为 60 的结果:
信息收集
The text was updated successfully, but these errors were encountered: