Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务
本次测试使用的lvs的DR模式和Keepalived主从配置
Keepalived
主负载服务器(server1)的配置:
yum install keepalived -y #安装Keepalived
yum install ipvsadm -y #安装lvs
service ipvsadm start #开启lvs
Lvs—DR模式配置
Lvs服务器(server1)
yum install ipvsadm -y #安装
service ipvsadm start
ipvsadm #查看ipvsadm条目,如果存在可以执行下一条命令删除
ipvsadm -C #删除所有ipvsadm条目
ipvsadm -A -t 172.25.38.1:80 -s rr #添加ipvsadm条目,-A表示追加条目,-t表示使用tcp协议,-s rr表示使用轮询算法
ipvsadm -a -t 172.25.38.1:80 -r 172.25.38.3 -g #-a表示追加规则,-t表示使用tcp协议,-r表示real-server,-g表示使用DR模型
ipvsadm -a -t 172.25.38.1:80 -r 172.25.38.4 -g
ipvsadm
如下图所示:
Real Server服务器(server3)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
ifconfig lo:0 172.25.254.200 netmask 255.255.255.255 broadcast 172.25.38.1 ##在lo上设置集群服务的ip地址
route add -host 172.25.254.200 dev lo:0 ##在lo上设置集群服务的路由
route
/etc/init.d/httod start #开启http
如下图所示:
或者运行脚本
vim /etc/init.d/realserver
#!/bin/bash
# description: Config realserver
SNS_VIP=172.25.38.200
/etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
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/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
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/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
server4相同
有关arp_ignore的相关介绍:
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
有关arp_announce的相关介绍:
arp_announce:对网络接口上本地IP地址发出的ARP回应作出相应级别的限制
0 - (默认) 回应在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
配置keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
redhat@mail.com
}
notification_email_from sns-lvs@gmail.com
smtp_server 172.25.38.100 #SMTP邮件服务器
smtp_connection_timeout 30
router_id LVS_DEVEL #设置lvs的id
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主服务器,BACKUP为从服务器
interface eth0 #监测网络接口
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主服务器必须大于从服务器
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.20.200 #定义虚拟IP(VIP)为172.25.38.200(可设置多个,增加下一个须换行)
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 172.25.38.200 80 {
delay_loop 6 # 设置健康检查时间,单位是秒
lb_algo wrr # 设置负载调度的算法为wlc
lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 172.25.38.3 80 { #指定real server1的IP地址
weight 3 #配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.25.38.4 { #指定real server2的IP地址
weight 3 #配置节点权值,数字越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
service keepalived start #开启keepalived
从负载服务器(server2)的配置:
keepalived 从负载服务器与主负载服务器的配置只是在keepalived的配置文件中需要改以下两处:
(1)指定Keepalived的角色为从服务器,即:
state BACKUP
(2)将优先级改为小于100,例如改为99,即:
priority 99
测试
1.访问vip,两个web服务器,权重一样,所以会依次访问
当server3发生故障(测试关闭http),则只访问server4
2. 主负载服务器server1发生故障(测试关闭keepalived服务)
服务跳转到从服务器,服务照常