Easy to play armchair quarterback, but if each server is storing the complete list, why not just use a queue to push out the change?
for {
message = blockWaitingForMessage()
if message.action == "add" {
lock()
blacklist[message.domain] = true
unlock()
}
}
On startup you'd need to bootstrap a server. Use a database as your source of truth, and wrap an internal-only api to fetch all domains.