در این مقاله می خواهیم درباره load balancing روی ایمیل‌های خروجی از سیستم بر روی چند ip بحث کنیم و راه اندازی اولیه آن را آموزش دهیم.

نوشته پیش رو بر پایه TCP_TABLE مولفه postfix می باشد.

توجه: این تنظیمات بر اساس الگوریتم round robin کار می کند.

در ابتدا اقدام به نصب مولفه postfix می کنیم.

# pkg install postfix ==> freebsd

# apt-get install postfix ==> debian

بعد از نصب postfix باید اطمینان حاصل کنیم که ماژول tcp روی postfix بارگذاری شده است. برای این منظور از دستور زیر استفاده می کنیم.

# postconf -m
btree
cidr
environ
fail
hash
internal
ldap
memcache
nis
proxy
regexp
static
tcp
texthash
unix

درصورتی که ماژول بارگذاری شده باشد شما یک خروجی همانند بالا مشاهده خواهید کرد.

بعد از اطمینان از موارد بالا اقدام به نصب و راه اندازی سرویس مورد نظر می کنیم.

۱در ابتدا یک کتابخانه perl باید نصب کنیم که در این مرحله با استفاده از دستور زیر این کار را انجام می دهیم.

# cpan install /List::util::WeightedRoundRobin/

۲بعد از نصب موفقیت آمیز کتابخانه مورد نظر باید یک اسکریپت perl به نام random.pl در مسیری که postfix را نصب کرده‌ایم بسازیم.

برای این منظور از دستور زیر استفاده می کنیم. (محتویات اسکریپت در پایین آورده شده است.)

# vi /etc/postfix/random.pl

اسکریپت random.pl:

#!/usr/bin/perl -w
# author: Hari Hendaryanto <hari.h -at- csmcom.com>
use strict;
use warnings;
use Sys::Syslog qw(:DEFAULT setlogsock);
use List::Util::WeightedRoundRobin;
use Storable;

my $hashfile=”/tmp/file.hash”;

store {}, $hashfile unless -r $hashfile;

#

# our transports lists, we will define this in master.cf as transport services
# Queued using Weighted Round-Robin Scheduling
#
my $list = [
{
name => ‘smtp1:’,
weight => 1,
},
{
name => ‘smtp2:’,
weight => 1,
},
{
name => ‘smtp3:’,
weight => 1,
},
{
name => ‘smtp4:’,
weight => 1,
},
{
name => ‘smtp5:’,
weight => 1,
},
{
name => ‘smtp6:’,
weight => 1,
},
{
name => ‘smtp7:’,
weight => 1,
},
];

my $WeightedList = List::Util::WeightedRoundRobin->new();

my $weighted_list = $WeightedList->create_weighted_list( $list );

# $maxinqueue max number of queue in smtp list

my $maxinqueue = scalar(@{$weighted_list});

#

# Initalize and open syslog.
#
openlog(‘postfix/randomizer’,’pid’,’mail’);
#
# Autoflush standard output.
#
select STDOUT; $|++;

while (<>) {

chomp;
my $count;
my $hash=retrieve($hashfile);

if (!defined $hash->{“index”})

{
$count = 0;
} else {
$count = $hash->{“index”};
}

if ($count >= $maxinqueue)

{
$hash->{“index”} = 0;
$count = 0;
}

$hash->{“index”}++;

store $hash, $hashfile;
my $random_smtp = ${$weighted_list}[$count];
if (/^get\s(.+)$/i) {
print “200 $random_smtp\n”;
syslog(“info”,”Using: %s Transport Service”, $random_smtp);
next;
}
print “200 smtp:\n”;
}

بعد از ساختن اسکریپت بالا به آن خاصیت اجرایی بدهید.

# chmod +x /etc/postfix/random.pl

۳سپس باید برویم و فایل master.cf را بسته به تعداد ipهایی که داریم و می خواهیم روی آن‌ها load balancing ارسال ایمیل داشته باشیم ویرایش کنیم.

در زیر نمونه‌ای از فایل master.cf را آورده ایم.

## Round-robin outgoing smtp
۱۲۷٫۰٫۰٫۱:۲۳۰۰۰ inet n n n – 0 spawn
user=nobody argv=/etc/postfix/random.pl
# random smtp
smtp1 unix – – n – – smtp
-o syslog_name=postfix-smtp1
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp2 unix – – n – – smtp

-o syslog_name=postfix-smtp2
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

smtp3 unix – – n – – smtp

-o syslog_name=postfix-smtp3
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp4 unix – – n – – smtp

-o syslog_name=postfix-smtp4
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp5 unix – – n – – smtp

-o syslog_name=postfix-smtp5
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp6 unix – – n – – smtp

-o syslog_name=postfix-smtp6
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

smtp7 unix – – n – – smtp

-o syslog_name=postfix-smtp7
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

توجه داشته باشید که باید FQDN مربوط به هر IP را در سیستم خود تنظیم کرده باشید.

۴در این مرحله خطوط زیر را به فایل main.cf جهت استفاده از تنظیمات انجام شده اضافه می کنیم.

transport_maps = tcp:127.0.0.1:23000
۱۲۷٫۰٫۰٫۱:۲۳۰۰۰_time_limit = 3600s

بعد از انجام مراحل بالا سرویس postfix را reload یا restart می کنیم.

# service postfix restart

# service postfix reload

از اینجا به بعد در صورتی که خطایی نداشته باشیم سرور ما آماده است و جهت اطمینان از صحت کارکرد آن می توانیم از دستور زیر استفاده کنیم.

# postmap -q “dummy” tcp:127.0.0.1:23000
smtp4:

در صورتی که یک خروجی همانند بالا دیدید تنظیمات با موفقیت اعمال شده است.