Pdns round robin: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:Linux]] |
||
+ | [[Категория:PowerDNS]] |
||
=PowerDNS Round-Robin= |
=PowerDNS Round-Robin= |
||
− | Захотелось следующюю фичу - отдавать строго один IP из списка, что бы |
+ | Захотелось следующюю фичу - отдавать строго один IP из списка, что бы лишить потенциально глючных клиентов возможности выбора. |
− | В конфигурации по-умолчанию если есть более чем одна запись, то клиенту отдается список. |
+ | В конфигурации по-умолчанию если есть более чем одна запись, то клиенту отдается список. |
+ | Кроме того что выбор адреса из списка оставляется на усмотрение клиента, в случае больших конфигураций ответ от сервера может оказаться слишком большим. |
||
==PowerDNS - исправления в коде== |
==PowerDNS - исправления в коде== |
||
Все изменения только в файле |
Все изменения только в файле |
||
Строка 11: | Строка 14: | ||
declare(suffix,"id-query","Basic with ID query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name='%s' and domain_id=%d ORDER BY RAND() limit 1"); |
declare(suffix,"id-query","Basic with ID query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name='%s' and domain_id=%d ORDER BY RAND() limit 1"); |
||
</PRE> |
</PRE> |
||
− | Для ANY (any-id-query) ситуация чуть сложнее из-за того что параметры передаются в запрос, но по факту их нужно использовать 2 раза. потому - пришлось написать |
+ | Для ANY (any-id-query) ситуация чуть сложнее из-за того что параметры передаются в запрос, но по факту их нужно использовать 2 раза. потому - пришлось написать хранимую процедуру. |
<PRE> |
<PRE> |
||
declare(suffix,"any-id-query","Any with ID query","CALL AnyIdQuery('%s', %d)"); |
declare(suffix,"any-id-query","Any with ID query","CALL AnyIdQuery('%s', %d)"); |
||
Строка 17: | Строка 20: | ||
==MySQL - хранимая процедура== |
==MySQL - хранимая процедура== |
||
+ | Процедура достаточно простая. |
||
+ | Задача - выдавать только одну запись для типа А, при этом для других типов - ограничений нет |
||
+ | <PRE> |
||
+ | delimiter // |
||
+ | create procedure AnyIdQuery(in DomainName varchar(64), in DomainId int) |
||
+ | begin |
||
+ | ( SELECT content,ttl,prio,type,domain_id,name from records where type != 'A' and name=DomainName and domain_id=DomainId ) UNION ALL ( select content,ttl,prio,type,domain_id,name from records WHERE type='A' and name=DomainName and domain_id=DomainId ORDER BY RAND() LIMIT 1 ); |
||
+ | end; |
||
+ | // |
||
+ | delimiter ; |
||
+ | </PRE> |
Текущая версия на 15:26, 5 сентября 2014
PowerDNS Round-Robin
Захотелось следующюю фичу - отдавать строго один IP из списка, что бы лишить потенциально глючных клиентов возможности выбора. В конфигурации по-умолчанию если есть более чем одна запись, то клиенту отдается список. Кроме того что выбор адреса из списка оставляется на усмотрение клиента, в случае больших конфигураций ответ от сервера может оказаться слишком большим.
PowerDNS - исправления в коде
Все изменения только в файле
gmysqlbackend.cc
Меняю 2 строки
Добавляю limit 1 и рандомную сортировку
declare(suffix,"id-query","Basic with ID query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name='%s' and domain_id=%d ORDER BY RAND() limit 1");
Для ANY (any-id-query) ситуация чуть сложнее из-за того что параметры передаются в запрос, но по факту их нужно использовать 2 раза. потому - пришлось написать хранимую процедуру.
declare(suffix,"any-id-query","Any with ID query","CALL AnyIdQuery('%s', %d)");
MySQL - хранимая процедура
Процедура достаточно простая. Задача - выдавать только одну запись для типа А, при этом для других типов - ограничений нет
delimiter // create procedure AnyIdQuery(in DomainName varchar(64), in DomainId int) begin ( SELECT content,ttl,prio,type,domain_id,name from records where type != 'A' and name=DomainName and domain_id=DomainId ) UNION ALL ( select content,ttl,prio,type,domain_id,name from records WHERE type='A' and name=DomainName and domain_id=DomainId ORDER BY RAND() LIMIT 1 ); end; // delimiter ;