转载请注明出处,如果您觉得文章有用,就点个赞吧!
高性能高可用服务器 LVS + KeepAlived
网络拓扑
关闭防火墙
注意 192.168.1.220 / 221 / 223 / 224都需要关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
WEB服务器
安装配置nginx
yum -y install nginx # 192.168.1.223和224一样
cd /usr/share/nginx/html/
cp index.html index.html.backup
echo "192.168.1.223" > index.html #注意这里,主备分别配置其各自ip地址,为了在下面的演示中方便辨认结果
创建虚拟网卡
Lvs采用DR工作模式 ,web服务器将结果直接返回给客户端,但是这时数据包的源IP地址是web服务器的IP地址,客户端接收到数据包后,发现回包的IP地址不是自己请求的IP地址,就会把包丢弃掉,这会导致web请求失败,所以需要将web的IP地址伪装成为客户端访问的VIP地址,这里使用web服务器的环回口地址进行伪装。
- arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
- 0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
- 1 - 避免使用另外一个接口上的mac地址去响应ARP请求;
- 2 - 尽可能使用能够匹配到ARP请求的最佳地址。
- arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
- 0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
- 1 - 哪个接口上接受ARP请求,就从哪个端口上回应。
cd /etc/init.d
vim realserver
#添加以下内容,根据情况修改之后保存
SNS_VIP=192.168.1.225 #VIP 定义为自己指定的vip
/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
# 下面4行是防止本机vip和LVS的VIP冲突
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
设置可执行权限
chmod +x realserver functions
启动脚本
注意两台web服务器都需要上面的配置以及启动该脚本
./realserver start
如果出现红框中的表示成功
LVS+Keepalived服务器
安装ipvsadm keepalived
注意lvs已经集成到linux的kernel中了,不需要安装,而ipvsadm是lvs的管理工具
# 安装lvs管理器 安装keepalived
yum -y install vim ipvsadm keepalived # 192.168.1.220和221一样
配置keepalived
Keepalived配置文档
# 配置192.168.1.220-LVS主机 192.168.1.221-LVS备机
# 主备有三处配置不一样,我已经在相关配置选项注释中说明,按照其配置即可
cd /etc/keepalived
cp keepalived.conf keepalived.conf.backup
vim keepalived.conf
# 将下面内容复制
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
#【主备】设置lvs的id,在一个网段内唯一 主LVS_DEVEL_220 备LVS_DEVEL_221
router_id LVS_DEVEL_220
vrrp_skip_check_adv_addr
#vrrp_strict
#注意这里,如果使用默认值0,使用keepalived -t检测配置文件时会有下面的警告
#(Line 15) number '0' outside range [1e-06, 4294]
#(Line 15) vrrp_garp_interval '0' is invalid
vrrp_garp_interval 0.001
#注意这里,如果使用默认值0,使用keepalived -t检测配置文件时会有下面的警告
#(Line 16) number '0' outside range [1e-06, 4294]
#(Line 16) vrrp_gna_interval '0' is invalid
vrrp_gna_interval 0.000001
}
vrrp_instance VI_1 {
#【主备】主LVS配置MASTER 备LVS配置BACKUP
state MASTER
interface ens33 # 注意ens33是本机网卡名
virtual_router_id 51 #虚拟路由编号,主备要一致
#【主备】优先级,主设置100,备设置50
priority 100
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
#主备必须一样,防止其他keepalived连接,仅使用前8个字符,就意味着你配置超过8位也只有前8位生效
auth_pass 0513315
}
virtual_ipaddress {
192.168.1.225 #vip,可以配置多个,下一个换行书写
}
}
virtual_server 192.168.1.225 80 { #此处配置vip和端口 http-80 https-443
delay_loop 6
lb_algo wrr #调度算法,使用加权轮询
lb_kind DR #工作模式,使用DR(Director Router)
#persistence_timeout 50
protocol TCP
real_server 192.168.1.224 80 { # 真实服务器ip和端口
weight 1 #权重,值越大,权重越高
TCP_CHECK { #检查真实主机的健康配置模块,可以有多种检测机制,详情参考配置文档
connect_timeout 3
#注意这里,新版本使用retry命令
retry 3
delay_before_retry 3
}
}
real_server 192.168.1.223 80 { # 真实服务器ip和端口
weight 2
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
#保存退出
启动Keepalived
注意:每次启动前应该先使用如下命令清除之前配置,这是因为lvs的配置是通过keepalived设置好的,就是上面那不得realserver那些,所以重启时清除下之前配置
ipvsadm -C
启动,停止,重启
systemctl start keepalived
systemctl stop keepalived
systemctl restart keepalived
查看结果,出现如下图所示结果表示成功
ps -ef|grep keepalived
ipvsadm -Ln
模拟故障
测试web服务器故障
- 使用浏览器访问 192.168.1.225,看到界面显示192.168.1.223,多次刷新可以交替看到224
- 模拟故障,停掉223
ifdown ens33
多次刷新浏览器发现只能看到192.168.1.224 - 查看lvs负载的结果
ipvsadm -Ln
lvs的路由少了223 - 故障恢复,启动223
ifup ens33
发现lvs的路由中又有223了,多次刷新浏览器也可以看到223了 - 整个web服务器模拟故障已经完成
测试LVS主节点故障
-
模拟主LVS故障
systemctl stop keepalived
-
vip从220漂移到221上,如下两图可知结果正确
-
模拟主LVS故障恢复
systemctl start keepalived
vip又从221飘回到220上,说明结果正确,这里就不再贴图了。
LVS的扩展知识
LVS工作模式
工作模式 | 原理 | 优缺点 |
---|---|---|
NAT | 调度时:目的IP改成RIP(DNAT)返回时:源IP改成VIP(SNAT) | 由于来回都需要经过调度器,性能不太好,一般用的少 |
TUN | 增加一个IP头部。通过IP隧道进行通信 | 由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销;所有的RS服务器都要绑定VIP,抑制ARP,配置复杂;WLAN下使用该模式,不过一般在WLAN下不使用LVS,一般用Nginx |
DR | 通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户 | LAN下使用该模式;要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境;调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口;配置复杂 |
LVS调度算法
算法 | 算法 | 说明 |
---|---|---|
固定调度 | rr | 轮循调度,它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种 |
固定调度 | wrr | 权重轮循,它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数 |
固定调度 | dh | 目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS |
固定调度 | sh | 源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS |
动态调度 | wlc | 加权最小连接数调度,实际连接数除以权值,最小的RS作为分配的RS |
动态调度 | lc | 最小连接数调度,连接数最小的RS作为分配的RS |
动态调度 | lblc | 基于地址的最小连接数调度,将来自同一目的地址的请求分配给同一台RS节点 |
动态调度 | lblcr | 基于地址带重复最小连接数调度。(略) |
动态调度 | SED | 最短的期望的延迟(不成熟) |
动态调度 | NQ | 最小队列调度(不成熟) |