centos 7.6 —— LVS+DR模式&&Keepalived群集
1. 理解LVS-DR工作原理
- 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线
- 客户机使用VIP访问负载均衡调度服务器(redirect),redirect任务轮询算法分配给下面的后端服务器,后端服务器使用VIP直接回应客户机。无需经过redirect。
注意:
- VIP 是暴露在外网的。
- 客户机访问请求并不知道具体是哪个服务器进行处理和回应的,因为VIP都是相同的虚拟IP地址。这样增加了网络的安全性。
1.2 LVS-DR数据包流向分析
- (1)Client向目标VIP发出请求,Director(负载均衡器)接收
- IP包头及数据帧头信息
- (2)Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送
- IP包头及数据帧头信息
- (3)RealServer_1收到这个帧,解封装后发现目标IP与本机匹配
- (RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,发送到局域网
- IP包头及数据帧头信息
- (4)Client将收到回复报文。Client认为得到正常的服务,而不会知道是哪一台服务器处理的
注意:如果跨网段,则报文通过路由器经由Internet返回给用户
二、 LVS-DR中的ARP问题
-
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址
-
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播 -
只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播
-
对节点服务器进行处理,使其不响应针对VIP的ARP请求 使用虚接口lo:0承载VIP地址
-
设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求
-
RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址
-
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
-
路由器收到ARP请求后,将更新ARP表项
-
原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
问题
- 路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
解决方法
- 对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
总结:
因为后端的节点服务器和负载均衡服务器的VIP地址是相同,当客户机访问对VIP访问的时候,就会造成强占回应请求造成广播风暴,所以需要负载均衡服务器进行ARP过滤指定后端服务器进行响应客户端服务。
三、解决ARP的两个问题的设置方法
修改/etc/sysctl.conf文件
- net.ipv4.conf.lo.arp_ignore = 1 //客户端通过VIP访问的时候,防止服务器抢占回应,只设定调度进行响应,然后调度器再下发给后端服务器
- net.ipv4.conf.lo.arp_announce = 2 //后端服务器回应客户机的时候,用网络接口地址到路由网关,记住后端服务器的ip地址和MAC地址,但是网关回应给客户机的ip地址是VIP地址。
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.all.arp_announce = 2
arp_ignore和arp_announce介绍
四、理解Keepalived实现原理
- 企业应用中,单台服务器承担应用存在单点故障的危险
- 单点故障一旦发生,企业服务将发生中断,造成极大的危害
4.1 Keepalived工具介绍
- 专为LVS和HA设计的一款健康检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
- 官方网站:http://www.keepalived.org/
4.2 Keepalived实现原理剖析
- Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
- VRRP (虚拟路由冗余协议)是针对路由器的一种备份解决方案 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚
4.2 拟IP地址,继续提供服务 Keepalived案例讲解
- Keepalived可实现多机热备,每个热备组可有多台服务器
- 双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
- 实现基于Web服务的双机热备
- 漂移地址:192.168.100.20
- 主、备服务器:192.168.100.200 、 192.168.100.134
- 提供的应用服务:Web
4.3 Keepalived安装与启动
- 在LVS群集环境中应用时,也需用到ipvsadm管理工具
- YUM安装Keepalived
- 启用Keepalived服务
4.4 配置Keepalived master服务器
- Keepalived配置目录位于/etc/keepalived/
- keepalived.conf是主配置文件
- global_defs {…} 区段指定全局参数
- vrrp_instance 实例名称 {…} 区段指定VRRP热备参数
- 注释文字以”!”符号开头
- 目录samples,提供了许多配置样例作为参考
常用配置选项
- router_id HA_TEST_R1:本路由器(服务器)的名称
- vrrp_instance VI_1 :定义VRRP热备实例
- state MASTER:热备状态,MASTER表示主服务器
- interface ens33 :承载VIP地址的物理接口
- virtual_router_id 1 :虚拟路由器的ID号,每个热备组保持一致
- priority 100:优先级,数值越大优先级越高
- advert_int 1:通告间隔秒数(心跳频率)
- auth_type PASS:认证类型
- auth_pass 123456:密码字串
- virtual_ipaddress { vip}: 指定漂移地址(VIP),可以有多个
4.5 配置Keepalived slave服务器
- Keepalived备份服务器的配置与master的配置有三个选项不同
- router_id:设为自有名称
- state:设为BACKUP
- priority:值低于主服务器
- 其他选项与master相同
4.6 Keepalived双机热备效果测试
- 测试双机热备的效果
- 主、备机均启用Web服务,设置不同内容
- 先后禁用、启用主服务器的网卡
执行的测试
- 测试1:使用ping检测192.168.100.20的连通性
- 测试2:访问http://192.168.100.20,确认可用性及内容变化
- 测试3:查看日志文件/var/log/messages中的变化
五、案例环境
-
为了进一步提高公司网站的负载能力,公司决定扩展现有的网站平台,基于LVS构筑负载均衡群集。考虑到群集的访问效率,管理员准备采用LVS群集的DR模式
-
主调度器LVS ens33:192.168.100.200
-
虚拟路由VIP ens33:0 192.168.100.20
-
备调度器 LVS ens33: 192.168.100.134
-
虚拟路由VIP ens33:0 192.168.100.20
-
节点服务器1:ens33 192.168.100.144
-
虚拟路由VIP lo:0 192.168.100.20
-
节点服务器1:ens33 192.168.100.156
-
虚拟路由VIP lo:0 192.168.100.20
注意事项:
- 所有服务器的VIP地址是相同的
- 所有服务器都是仅主机模式
- 客户机ip地址:192.168.100.233
六、实验步骤
6.1 主调度服务器配置 和 备份调度服务器
-
主备调度器配置相同除了本机的物理网卡的IP地址不同
-
192.168.100.200
-
192.168.100.134
-
NAT 模式下预先安装好
-
安装ipvsadm
yum -y install ipvsadm
yum -y install keepalived
iptables -F
setenforce 0
之后修改仅主机模式
设置
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
#proc 响应关闭重定向功能
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0
查看设置
[root@localhost ~]# sysctl -p //刷新到内存
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@localhost ~]#
- 新建虚拟网卡
cp -p ifcfg-ens33 ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.20
NETMASK=255.255.255.0
ifup ens33:0
ifconfig
cd /etc/init.d/
vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.20
RIP1=192.168.100.144
RIP2=192.168.100.156
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g //-g 是指DR模式,-m 是指nat模式
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting -------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down
route del $VIP
echo "ipvsadm stoped----------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
ehco "ipvsadm stoped----------------------"
exit 1
else
echo "ipvsadm Runing ---------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
chmod +x dr.sh
service dr.sh start
6.2 节点服务器配置
- 两个节点服务器配置相同除了网页内容和本机的物理网卡的IP地址
192.168.100.144
192.168.100.156
yum -y install httpd
systemctl start httpd.service
systemctl stop firewalld.service
setenforce 0
************************************************
节点服务器1:192.168.100.144
cd /var/www/html
echo "this is accp web" > index.html
************************************************
************************************************
节点服务器1:192.168.100.156
cd /var/www/html
echo "this is KGC KGC KGC KGC web" > index.html
************************************************
cd /etc/sysconfig/network-scripts
cp -p ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.20
NETMASK=255.255.255.255 //环回口必须32位
ONBOOT=yes
systemctl restart network
ifup lo:0 //启动网络接口
systemctl start NetworkManager
ifconfig //查看虚拟ip
cd /etc/init.d
vim web.sh
#!/bin/bash
VIP=192.168.100.20
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $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 $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 stopd"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
chmod +x web.sh
service web.sh start
sysctl -p刷新到内存
ifup lo:0 (启用立刻中断)
firefox "http://127.0.0.1/" &
七、keepalived 部署—(在主调度服务器上设置)
cd /etc/keepalived/
vim keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 //本地地址
smtp_connect_timeout 30
router_id LVS_01 //router id 不同相同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS //设置密码建议不要更改。默认值就好
auth_pass 1111
}
virtual_ipaddress {
192.168.100.20 //虚拟ip地址
}
}
virtual_server 192.168.100.20 80 { //虚拟VIP
delay_loop 6
lb_algo rr
lb_kind DR //DR模式
persistence_timeout 50
protocol TCP
real_server 192.168.100.144 80 { //节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.156 80 { //节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
剩余的配置删除
scp keepalived.conf root@192.168.100.134:/etc/keepalived
systemctl restart keepalived.service
7.1 keepalived 部署—(在备份调度服务器上设置)
192.168.100.134
cd /etc/keepalived/
vim keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 //本地地址
smtp_connect_timeout 30
router_id LVS_02 //router id 不同相同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP //备份调度器
interface ens33
virtual_router_id 51 //虚拟router -id组号必须与主调度器相同
priority 90 //优先级低于主调度器的优先级
advert_int 1
authentication {
auth_type PASS //设置密码建议不要更改。默认值就好
auth_pass 1111
}
virtual_ipaddress {
192.168.100.20 //虚拟ip地址
}
}
virtual_server 192.168.100.20 80 { //虚拟VIP
delay_loop 6
lb_algo rr
lb_kind DR //DR模式
persistence_timeout 50
protocol TCP
real_server 192.168.100.144 80 { //节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.156 80 { //节点服务器
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
systemctl restart keepalived.service
八、 客户端测试
- 手配ip地址 192.168.100.188
- 在ping 虚拟VIP期间需要一直对主和备份的虚拟VIP进行重启网卡和检查虚拟VIP是否一直存在,等待时间较长,耐心一点
- ping 192.168.100.20 -t