1. keepalived
1.1 关于keepalived
1.1.1 简介
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
1.1.2 VRRP协议工作原理
在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
虚拟路由器
虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。
主路由器(MASTER)
虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP数据转发等。
备份路由器(BACKUP)
虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。
1.1.3 VRRP选举机制
VRRP路由器在运行过程中有三种状态:
- Initialize状态: 系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;
- Master状态;
- Backup状态;
一般主路由器处于Master状态,备份路由器处于Backup状态。
VRRP使用选举机制来确定路由器的状态,优先级选举:
1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。
2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器
3.比较IP地址。在没有Ip地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。
如下图所示,虚拟IP为10.1.1.254,在VRRP组中没有IP地址拥有者,则比较优先级,很明显RB和RA的优先级要大于RC,则比较RA和RB的IP地址,RB的IP地址大。所以RB为组中的主路由器。
路由器使用VRRP 功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master 路由器,优先级低的成为Backup 路由器。Master 拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP 报文,通知备份组内的其他设备自己工作正常;Backup 路由器只接收Master 发来的报文信息,用来监控Master 的运行状态。当Master 失效时,Backup 路由器进行选举,优先级高的Backup 将成为新的Master 。
在抢占方式下,当Backup 路由器收到VRRP 报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master 路由器;否则将保持Backup状态;
在非抢占方式下,只要Master 路由器没有出现故障,备份组中的路由器始终保持Master 或Backup 状态,Backup 路由器即使随后被配置了更高的优先级也不会成为Master 路由器;
如果Backup 路由器的定时器超时后仍未收到Master 路由器发送来的VRRP报文,则认为Master 路由器已经无法正常工作,此时Backup 路由器会认为自己是Master 路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master 路由器,承担报文的转发功能。
1.1.4 keepalived检测节点状态的原理
Keepalived工作在TCP/IP参考模型的网络层、传输层、应用层:
网络层:Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层:Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层:Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:在配置文件中GET /index 可以正常GET则认为健康
1.2 keepalived简单安装
59 yum -y install popt-devel kernel-devel openssl-devel
60 tar -zxf keepalived-1.2.13.tar.gz
61 cd keepalived-1.2.13/
62 ./configure --prefix=/
63 make
64 make install
65 cp /etc/keepalived/keepalived.conf{,.bak}
1.3 keepalived配置文件详解
! Configuration File for keepalived
# 全局定义部分
global_defs {
notification_email {
root@localhost # 设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的sendmail服务。
test@126.com
}
notification_email_from root@localhost # 设置邮件的发送地址
smtp_server 127.0.0.1 # 设置smtp server地址
smtp_connect_timeout 30 # 设置连接smtp服务器超时时间
router_id LVS_DEVEL # 运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息
}
# vrrp实例定义部分,可以定义外网ip也可以定义内网ip。本文是2种方法同时定义使用
vrrp_instance VI_1 {
state MASTER # 指定Keepalived的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器
interface eth1 # 指定HA监测网络的接口
virtual_router_id 1 # 虚拟路由标识,这个标识是一个数字,并且同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的。
priority 101 # 定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 # 设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication # 设定验证类型和密码
{
auth_type PASS # 设置验证类型,主要有PASS和HA两种
auth_pass xde.146_5%DJYP # 设置验证密码,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
{
101.21.55.12
}
}
# 虚拟服务器定义部分
virtual_server 101.21.55.12 80 # 设置虚拟服务器,需要指定虚拟ip地址和服务端口,ip与端口之间用空格隔开
{
delay_loop 2 # 设置健康检查时间间隔,单位是秒
lb_algo wrr # 设置负载调度算法,这里设置为wrr,即最少链接调度
lb_kind DR # 设置负载均衡转发规则,可以有NAT、TUN和DR三个模式可选
persistence_timeout 0 # 会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制
protocol TCP # 指定转发的协议类型,有tcp和udp两种
nat_mask 255.255.255.240
gateway 101.21.55.158
real_server 101.21.55.13 80 # 配置服务节点1,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开
{
weight 1 # 设置权重,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源
TCP_CHECK # realserve的状态检测设置部分,单位是秒
{
connect_timeout 3 # 3秒无响应超时
nb_get_retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
}
}
real_server 101.21.55.14 80 # 配置服务节点2
{
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
2. LVS
2.1 LVS工作模式
LVS 的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR
NAT: 即(Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。
TUN :即(Virtual Server via IP Tunneling)
简称TUN模式,采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器。服务器节点分散在不同的位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信。
DR: 即(Virtual Server via Direct Routing)
采用半开放式网络结构,与TUN模式的结构类似,但是节点并不是分散的,而是与调度器位于同一物理网络。通过本地网络连接,不需要建立专用IP隧道。
LVS集群的管理工作主要包括创建虚拟服务器、添加服务器节点、查看集群节点状态、删除服务器节点和保存负载分配策略
2.2 调度算法
可以将LVS的调度算法分为两种:
- 固定调度算法:rr,wrr,dh(目标地址hash),sh(源地址hash)
- 动态调度算法:wlc,lc,lblc,lblcr
1)wlc:加权最小链接数,在最小链接数的基础上加上权重,性能优秀的机器权重大一点
2)lc:最小链接数
3)lblc:基于局部的最小链接;根据请求的目标IP地址找出该目标IP地址最近使用的服务器,如果该服务器是可用的没有超载,则将请求发送到服务器上,若服务器不存在,或服务器处于一半的工作负载,则用最少连接数选出一个服务器
4)lblcr:带复制的基于局部性的最少连接;它与LBLC算法不同之处是它要维护的是从一个目标IP地址到一组服务器的映射,而LBLC算法维护的是从一个目标IP地址到一台服务器的映射
LBLCR调度算法将“热门”站点映射到一组Cache服务器(服务器集合),当该“热门”站点的请求负载增加时,会增加集合里的Cache服务器,来处理不断增长的负载; 当该“热门”站点的请求负载降低时,会减少集合里的Cache服务器数目。这样,该“热门”站点的映像不太可能出现在所有的Cache服务器上,从而提供Cache集群系统的使用效率。
LBLCR算法先根据请求的目标IP 地址找出该目标IP地址对应的服务器组;按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服 务器从服务器组中删除,以降低复制的程度。
2.3 LVS集群搭建
2.3.1 服务器、网卡规划
主机 | IP | 角色 | 系统版本 |
---|---|---|---|
host0 | 客户机 | 7 | |
host1 | 192.168.1.127 | LVS1 | 7 |
host2 | 192.168.1.115 | LVS2 | 7 |
host3 | 192.168.1.125 | webserver1 | 7 |
host4 | 192.168.1.116 | webserver2 | 7 |
主机 | IP | 网关 |
---|---|---|
host0 | 1.1.1.4 | 外网虚拟IP1.1.1.1 |
host1 | 192.168.1.127 | 内网虚拟IP192.168.1.100 |
host1 | 1.1.1.2 | 外网虚拟IP1.1.1.1 |
host2 | 192.168.1.115 | 内网虚拟IP192.168.1.100 |
host2 | 1.1.1.3 | 外网虚拟IP1.1.1.1 |
host3 | 192.168.1.125 | 内网虚拟IP192.168.1.100 |
host4 | 192.168.1.116 | 内网虚拟IP192.168.1.100 |
1.1.1.* 用的网络连接方式为仅主机,192.168.1.* 用的连接方式为桥接
2.3.2 LVS操作逻辑
先加载模块,安装软件包
55 modprobe ip_vs && modprobe iptable_nat(如果不加载此模块,也可以在第一次访问时成功,但是会在再次访问时出现延迟过长,或访问超时现象)
56 mkdir /mount
57 mount /dev/cdrom /mount/
58 cd /mount/Packages/
59 rpm -ivh ipvsadm-1.27-7.el7.x86_64.rpm
操作逻辑
ipvsadm -A -t 192.168.10.100:80 -s rr 创建虚拟服务器
-A 添加虚拟服务器
-t 指定我的VIP地址和端口号
-s 指定负载均衡的调度算法
rr 轮询
wrr加权轮询
lc 最少连接数轮询
wlc加权最少连接数
ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.10:80 -m -w 1 向虚拟服务器里添加真实IP
-a 添加真实的服务器
-t 指定VIP端口 虚拟服务器IP
-r 指定真实节点服务器IP及端口 节点
-m 表示使用nat 模式
-g 表示使用DR模式
-i 表示使用TUN模式 IP隧道模式
-w 1:权重 0:为暂停节点
ipvsadm -ln 查看节点状态
-l 列出lvs的虚拟主机
n 以数字形式显示地址和端口
删除节点
ipvsadm -d -r 192.168.10.10:80 -t 192.168.10.100:80 删除节点
ipvsadm -D -t 192.168.10.100:80 删除虚拟服务器
-D 删除虚拟服务器
-d -r删除真实的IP节点
-t 指定服务器IP地址
ipvsadm-save > /etc/sysconfig/ipvsadm 保存策略
service ipvsadm start 开启 如果没有保存stop相当于清空
2.3.3 搭建LVS集群(NAT模式)
host1和host2上开启路由转发并添加内核参数
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
host1和host2上添加真实web节点
host1 和host2上搭建keepalived 过程略
修改host1和host2上keepalived的配置文件:
host1的修改如下
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 { #vrrp实例1,写内网虚拟IP
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
vrrp_instance VI_2 { #vrrp实例2 写外网虚拟IP
state MASTER
interface ens37
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
1.1.1.1
}
}
virtual_server里删掉 nat_mask 255.255.255.0 和 persistence_timeout 50
real_server里 保留weight和下边的三行括号,添加TCP_CHECK real_server里其他内容删除
另外,其他virtual_server都删除
修改完毕如下
virtual_server 1.1.1.1 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
#nat_mask 255.255.255.0
#persistence_timeout 50
protocol TCP
real_server 192.168.1.125 80 {
weight 1
TCP_CHECK {
connect_prot 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.1.116 80 {
weight 1
TCP_CHECK {
connect_prot 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
host2 修改keepalived配置文件(配置文件从host1scp过来,做略微调整)
实例1 里 改status priority 以及网卡名称(改成与本机对应的内网网卡名)
interface ens33
virtual_router_id 51
priority 90
实例2 里 修改与上边类似
state BACKUP
interface ens37
virtual_router_id 51
priority 90
host1 和 host2启动keepalived
[root@localhost ~]# /etc/init.d/keepalived start
Starting keepalived (via systemctl): [ OK ]
[root@localhost Packages]# ipvsadm -A -t 1.1.1.1:80 -s rr
[root@localhost Packages]# ipvsadm -a -t 1.1.1.1:80 -r 192.168.1.125:80 -m -w 1
[root@localhost Packages]# ipvsadm -a -t 1.1.1.1:80 -r 192.168.1.116:80 -m -w 1
[root@localhost Packages]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 1.1.1.1:80 rr
-> 192.168.1.116:80 Route 1 0 0
-> 192.168.1.125:80 Route 1 0 0
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm
[root@localhost ~]# 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.1.100:80 rr
-> 192.168.1.116:80 Route 1 0 0
-> 192.168.1.125:80 Route 1 0 0
Masq地址伪装 route采用DR模式 local本地的
客户机访问验证:
curl 1.1.1.1
出现轮询页面
2.3.4 LVS集群搭建(DR模式)
所有主机关闭防火墙和selinux
setenforce 0
systemctl stop firewalld
LVS-server运行脚本
15 modprobe ip_vs
16 mount /dev/cdrom /mount
17 rpm -ivh /mount/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
[root@localhost ~]# vim lvs2.sh
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.1.100
rs1=192.168.1.125
rs2=192.168.1.116
#注意这里的网卡名字
ifconfig ens32:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens32:2
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
ipvasdm-save > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
19 chmod +x lvs2.sh
20 ./lvs2.sh
后端两个web节点安装httpd,并设置不同页面内容,webserver1内容为hello world,webserver2内容为hello work,启动httpd,之后也运行脚本
[root@localhost ~]# vim rs1.sh
#/bin/bash
vip=192.168.1.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
19 chmod +x rs1.sh
20 ./rs1.sh
两个lvs_server上安装Keepalived,配置Keepalived,然后运行
21 ./configure --prefix=/ && make && make install
22 cp /etc/keepalived/keepalived.conf{,.bak}
23 vim /etc/keepalived/keepalived.conf #删除多余的virtual server
24 /etc/init.d/keepalived start
Keepalived配置文件内容如下
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.125 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.116 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
另外一台客户机访问虚拟ip,进行测试,出现轮询结果
[root@localhost network-scripts]# curl 192.168.1.100
<h1>hello work</h1>
[root@localhost network-scripts]# curl 192.168.1.100
<h1>hello world</h1>
对arp_ignore和arp_announce的理解
在使用DR模式时,为什么要在real server上做如下的配置呢?
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
要想搞清理上面配置的作用,首先要了解arp的工作原理:
ARP即地址解析协议,实现通过IP地址得知其物理地址,例如主机A要向主机B发送数据,它首先要查找arp表,寻找对映主机B的mac地址.知道了主机B的MAC地址,直接把目标MAC地址写入帧里面发送就可以了.
如果在ARP缓存表中没有找到目标IP地址,主机A就会在网络上发送一个广播,告之局域网中所有的主机自己的IP地址及mac地址,并询问主机B的MAC地址是什么?
网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应.
这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了.同时A和B还同时都更新了自己的ARP缓存表(因为A在询问的时候把自己的IP和MAC地址一起告诉了B).
下次A再向主机B或者B向A发送信息时,直接从各自的ARP缓存表里查找就可以了.
echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore
系统只回答目的IP为是本地IP的包,也就是对广播包不做响应.
lvs对外表现的是集群的VIP,而在DR模式里,后端的web服务器和lvs-server主机都有VIP的IP地址,这个时候想要得到lvs-server的mac地址,就需要发送ARP广播,由于设置了arp_ignore=1,对于广播的ARP查询,后端web节点不做回应,只有lvs-server做回应,这个时候客户机可以顺利获取lvs-server的mac地址,并把数据发给lvs-server所在的主机
echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce
echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce
后端web节点处理完请求后要把数据直接返回给客户端,这个时候就要查询一下客户端主机的mac地址,设置了这个参数后,在向客户端查询Mac地址的时候,用ens32这块普通网卡作为源IP,而不是lo:0
DR模式的整个过程:
1) 客户端获取VIP所在主机对应的Mac地址,把数据包发送给lvs-server
2)lvs-server接收到数据之后,根据配置,把请求的Mac地址改成后端web服务器的Mac地址,并把数据包转发给后端的web节点
3)后端web节点接收到数据包之后,可以发现数据包的目标IP是lo:0上对应的虚拟IP,所以,对请求进行处理的时候是在lo:0上进行的
4)后端的web节点处理完请求之后,看到请求的源地址是客户端IP,但是不知道mac地址,这个时候web节点用自身的普通网卡ens32发送ARP请求,查询一下客户端的Mac地址
5)得到Mac地址后,后端web节点通过lo:0网卡的虚拟IP把数据返回给客户端
lo网卡为一个接口,没有Mac地址
NAT模式keepalived配置文件内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.100
}
}
vrrp_instance VI_2 {
state MASTER
interface ens34
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
1.1.1.1
}
}
virtual_server 1.1.1.1 80 {
delay_loop 2
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.20.116 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.20.117 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}