Назад | Перейти на главную страницу

PowerDNS CNAME с несколькими записями A дает неожиданные результаты

Насколько я могу судить, эта проблема изолирована от 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 меняется не так часто.

Иногда на самом деле достаточно простейших глупых исправлений, и вам не придется решать все мировые проблемы только для того, чтобы получить нужные вам результаты!