Pdns round robin: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показана 1 промежуточная версия этого же участника)
Строка 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>
 
<PRE>
 
delimiter //
 
delimiter //

Текущая версия на 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 ;