Yes, there is a propagation delay for DNS changes because of the way they are cached. The length of the delay is controlled by the TTL ("Time To Live") value for the record. If you have not explicitly set it to something else then it will be something between 3 and 24 hours depending on your registrar. Some registrars allow you to change the TTLs (and if you host your own DNS you have full control) though be aware that the change in TTL will take up to the old TTL's length to propagate.
To find out what your TTLs are set to, check if your registrar's control panel displays it. If not, then create a new sub-domain A record and run dig sub.domain.tld
. In the output you will get something like the following:
;; ANSWER SECTION:
sub.domain.tld. 3600 IN A 11.22.33.44
This shows that the TTL value is an hour (3,600 seconds). If you do it again a minute later you should see:
;; ANSWER SECTION:
sub.domain.tld. 3540 IN A 11.22.33.44
which means your local DNS cache will now recheck the value no sooner than in 59 minutes time.
By using a new sub-domain like this you know that the value is not already cached so you see the full TTL when you first query. dig
is available in just about every Linux setup (if it is not installed you will usually find it in the package "dnsutils") and is available for Windows via Cygwin (if you don't want a fuller Cygwin install, you could try partial copies like this one that includes just dig, host and whois.
One thing to remember is that if a user's DNS cache has not recently been asked about that particular name they will get the new value immediately on the next request so a TTL of two hours, so for the duration of the propagation period you should expect requests to both IP addresses.
If you control the machine pointed to by the old IP address and it does not run any other web sites, you could install a redirector like rinetd
to proxy connections to the new address. That way even people going to the old address will see the content from the new server (just a bit slower). If there are other domains hosted there you could use mod_proxy (or your web server's equivalent) to achieve the same end. Though if the propagation period is short enough, you could replace all pages for that site on that server with a "the site will be back within X hours" message which is obviously easier.
Alternatively, you could set the TTL very short a day or two before the change - that way the propagation delay will be short anyway. I actually have my TTLs permanently set to five minutes. Don't set it too short: technically a TTL of 0 should mean "never cache this value" but some buggy DNS caches and client software will ignore anything below a certain value and assume something higher instead.