tonight's exchanges here related to "use-stale" seem discordant to me.
i'd like to play the straight man for a moment and ask some indulgent
person to bring me up to speed by way of correcting my impressions.
the DNS TTL field is a state management variable. in this case the held
state is in the form of cached RRsets, and the TTL associated with the
RRset describes the period of time during which they can be reused. by
the original DNS specifications, after this reuse period, these RRsets
are to be discarded, and if the data is still needed, it is re-fetched.
in practice, TTL expiry is often not discovered until the records are
about to be reused; this avoids the cpu and memory bandwidth costs of
sweeping the cache periodically in search of expiration-ready RRsets,
and avoids the additional state requirements of threading these RRsets
by TTL in addition to the standard cost of threading them by recency of
use (to facilitate LRU based purge when the cache reaches its limit.)
what this practice leads to is a "sudden concurrent need" for the RRset
at the precise moment when it is being discarded.
in order to avoid simultaneous "not having" and "great need", some RDNS
servers do in fact sweep their caches or perhaps thread their RRsets by
TTL expiration, in order to pre-launch a refreshment query when the TTL
still has some fraction (like 5%) or period (like one minute) remaining.
this is non-ideal since we often find that we're refreshing data that
will not be used soon or perhaps ever. work is underway by several teams
to find a "tuning set" of variables and thresholds which will better
predict reuse in order to avoid refresh costs for non-reuse.
another method that's been deployed of avoiding simultaneous "don't
have" with "great need" is to liberally reinterpret TTL such that RRsets
can be reused beyond their explicit TTL lifetime, while their refresh
queries proceed in the background. commonly, the authority servers
responsible for answering these refresh events are down or unreachable
at the time of most acute need. therefore the term "serve stale" to
indicate a state management method whereby stale (beyond its TTL) data
is served for some period of time, measured in minutes or hours, until
the authority server can be reached to either refresh the RRsets or
verify that they have in fact disappeared.
the danger of TTL stretching is that reuse beyond TTL may cause RRsets
that are in fact supposed to be unreachable, to be effectively
reachable. examples include security-related takedown of criminal DNS
servers or networks, or failover strategies where end systems will not
try to reach their backup servers unless they cannot reach their primary
servers, and the unreachability of those primary servers is hidden from
them by TTL stretching. fundamentally, an RRset and its TTL are the
property of the zone administrator, and it's controversial for any other
party to use this data beyond its specified use parameters.
all of this trouble comes from DNS's use of a single state variable
(TTL) to represent usability lifetime, rather than two such variables,
one indicating the periodicity of refresh, the other indicating the
periodicity of discard. many of us would like our data to be rechecked
hourly by all caching servers who store it, but used for days or weeks
if we become unreachable by some or all of those servers. using one
variable for two purposes represents an inconvenient compromise which
often provides "no right answer" as to setting. therefore an idealized
solution would be to provide a second variable, and where that second
variable is present, the meaning of the existing variable (TTL) could be
subtly altered to support a two-variable setting.
therefore a "serve stale" team within IETF-DNSOP was convened, to try to
standardize the methods and signal patterns necessary to extend the
usability lifetime of records when their authority servers are not
reachable at the time of normal TTL-based expiry. most of us recognize
that TTL's will continue to be stretched no matter what changes are or
are not made to the specification, and so we expect the resulting RFC to
document current practice _without recommending it_ and to also document
a new practice _with recommendations_ as to its proper uses.
there are hangups in signaling options due to the sloppy specification
for EDNS, about which the author of EDNS0 feels just awful, believe me.
however, we are all relatively sure that EDNS can be used to encode a
desire for new state management behaviour, within the limitation that
EDNS must first be signaled by the initiator before it can be answered
by a responder, and we might wish it otherwise. that's why it was
important to realize that if _any_ EDNS option is provided by an
initiator, then _any_ EDNS option can be provided by a responder. in
theory this means we could provide state management options in a
response without having heard any state management options in a request
-- so long as some form of EDNS was in fact used in the request. it's
not yet clear that this evasive maneuver will be required, however.
the most straightforward signaling would be for an RD=0 initiator
(normally a recursive DNS server) to ask some or all of its responders
(normally authority servers) for permission to stretch the TTL. some
responders will not answer this signal at all, some will say no, and
some will say yes and give maximum tension values for the RRsets
contained in the answer and authority sections -- but not for the
additional section since that data might have a different authority
server and may only be present as "glue". the new tension variable might
be "maximum stretch interval" in which case the RRset's TTL _in this
answer or authority section_ would be interpreted as a refresh interval.
this system would allow gradual insertion of the new state management
logic on an opportunistic basis -- motivated authority and recursive
server operators, which would include CDN operators who must perform
both services perfectly -- would be early adopters, and like ECS before
it, the "hot" part of the community would be upgraded years earlier than
the last outlier.
noone has proposed any new signaling between the stub and the recursive,
but it's possible that a stub may want a true TTL and so we might add
signaling from the stub (as initiator) saying, don't stretch, or perhaps
saying, if this is a stretched TTL, tell me so explicitly.
if this understanding isn't wrong or incomplete, then i fail to see why
there would be any drama that would prevent the construction of a draft.
--
P Vixie
_______________________________________________
DNSOP mailing list
DNSOP@ietf.org
https://www.ietf.org/mailman/listinfo/dnsop