Насколько я могу судить, эта проблема изолирована от PowerDNS. На серверах работают два пакета pdns-static-3.0.1-1.i386.rpm
и pdns-recursor-3.3-1.i386.rpm
в самой последней версии Amazon Linux.
Балансировщикам нагрузки amazon ec2 назначается CNAME с несколькими хостами. Ниже приведен пример реального поведения. Обратите внимание, что хосты всегда находятся в одном порядке.
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
Ожидаемое поведение - круговой алгоритм для хозяев
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
[root@localhost ~]# host cache.domain.com
cache.domain.com is an alias for xxxxx.us-east-1.elb.amazonaws.com.
xxxxx.us-east-1.elb.amazonaws.com has address aaa.aaa.aaa.aaa
xxxxx.us-east-1.elb.amazonaws.com has address bbb.bbb.bbb.bbb
Адреса в конечном итоге меняются местами, но кажется, что таймер кеширования 30 минут, изменение TTL записи, похоже, ни на что не влияет. Похоже, что у распознавателя есть кеш ответа. Это отрицательно сказывается на моем приложении, потому что вся нагрузка отправляется только на один из балансировщиков нагрузки (зоны доступности), поэтому, если у меня есть серверы в двух зонах, тогда только одна зона находится под нагрузкой за раз.
Вы знаете, как я могу это исправить, чтобы каждый раз при разрешении хоста порядок адресов менялся.
ЦИФРОВОЙ ВЫХОД
; DiG 9.7.6-P1-RedHat-9.7.6-1.P1.18.amzn1 cache.domain.com ;; global options: +cmd ;; Got answer: ;; HEADER opcode: QUERY, status: NOERROR, id: 54610 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: cache.domain.com. IN A ;; ANSWER SECTION: cache.domain.com. 100 IN CNAME xxxxx.us-east-1.elb.amazonaws.com. xxxxx.us-east-1.elb.amazonaws.com. 3 IN A aaa.aaa.aaa.aaa xxxxx.us-east-1.elb.amazonaws.com. 3 IN A bbb.bbb.bbb.bbb ;; Query time: 0 msec ;; SERVER: ccc.ccc.ccc.ccc#53(ccc.ccc.ccc.ccc) ;; WHEN: Mon Jul 2 15:09:27 2012 ;; MSG SIZE rcvd: 130
Конфигурация рекурсора
allow-from=0.0.0.0/0 dont-query= local-address=127.0.0.1 local-port=530 # Port should be changed to 530 because its not good to run on the same port as dns server quiet=yes setgid=pdns setuid=pdns disable-packetcache= packetcache-ttl=0 forward-zones=domain.local=LOCALIP,domain.cloud=LOCALIP # Forward the two zones we care about back to the local dns server forward-zones-recurse=amazonaws.com=172.16.0.23,compute-1.internal=172.16.0.23 # Forward queries for amazons domains to the resolver for amazon
РЕШЕНИЕ
добавьте следующие строки в recursor.conf
disable-packetcache=
packetcache-ttl=0
добавьте следующую строку в pdns.conf
recursive-cache-ttl=0
Рекурсор PowerDNS кэширует на двух уровнях.
Он кэширует ответы от авторитетных серверов до TTL, указанного в полученном ответе (ограничивается max-cache-ttl, но никогда не превышает TTL, полученный от auth).
Кроме того, когда генерируется и отправляется ответный пакет от рекурсора клиенту (ваши клиенты, которые генерируют нагрузку), этот пакет кэшируется целиком, так что на тот же вопрос можно ответить очень быстро (без какого-либо анализа), если он снова входит. Это называется кешем пакетов.
Между этими двумя уровнями происходит перемешивание. Это означает, что ваши результаты на самом деле перемешиваются, но порядок их перемешивания поддерживается кешем пакетов (по умолчанию до часа). Если вы хотите перемешивать каждый ответ, установите «disable-packetcache» или «packetcache-ttl = 0».
Не обязательно «исправление» - но нужно ли вам использовать CNAME из вашего приложения, а не напрямую запрашивать базовую запись A? По-видимому, сопоставление записи CNAME => A меняется не так часто.
Иногда на самом деле достаточно простейших глупых исправлений, и вам не придется решать все мировые проблемы только для того, чтобы получить нужные вам результаты!