Your approach of using name servers from different providers (GoDaddy and DreamHost) is technically valid for redundancy. The DNS specification (RFC 1034) allows this configuration, often called "DNS delegation splitting" or "multi-provider DNS". Here's what happens in the background:
; Example DNS query response showing NS records
example.com. 86400 IN NS ns61.domaincontrol.com.
example.com. 86400 IN NS ns54.domaincontrol.com.
example.com. 86400 IN NS ns1.dreamhost.com.
example.com. 86400 IN NS ns2.dreamhost.com.
The warning from intoDNS indicates your authoritative servers have different Serial numbers in their SOA records. This is problematic because:
- DNS slaves use the Serial to determine if they need zone transfers
- Caching resolvers may get confused about which version is authoritative
- Some DNS software treats mismatched SOA as a configuration error
To maintain consistency while keeping multi-provider redundancy:
# Sample BIND zone file header showing proper SOA format
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. (
2023090101 ; Serial (YYYYMMDDNN)
3600 ; Refresh
900 ; Retry
604800 ; Expire
300 ) ; Negative TTL
Best practices for synchronization:
- Use a standardized serial number format (YYYYMMDDNN recommended)
- Implement DNS NOTIFY between primary servers
- Set up automated zone file distribution (rsync, Git, or provider APIs)
For programmers managing DNS programmatically:
// Python example using dnspython to check SOA consistency
import dns.resolver
def check_soa_consistency(domain):
ns = dns.resolver.resolve(domain, 'NS')
serials = set()
for server in ns:
try:
answer = dns.resolver.resolve(domain, 'SOA',
raise_on_no_answer=False,
nameserver=str(server.target))
serials.add(answer.rrset[0].serial)
except:
continue
return len(serials) == 1
If maintaining SOA sync proves difficult, consider:
- DNS hosting providers with built-in multi-cloud support (AWS Route 53, Cloudflare)
- Primary/secondary setup where one provider slaves from another
- Anycast DNS solutions for true high availability
Following recent outages like GoDaddy's DNS disruption, many sysadmins are implementing multi-provider DNS configurations for failover protection. Your current setup with both GoDaddy and DreamHost nameservers is technically valid, but the SOA serial mismatch indicates synchronization issues that need addressing.
The SOA (Start of Authority) serial number acts as a version control mechanism for DNS zones. When IntoDNS reports "SOA serials not agreed," it means your nameservers are serving different serial numbers for the same zone, which can cause DNS propagation problems.
For a multi-provider DNS setup to work correctly:
- All nameservers must serve identical zone files
- SOA serial numbers must match across all providers
- Changes must propagate simultaneously to all providers
Here's how to synchronize SOA serials using provider APIs:
# Python example using GoDaddy and DreamHost APIs
import requests
def update_dns_serial(domain, new_serial):
# GoDaddy API call
godaddy_headers = {
"Authorization": "sso-key YOUR_API_KEY",
"Content-Type": "application/json"
}
godaddy_data = {
"serial": new_serial
}
requests.patch(
f"https://api.godaddy.com/v1/domains/{domain}/records/SOA",
headers=godaddy_headers,
json=godaddy_data
)
# DreamHost API call
dreamhost_params = {
"key": "YOUR_API_KEY",
"cmd": "dns-update_record",
"record": domain,
"type": "SOA",
"value": f"ns1.dreamhost.com hostmaster.{domain} {new_serial} 3600 600 86400 3600"
}
requests.post(
"https://api.dreamhost.com/",
params=dreamhost_params
)
Instead of manually synchronizing, consider setting up a proper primary-secondary relationship:
# BIND named.conf example for secondary server
zone "example.com" {
type slave;
masters { 192.0.2.1; }; # Primary server IP
file "/var/named/slaves/db.example.com";
};
Implement checks to ensure serial numbers remain synchronized:
#!/bin/bash
# Check SOA serials across nameservers
DOMAIN="example.com"
NAMESERVERS=("ns61.domaincontrol.com" "ns54.domaincontrol.com" "ns1.dreamhost.com")
SERIALS=()
for ns in "${NAMESERVERS[@]}"; do
SERIAL=$(dig SOA $DOMAIN @$ns +short | awk '{print $3}')
SERIALS+=("$SERIAL")
done
UNIQUE_SERIALS=$(echo "${SERIALS[@]}" | tr ' ' '\n' | sort -u | wc -l)
if [ "$UNIQUE_SERIALS" -gt 1 ]; then
echo "WARNING: SOA serial mismatch detected"
exit 1
fi