Arquivo

Archive for outubro \13\UTC 2011

Postfix: balanceando carga de e-mails de saída entre vários links.

outubro 13, 2011 16 comentários

Existem várias razões para se balancear a carga de saída de e-mails. Por exemplo, você pode ser um grande  ESP (Email Service Provider) e  cada Postfix seu fica atrelado à um só link e o mesmo já está “topado”. Ou você quer uma situação que garanta que as mensagens irão sair, mesmo se um dos links caírem. Com o método que irei demonstrar neste artigo, você poderá quantos links de saída quiser.

Para tal, iremos precisar do Postfix compilado com suporte a MySQL. Mas por que MySQL? Porque nele está a solução!

Como isso funciona?

O Postfix permite que você crie vários transports de saída e entrada, mas pode originalmente sair apenas por um transport padrão, e o resto terá que ser mapeado na rasão ‘dominio -> transport’ através da diretiva transport_maps. O que iremos fazer, é criar um banco de dados simples, com uma Stored Function que irá dizer ao Postfix via transport_maps por qual transport a mensagem irá sair, e tal transport estará usando um link especifico.

Coletando as informações necessárias:

Quantos links você tem, por quais você irá querer que as mensagens sejam disparadas? Para este artigo, imaginei a seguinte situação:

Link 1 – IP: 1.1.1.1
Link2 – IP: 1.1.1.2
Link3 – IP: 1.1.1.3

Mãos à obra!

Considerando que você já tem Postfix e MySQL devidamente instalados, iremos configurar o Postfix, primeiramente o arquivo máster.cf para definir os transports de saída. No caso, eu quero usar meus três links disponíveis para enviar mensagens, então, devo criar três transports independentes para tal:

L1      unix    –       –       n       –       –       smtp

  -o smtp_bind_address=1.1.1.1

L2      unix    –       –       n       –       –       smtp

  -o smtp_bind_address=1.1.1.2

L3      unix    –       –       n       –       –       smtp

  -o smtp_bind_address=1.1.1.3

Pronto, criei três transports, são eles L1, L2 e L3.

Agora iremos criar um banco de dados chamado Postfix com duas tabelas:  current e transports.

CREATE DATABASE `postfix`;

CREATE TABLE `current` (
`transportId` int(10) DEFAULT NULL
) ENGINE=MyISAM;

CREATE TABLE `transports` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`transport` varchar(50) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;

Criadas as tabelas, iremos agora criar uma stored function, é ela quem irá dizer ao Postfix por onde a mensagem deve ser disparada, efetuando então, o balanceamento de carga.

CREATE FUNCTION `f_transport`() RETURNS varchar(50) CHARSET latin1
BEGIN
DECLARE current_transport INT(11);
DECLARE count_transport INT(11);
DECLARE result varchar(50);

SELECT * INTO @current_transport FROM current;
SELECT count(*) INTO @count_transport FROM transports;

IF @current_transport < @count_transport THEN
SELECT @current_transport + 1 INTO @current_transport;
ELSE
SET @current_transport = 1;
END IF;

UPDATE current SET transportId = @current_transport;

SELECT transports.transport INTO @result
FROM transports,current
WHERE transports.id=current.transportId
AND transports.id = @current_transport;

RETURN @result;

Feito isso, iremos agora cadastrar no MySQL, os transports criados la no master.cf. O nome do transport deverá ser sempre finalizado com ‘:’.

INSERT INTO transports (transport) VALUES (‘L1:’);
INSERT INTO transports (transport) VALUES (‘L2:’);
INSERT INTO transports (transport) VALUES (‘L3:’);

Uma vêz terminada a configuração do MySQL, voltamos ao Postfix, mais especificamente no arquivo main.cf, onde iremos adicionar a diretiva:

transport_maps=mysql:/etc/postfix/mysql-transports.cf

Logo após, criamos o arquivo mysql-transports.cf em /etc/postfix com o seguinte conteúdo:

hosts=ip_do_mysql
user=usuario_do_mysql
dbname=postfix
query=SELECT f_transport() as transport

Uma vez feito, reinicie o Postfix para que as alterações surtam efeito:

# postfix stop
# postfix start

Pronto, se você tiver seguido este artigo de forma criteriosa, seu Postfix já deverá estar balanceando a carga entre os links. Basta monitorar as suas interfaces de rede. Não se esqueça de conferir os logs pra ver se tudo está indo como o esperado.

Anúncios
Categorias:Uncategorized