Why saving the record doesn't move anyone
www.example.com, it usually doesn't ask your nameservers directly. It asks a recursive resolver: the one run by the visitor's ISP, their office network, or a public service like 8.8.8.8 or 1.1.1.1. That resolver fetches the answer from your authoritative nameservers once, then keeps it in cache for the number of seconds in the TTL (time to live) field and answers everyone else from that cache.
That cache is the whole point of DNS scaling, and it's also why failover isn't instant. Changing the record on your authoritative servers changes what they hand out to resolvers that ask from now on. It does nothing to the copies already sitting in thousands of resolver caches. There is no push mechanism that tells resolvers to forget an answer early. Each one holds on until its own countdown hits zero.
So the worst case is simple. A resolver fetched the record one second before you made the change. It will serve the old IP for almost the entire TTL. With a TTL of 86400 seconds, that's close to 24 hours of traffic going to a server that isn't there.
In support, this usually shows up as a confusing split: the site owner says the site is back because it loads for them, while some of their visitors still see timeouts. Both are telling the truth. They're just behind different resolvers with different cache ages.
What your effective RTO actually adds up to
- Detection time: how long until monitoring or a person notices the primary is down.
- Decision and change time: someone has to decide to fail over and make the edit, or a health-checked failover service has to flip the record automatically.
- Nameserver sync: if you run secondary nameservers, they need to pick up the new zone. With NOTIFY and zone transfers configured this is typically quick. If secondaries only check on the SOA refresh interval, it can take much longer, and during that window different nameservers give different answers.
- Resolver cache expiry: up to one full TTL of the record, as described above.
- Client-side caching: operating systems, browsers, and especially applications can hold on to resolved addresses on their own. Some apps resolve a hostname once at startup and never look again. Long-lived connection pools keep talking to the old IP until the connections break.
Checking what TTL the world is actually seeing
dig: ask your authoritative nameserver directly for the configured TTL, then ask a public resolver to see the remaining countdown in its cache.
BASH
# Configured TTL, straight from your authoritative nameserver
dig +noall +answer www.example.com A @ns1.your-dns-provider.example
# Remaining TTL in a public resolver's cache (run it twice and watch it drop)
dig +noall +answer www.example.com A @1.1.1.1TEXT
www.example.com. 86400 IN A 192.0.2.10
www.example.com. 61237 IN A 192.0.2.10192.0.2.10 for that long even if you changed the record a minute ago.
A couple of places hide long TTLs that people forget about:
- CNAME chains. If
wwwis a CNAME tolb.example.net, which points to an A record, each link is cached separately with its own TTL. A short TTL on the A record doesn't help if the CNAME in front of it has a long one and you need to change the CNAME target. - Nameserver delegation. If your failover plan involves switching to a different DNS provider, the NS records at the parent zone (the TLD) have their own TTL, set by the registry, and it's often long. You can see it with a non-recursive query to the TLD's servers, for example
dig +norecurse +noall +authority example.com NS @a.gtld-servers.netfor a.comdomain. That number is not something you can lower.
Lowering TTL only works if you did it earlier
The production pattern that keeps DR plans honest
BASH
# Print the configured TTL for each record a failover plan depends on
for name in www.example.com api.example.com; do
dig +noall +answer "$name" A @ns1.your-dns-provider.example
done