LVS-DR数据包流向
数据包流经路线为1、2、3、4
接受和响应都是由VIP地址回应,而根据DR模式来看的话,负载均衡器和real server是在同一内部网,VIP地址都是192.168.57.126,所以real server需要做路由禁锢,关闭各种重定向以及路由功能
LVS-DR数据包流向分析
1、Client向目标VIP发出请求,负载混衡器接受,ip包头源mac地址是自己的,目标mac地址是负载均衡器的
2、负载均衡器根据算法选择realserver_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为realserver_1的MAC地址,然后在局域网上发送。
3、realserver_1收到这个帧,解封装后发现目标IP与本机匹配(realserver事先绑定了vip),于是处理这个报文,随后重新封装报文,发送到局域网。
4、Client将收到回复报文,Client认为得到正常的服务,而不会知道是哪一台服务器处理的。注意:如果是跨网段,则报文需要通过路由器经由Internet返回给用户
详细版:
1、客户端发送请求到Director server(负载均衡器),请求的数据报文(源IP是cIP,目标IP是VIP)到达内核空间。
2、Director Server和Real server在同一个网络中,数据通过二层数据链路层来传输。
3、内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAc地址为Director Server的MAC地址,修改目标MAc地址为RealServer的Mac地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server。
4、到达Realserver的请求报文的MAc地址是自身的Mac地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP),将响应报文通过lo接口传送给物理网卡然后向外发出。
5、Real Server 直接将响应报文传送到客户端。
LVS-DR特性
1、 Director Server和Real Server必须在同一个物理网络中。
2、RealServer可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行
直接访问。
3、Director Server作为群集的访问入口,但不作为网关使用。
所有的请求报文经由Director Server,但回复响应报文不能经过Director Server
4、Real Server的网关不允许指向DirectorServer IP,即RealServer发送的数据包不允许经过Director Server。
5、Real Server. 上的lo:0接口配置VIP的IP地址。
LVS-DR中ARP问题
第一个问题: 在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址。LVS-DR特性是负载均衡器的接受和分发请求,真实服务器接受LVS请求和响应客户端同时,响应给客户端的源IP是一致的(VIP),那么问题来了,在同一个局域网里面配置同一个IP地址不是会冲突吗
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播
只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。
解决方法
对节点服务器进行处理,使其不响应针对vip的arp请求
1、使用虚接口lo:0 承载vip地址,并且设置路由禁锢
2、设置内核参数arp_ignore=1,系统只相应目的ip为本地ip的arp请求
第二个问题,当realserver 01返回报文的时候lo:0 ip是192.168.100.100,而routearp表里记录的192.168.100.100对应的是LVS的mac地址,它就会更新掉,造成下一次传过来直接给realserver1
解决方法:
对节点服务器进行处理,设置内核参数arp_announce=2: 系统不使用ip包的源地址来设置arp请求的源地址,而选择发送接口的IP地址(即ens33地地址)
总结:
Keepalived
1、Keepalived
支持故障自动切换(Failover)
支持节点健康状态检查( Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup’节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切换回master 节点(前提是根据优先级)。
2、Keepalived实现原理剖析
keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能VRRP (虚拟路由冗余协议)是针对路由器的一种备份解决方案。
由多台路由器组成个热备份组,通过共用的虚拟IP地址对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
snmp通过网络管理服务器、交换机、路由器等设备的一种协议
在keepalivedSNMP管理的是健康检查(状态)
PS:在监控中也会通过snmp监控、获取被监控服务器的数据
发生场景:企业应用中,单台服务器承担应用存在单点故障的危险,单点故障一旦发生,企业服务将发生中断,造成极大的危险
单点故障(没有备份,挂掉就没了)
备份冗余(keepalived热备方案)
keepalived 主-备方案:
以优先级区分主备关系
以id表示热备组中的服务器定位
以vip作为接收、响应请求的地址(只会存在于master服务器上)
Keepalived实现原理
keepalived采用vrrp热备份协议实现linux服务器的多机热备功能,共享同一个VIP,供于VIP飘移选择主设备
VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案
●由多台路由器组成-一个热备组,通过共用的虚拟IP地址对外提供服务
●每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态.
●若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
LVS-DR+keepalived部署
主机 | IP |
---|---|
real-server1 | 192.168.59.129 |
real-server2 | 192.168.59.128 |
lvs1 | 192.168.59.130 |
lvs2 | 192.168.59.131 |
client(win) | 192.168.59.22 |
LVS-DR部署(192.168.59.130、192.168.59.131 主备都要配)
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
首先肯定要关闭防火墙和selinux
创建虚拟VIP地址:192.168.59.100
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.59.100
NETMASK=255.255.255.255
service network restart 或 systemctl restart network
ifup ens33:0
ifconfig ens33:0
重新启动网卡,在开启网卡
LVS2有的时候不管是ifup 还是restart 都开不了ens33:0,需要开启NetworkManager重启网卡 再关闭。
添加负载均衡策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.59.100:80 -s rr
ipvsadm -a -t 192.168.59.100:80 -r 192.168.59.129:80 -g
ipvsadm -a -t 192.168.59.100:80 -r 192.168.59.128:80 -g
ipvsadm
ipvsadm -ln
配置节点服务器
关掉防火墙和selinux 安装httpd服务
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
然后编写主页文件便于区分
192.168.59.129
echo 'this is dyf web' > /var/www/html/index.html
192.168.59.128
echo 'this is aabb web' > /var/www/html/index.html
编写回环地址
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.59.100
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
route add -host 192.168.59.100 dev lo:0
编辑内核配置
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
systemctl start httpd
可以查看结果
是轮询的
设置keepalived
LVS1
之前安装好keepalived 就不yum了
先备份一下配置文件 以防出错
cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak
配置文件
vim keepalived.conf
global_defs { #定义全局参数
router_id lvs_01 #热备组内的设备名称不能一致
}
vrrp_instance vi_1 { #定义VRRP热备实例参数
state MASTER #指定热备状态,主为master,备为backup
interface ens33 #指定承载vip地址的物理接口
virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
priority 110 #指定优先级,数值越大越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress { #指定集群VIP地址
192.168.59.100
}
}
virtual_server 192.168.59.100 80 { #指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
lb_algo rr #指定调度算法,轮询(rr)
lb_kind DR #指定集群工作模式,直接路由DR
persistence_timeout 6 #健康检查的间隔时间
protocol TCP #应用服务采用的是TCP协议
real_server 192.168.59.129 80 { #指定第一个web节点的地址,端口
weight 1 #节点权重
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.59.128 80 { #指定第二个web节点的地址,端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
LVS2
global_defs {
router_id lvs_02
}
vrrp_instance vi_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
192.168.59.100
}
}
virtual_server 192.168.59.100 80 {
lb_algo rr
lb_kind DR
persistence_timeout 6
protocol TCP
real_server 192.168.59.129 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.59.128 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
两端开启keepalived
systemctl start keepalived.service
可以看到LVS1的VIP存在 ,LVS2的VIP消失了
下面开始实验 关闭LVS1的keepalived
可以看到LVS1上的VIP飘移到了LVS2上
小结
Keepalived服务进行健康检查,比较灵活的地方在于我们可以和其他各个服务搭建HA集群的时候,使用shell脚本来自定义健康检测脚本,从而实现对VIP飘移的控制
服务 | 功能 | 工作层 |
---|---|---|
Apache | 负载均衡 | |
Nginx | 负载均衡 | 4、7 |
LVS | 负载均衡 | 4 |
Haproxy | 负载均衡 | 4、7 |
LVS:一种四层的负载均衡策略(适合于中大型环境)
LVS集成在内核之中,也是比较消耗资源的
LVS三种模式
1、NAT
2、TUN
3、DR
四种分流算法
1、轮询
2、加权轮询
3、最小连接
4、加权最少连接
LVS可以和Keepalived结合实现备份、冗余、健康检查、故障切换
keepalived:
1、vrrp热备协议 主要针对的对象是router 路由器,同一个路由器下为同一个热备组,同一个热备组中的成员ID不可相同
2、以VIP作为提供服务的IP地址,VIP只会飘移在优先级最高的设备中,多种类型的设备以优先级区分主-备-(备)关系,主宕机,则主优先级下降,备服务器将提升为主(VIP飘移到备)