keepalived+LVS
keepalived :
1、vrrp协议在Linux主机上以守护进程方式的实现;
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。2、能够根据配置文件自动生成ipvs规则;
3、对各real server做健康检测;
vrrp: 虚拟路由冗余协议,当主机的下一跳出现故障时,由另一台路由器来代替出现故障的路由器进行工作;
虚拟路由器:由一个master路由器和多个Backup路由器组成,主机将虚拟路由器当作默认网关。
实验 : keepalived+LVS
MASTER:192.168.10.10 directory1 MASTER
BACKUP: 192.168.10.20 dirtrectory2 BACKUP
real server1:192.168.10.30
real server2:192.168.10.40
real server1、real server2 做为两台web服务器,进行测试,安装httpd,并配置
real server1:echo "192.168.10.30 real server111" > /var/www/html/index.html
real server2:echo "192.168.10.40 real server222" > /var/www/html/index.html
real server1、real server2 执行脚本如下(跟上start or stop):
#!/bin/bash
case $1 in
start)
ifconfig lo:0 192.168.10.100 netmask 255.255.255.255 broadcast 192.168.10.100 up
route add -host 192.168.10.100/32 dev lo:0
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo -e "input: \033[4;31mstart | stop\033[0m"
;;
esac
MASTER :
]# yum -y install keepalived
]# yum -y install ipvsadm
]# cp /etc/keepalived/keepalived.conf{,.bak}
]# vim /etc/keepalived/keepalived.con
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #设置报警邮箱,收件人邮箱,可以设置多个,每行一个
}
notification_email_from keepalived@localhost #发件人邮箱@
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #设置连接邮件服务器的超时时间
router_id LVS_DEVEL #运行keepalived服务器的一个标识
# vrrp_skip_check_adv_addr
# vrrp_strict #这个必须的注释掉,不然主机ping不通vip,无法实现调度
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
#健康检测
vrrp_script chk_test #定义名称
{
script "/etc/keepalived/test.sh" #定义的这个脚本,会在后面的配置文件中调用
interval 1 #间隔多少秒探测一次
weight -2 #触发这个脚本权重-2
}
vrrp_instance VI_1 {
state MASTER #MASTER表示主服务器,BACKUP表示备用服务器。
interface ens33 #网卡名称
virtual_router_id 51 #虚拟路由标识,0-255,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的(针对本机)
priority 100 #定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER和BACKUP负载均衡之间同步检查的时间间隔,单位秒
authentication {
auth_type PASS #设定验证类型,主要由PASS和AH两种
auth_pass 1111 #设置验证密码,在一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #设置vip地址,可以设置多个vip,每行一个
192.168.10.100/32
}
track_script { #调用上面定义的脚本
chk_test
}
#健康状态检测 : 外面定义对应的脚本,往后看
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/krrpalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
#虚拟服务器定义部分
virtual_server 192.168.10.100 80 { #设置虚拟服务器。需要指定的vip和服务器端口,IP和端口之间用空格隔开
delay_loop 6 #健康检测状态时间,单位秒
lb_algo rr #设置调度算法,rr,轮询
lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN和DR三个模式
persistence_timeout 50
#会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制。0为不可用
protocol TCP #指定转发协议类型,有TCP和UDP两种
sorry_server 127.0.0.1 80 #当后端realserver全挂掉之后,directory可以将本地的页面提供上去,提示友好界面,如:服务器正在维护……
real_server 192.168.10.30 80 {
weight 1
#配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源
HTTP_GET {
url {
path / #请求地址为/ ,也就是/index.html或者index.php
status_code 200 #返回状态吗为200表示为OK
}
connect_timeout 3 #连接超时时长,3秒无响应超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔
}
}
real_server 192.168.0.40 80 { #配置 realserver2
weight 10
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
文件接下来用不到的部分全部注释 :.,$s@^@#@g
]# vim /etc/keepalived/test.sh #在/etc/keepalived/ 下面创建down文件,就可以实现,不关闭keepalived,实现 vip 切换
#!/bin/bash [[ -f /etc/keepalived/down ]] && exit 1 || exit 0
]# vim /etc/keepalived/notify.sh
#!/bin/bash
vip=192.168.10.100
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %T'`: vrrp transition,`hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage:`basename $0` {master|backup|fault}'
exit 1
;;
esac
配置sorry_server的页面
]# yum -y install httpd
]# echo "页面维护中 sorry ......" > /var/www/html/index.html
BACKUP
重复上面MASTER步骤,不过/etc/keepalived/keepalived.conf 中有地方要改
]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_test
{
script "/etc/keepalived/test.sh"
interval 1
weight -2
}
vrrp_instance VI_1 {
state BACKUP ########改成BACKUP
interface ens33
virtual_router_id 51
priority 99 ##########优先级 改一下
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.100/32
}
track_script {
chk_test
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/krrpalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.10.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.10.30 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.40 80 {
weight 10
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
]# systemctl start keepalived
]# ip addr show
[root@node1 keepalived]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:6e:e0:96 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe6e:e096/64 scope link
valid_lft forever preferred_lft forever
如果在MASTER这边停掉keepalived ,或者在/etc/keepalived/ touch一个down文件(因为前面配置中加载了自定义的脚本), 都能够是的192.168.10.100这个虚拟IP切换到BACKUP主机
#LVS 的规则会自动添加
[root@node1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.100:80 rr
-> 192.168.10.30:80 Route 1 0 0
-> 192.168.10.40:80 Route 1 0 0
轮询效果
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.30 real server111
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.40 real server222
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.30 real server111
[root@node1 keepalived]# curl 192.168.10.100
192.168.10.40 real server222

