keepalived是专门用来监控集群系统中各个服务节点的状态,因为默认的LVS都需要通过调度节点(directory server,及要实现负载均衡的那台机子)。因为默认从所有客户端近来的请求都要跑到这个节点上,如果一旦这台机子出现了问题,那么整个lvs系统就会崩溃。这样的问题就是常说的单点故障。单点故障,是绝对不允许在一个健康的系统中出现的,因为一旦其中的一个服务器挂掉的话,整个系统就会处于瘫痪状态。因此我们可以使用lvs+keepalived的方案来解决这一问题.
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
下面就来看下一个完整的基于keepalived+lvs构建负载均衡的实现过程。
安装keepalived:
tar -zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
./configure --sysconf=/etc --with-kernel-dir=/usr/local/kernels/2.6.18-8.el5-i686
make
make install
ln -s /usr/local/sbin/keepalived /sbin/
(sysconf指定了keepalived配置文件的安装路径,with-kernel-dir是试用内核源码中的头文件)
安装LVS软件:
系统安装完成以后,可以通过modprobe -l | grep ipvs检查kernel是否已经支持了LVS的ipvs模块
如果支持了,就可以安装ipvs软件了
在directroy server上安装ipvsadm yum install ipvsadm*
ipvsadm --help 如果看到提示信息证明ipvs已经安装成功
下面看下lvs集群实验的搭建
我的实验环境: 外部的windows机子充当客户端(192.168.1.10),主directory server(192.192.168.1.11),备用directory server(192.168.1.12),real server1(192.168.1.100),real server2(192.168.1.200),vip(192.168.1.20)
1.在real server上的配置:
创建文件/etc/init.d/lvsrs
#!/bin/bash
VIP 192.168.1.20
case "$1" in
start)
echo "start lvs of real server "
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "stop lvs of real server "
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
chmod a+x /etc/init.d/lvsrs
service lvsrs {start|stop}
解释一下上面脚本,我们在lo本地回环网卡上绑定了一个vip(192.168.1.20),让广播地址也为vip,注意下后面的子网掩码不是我们常见的255.255.255.0,而是255.255.255.255。因为在一个网卡上面绝对不允许配置相同的ip网段,把广播地址设置成vip和子网掩码设置成255.255.255.255为0可以解决这个问题。下面的脚本是arp的忽略和arp的宣誓。这4行有什么用呢?设想一下,当我们去访问192.168.1.20这个网络地址的时候,会访问谁呢?现在的网络中会有3台机子都拥有这个ip地址,echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore的作用就是判断过来的请求是否是机子的真实网卡上的地址,如果不是的话,我忽略它。这样的话,就不会去请求两台real server了。这个时候就会去请求主directory server上绑定的vip,然后dr到rear server上。这个时候echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce,会访问到real server上的虚拟ip上,这个时候做arp的宣誓,就可以让它访问。
2.在主,备director server上配置keepalived
keepalived仅需要一个配置文件就可以完成对HA cluster和LVS服务节点监控,在通过keepalived搭建
高可用的LVS集群实例中,主,备directory server都需要安装keepalived软件,默认的配置文件在
/etc/keepalived/keepalived.conf,一个完整的keepalived配置文件由3个部分组成,分别是全局
定义部分,vrrp实例定义部分以及虚拟服务器定义部分.下面是配置文件的详细信息:(主directory server)
//注:keepliaved下面的部分大多是借鉴南非蚂蚁的高性能linux运帷一本书上的内容。
#全局定义部分
global_defs {
notification_email{
1547840014@qq.com #设置报警邮件地址,可以设置多个,每行一个。需要开启邮件服务功能
1547840014@qq.com
}
notification_email_from keepalived@localhost #设置邮件的发送地址
smtp_server 192.168.200.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #表示运行keepalived服务器的一个标识,发邮件时显示在邮件主题中的信息
}
vrrp_instance VI_1 {
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,#BACKUP表示此主机是备份服务器
interface eth0 #指定HA检测网络的接口
virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个
vrrp_instance下,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高.在一个vrrp_instance下,MASTER的优先级必须大于BACKUP
advert_int 1 #设定master和backup负载均衡器之间同步检查的时间间隔,单位是秒
authentication{ #设定验证类型和密码
auth_type PASS #设置验证类型,主要有HA和PASS两种
auth_pass 1111 #设置验证密码,在一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress{ #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.1.20
}
}
#虚拟服务器定义部分
virtual_server 192.168.1.20 80 { #设置虚拟服务器,需要指定虚拟服务器IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 #设置运行健康检查时间,单位是秒
lb_algo rr #设置负载均衡调度算法,这里设置为rr,即轮询算法
lb_kind DR #设置lvs实现负载均衡的机制,有NAT,TUN,DR三个模式可选
persistence_timeout 50 #回话保持时间,单位是秒。这个对网页很有用,为session共享提供了好的方案
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.1.100 80{ #指定真实服务器的ip地址和端口,之间用空格隔开
weight 3 #权值
TCP_CHECK{ #realserver的状态检测设置部分,单位是秒
connect_timeout 3 #表示3秒无响应超时
nb_get_retry 3 #表示重试次数
delay_before_retry 3 #表示重试间隔
}
}
real_server 192.168.1.200 80{
weight 3 #权值
TCP_CHECK{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意在配置keepalived.conf的时候,就算配置文件错误,keepalive也会正常启动,所以一定要保证配置的正确性
然后把该文件复制到192.168.1.12上去(备directory server)
rsync -av keepalived.conf 192.168.1.12:/etc/keepalived/keepalived.conf,完成下面的修改:
state MASTER修改为state BACKUP
priority 100修改为priority 80
注意:主directory server上也需要添加虚拟ip,在eth0:0网卡上添加即可,备directory server不需要
ifconfig eth0:0 192.168.1.20 netmask 255.255.255.255 up
route add -n 192.168.1.20 dev eth0:0
主directory和备用directory都需要开启路由管道
3.启动keepalived+lvs集群
在主,备directory server上分别启动keepalived服务
/etc/init.d/keepalived start
接着在两个real server上执行如下脚本:
/etc/init.d/lvsrs start
检查ipvsadm能否识别机器
ipvsadm -ln
如果出现ipvsadm -L的详细转发机子信息,则证明配置成功
经过上面的一些步骤后,lvs+keepalived的实验就已经完成了。现在可以人为的把主directory server的apache服务器給挂掉,看看新来的请求还能到达不,如果到达的话,说明lvs+keepalived的实验就已经成功。在我的实验环境下,经过上面的步骤后没有问题,如果中途有什么错误的话,可以看下/var/log下的文件,里面有比较详细的纪录信息。