目前项目已经采用nginx来实现负载均衡,但是nginx调度器只有一台,上次还意外的down机一次,导致整个服务应用全部瘫痪,这次准备再加一个调度器来实现站点高可用性,也就是常说的双机热备了。
master: 192.168.1.241
backup: 192.168.1.242
漂移IP:192.168.1.243
1 主备调度器都安装keepalived软件
安装过程如下:
1 2 3 4 5 6 7
| ./configure --prefix=/usr/local/keepalived && make && make install cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ service keepalived start
|
可以先用命令 service keepalived start
启动进行测试,看进程能够启动,注意查看log。
2.1 主调度器配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_sync_group VG_1 { group { VI_1 } notify_master /etc/keepalived/sendmail.pl } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.243 } }
|
2.2 备调度器配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_sync_group VG_1 { group { VI_1 } notify_master /etc/keepalived/sendmail.pl } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.243 } }
|
3 发送邮件的perl
脚本sendmail.pl内容如下:
注意主备发送邮件的标题是不一致的,只要你能识别漂移IP在哪台服务器上即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/usr/bin/perl -w use Net::SMTP_auth; use strict; my $mailhost = 'smtp.163.com'; my $mailfrom = 'test@163.com'; my @mailto = ('123456@139.com'); my $subject = 'keepalived up on backup'; my $text = "正文\n第二行位于此。"; my $user = 'test@163.com'; my $passwd = 'xxxxxxx'; &SendMail(); ############################## # Send notice mail ############################## sub SendMail() { my $smtp = Net::SMTP_auth->new( $mailhost, Timeout => 120, Debug => 1 ) or die "Error.\n"; $smtp->auth( 'LOGIN', $user, $passwd ); foreach my $mailto (@mailto) { $smtp->mail($mailfrom); $smtp->to($mailto); $smtp->data(); $smtp->datasend("To: $mailto\n"); $smtp->datasend("From:$mailfrom\n"); $smtp->datasend("Subject: $subject\n"); $smtp->datasend("\n"); $smtp->datasend("$text\n\n"); $smtp->dataend(); } $smtp->quit; }
|
说明:
a、由于keeplived自带的发送邮件机制是个鸡肋,如果本地不启动25端口就无法实现邮件发送,就琢磨着能不能通过自定义脚本来实现,真的是很幸运,就采用了认证的方式。
b、其他的配置说明就不详细讲了,网上很多资料。
4 测试keepalived
主备调度器都开启80端口,两台服务器上的测试内容不一致,这样更方便测试。
##########################
所需安装模块
use Net::SMTP
Authen::SASL
##########################
$stmp->auth('user','pass');
大部分SMTP服务器为了防止spam垃圾邮件,就需要用户验证身份。
此方法需要另外安装模块:Authen::SASL
, 此模块可能系统不自带
##########################
Debug => 1
此段代码用于测试之用,所以开启了Debug,一般测试一次完毕,正式使用的话会关闭它。
注:可在命令行界面直接执行:/etc/keepalived/sendmail.pl
,看看能否发送邮件成功,如果失败的话则需要安装Net::SMTP_auth
模块。
安装方法:
yum -y install perl-CPAN
cpan Net::SMTP_auth