背景
上一章节(LVS NAT模型)我们介绍并实际搭建了一套LVS 的NAT实验环境,实验环境中lvs是单节点的,同时lvs的转发规则是通过ipvsadm手动配置的。我们在介绍lvs之前说过Keepalived,keepalived是为了Lvs而设计的,接下来这篇文章我们将介绍LVS的DR模型,并通过keepalived + lvs的方式来搭建一套LVS DR模型的高可用实验。
LVS DR模型介绍
操纵封装新的MAC地址!!
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
如上图所示,Director和REAL SERVER都配置同一个IP(VIP),Director将该IP配置到对外的网卡上,Real server将该IP配置到lo网卡上。配置arp_ignore为1(目的是让数据包发出apr请求时,只有Director会响应该arp请求),所有REAL SERVER对本身这个IP的ARP请求保持静默。而Director收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER通过网卡eth0收到这个数据包,由于Real Server上的lo网卡配置的也有VIP,所以RS接收该数据包。处理后直接返回给客户端(这里要配置arp_announce,目的是修改返回数据包的源ip地址。)。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
1. 用户请求目标网站时,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接。当数据包到达VIP所在的局域网时,在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,因此需要将IP地址转换为MAC地址,因此会发出apr请求,查询VIP对应的mac地址。==Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求。==我们在Real Server的lo网卡上配置了VIP,但是我们只想让Director上的网卡来响应我们的这个arp请求。因此就需要更改下我们的一些内核参数,具体含义见后文。这时,数据包就得到了二层的Director的传输地址。
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
2. 当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
3. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链.
4. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
5. 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
6. client的请求被Director转发并经过链路层寻址到达Realserver后,由于Realserver的lo接口配置了VIP(请求中的目标IP正是VIP),所以接收请求并处理。处理完成之后,将响应报文通过lo接口传送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)然后向外发出。此时的源IP地址为VIP,目标IP为CIP。==如果将源地址为VIP将数据包发送出去,那么最终交换机上会产生两条VIP对应的mac地址记录,一条是Director的mac地址记录,还有一条是Real server的mac地址记录,这将会导致真正的VIP无法接收到请求。==因此,此处要配置arp_announce,目的是为了修改源ip的目的地址。
# 配置arp_announce=2,选择该主机发送网卡上最合适的本地地址作为arp请求的源IP地址。
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
DR模式的特性:
1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
3、RS跟Director Server必须在同一个物理网络中
4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
5、不支持地址转换,也不支持端口映射
6、RS可以是大多数常见的操作系统
7、RS的网关绝不允许指向DIP
8、RS上的lo接口配置VIP的IP地址
LVS-DR实验
LVS的作用:
1. 做四层负载均衡,将数据转发到后端NGinx的七层负载;
2. 在DR模型中lvs更改数据包的源目MAC,用于数据转发;
注意:后端RS的端口必须与用户访问的端口一致,因为DR模型是通过修改MAC镜像数据转发的,是没有该别数据包的源目ip和源目端口的。
keepalived的作用:
1. 给lvs做高可用,生成vip,避免单点故障;
2. lvs对后端的RS没有可用性检查功能,keepalived可用解决该问题,当后端rs服务器出现故障时,keepalived可用根据规则将故障机器从转发集群中剔除。
1. 网络规划
设备 | ip | 网关 |
Client | 10.10.10.128/24 | - |
Route-link1 | 10.10.10.129/24 | - |
Route-link2 | 192.168.10.10/24 | - |
LVS-vip | 192.168.10.100/24 | 192.168.10.10 |
nginx-1 | 192.168.10.12/24 | 192.168.10.100 |
nginx-2 | 192.168.10.13/24 | 192.168.10.100 |
web-1 | 192.168.10.15/24 | - |
web-2 | 192.168.10.16/24 | - |
2. Route节点配置
配置Route节点的路由转发,以及配置设备ip。结合实际生产环境路由器上面需要开启端口映射。
## 由于是linux模拟的路由器,设置Route节点ip转发功能
root@Route:~# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
root@Route:~# sysctl -p
##开启端口映射
root@Route:~# iptables -t nat -A PREROUTING -d 10.10.10.129 -j DNAT --to 192.168.10.200
3. LVS 节点配置
1. 配置路由转发;
2. 配置IP地址,网关指向路由;
3. 配置keepalived设置vip。
4. 配置ipvs转发
3.1 配置路由转发
## 主备节点均配置
root@Lvs-Master:~#echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
root@Lvs-Master:~# sysctl -p
3.2 配置ip和网关
3.3 配置keepalived
Master节点
root@Lvs-Master:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from xhz@qq.com
smtp_server 192.168.65.129
smtp_connect_timeout 30
router_id keepalived-MASTER
}
vrrp_instance VI_1 {
state MASTER
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
##配置集群访问的IP+port
virtual_server 192.168.10.200 80 {
## 健康检查时间(检查后端rs的连通性),单位S
delay_loop 6
#配置负载均衡算法
lb_algo rr
# 设置LVS模型(NAT,DR,TUN)
lb_kind DR
# 设置回话持续时间
persistence_timeout 50
# 设置协议
protocol TCP
#配置后端RS节点(RS-1)
real_server 192.168.10.12 80 {
# 设置权重
#设置健康检查
TCP_CHECK {
#检查后端的80端口
connect_port 80
# 超时时间
connect_time 3
# 重试次数
retry 2
#时间间隔
delay_before_retry 3
}
}
#配置后端RS节点(RS-2)
real_server 192.168.10.13 80 {
# 设置权重
#设置健康检查
TCP_CHECK {
#检查后端的80端口
connect_port 80
# 超时时间
connect_time 3
# 重试次数
retry 2
#时间间隔
delay_before_retry 3
}
}
}
Backup节点
root@LVS-Backup:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from xhz@qq.com
smtp_server 192.168.65.129
smtp_connect_timeout 30
router_id keepalived-MASTER
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 10
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.10.200
}
}
##配置集群访问的IP+port
virtual_server 192.168.10.200 80 {
## 健康检查时间(检查后端rs的连通性),单位S
delay_loop 6
#配置负载均衡算法
lb_algo rr
# 设置LVS模型(NAT,DR,TUN)
lb_kind DR
# 设置回话持续时间
persistence_timeout 50
# 设置协议
protocol TCP
#配置后端RS节点(RS-1)
real_server 192.168.10.12 80 {
# 设置权重
weight 1
#设置健康检查
TCP_CHECK {
#检查后端的80端口
connect_port 80
# 超时时间
connect_time 3
# 重试次数
retry 2
#时间间隔
delay_before_retry 3
}
}
#配置后端RS节点(RS-2)
real_server 192.168.10.13 80 {
# 设置权重
weight 1
#设置健康检查
TCP_CHECK {
#检查后端的80端口
connect_port 80
# 超时时间
connect_time 3
# 重试次数
retry 2
#时间间隔
delay_before_retry 3
}
}
}
4. Nginx节点
1. 配置环回接口ip为VIP;
2. 配置arm忽略;
3. 配置路由指向路由器;
5. 配置Nginx负载均衡(七层负载)
4.1 配置环回接口
## 所以RS节点均要配置
root@proxy-2:~#ifconfig lo:0 192.168.10.200 netmask 255.255.255.255
4.2 配置arp忽略
## 所有RS节点均要配置
root@proxy-1:~# sysctl -p
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
root@proxy-1:~#
4.3 配置路由
## 所有RS节点均要配置
root@proxy-1:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.10 0.0.0.0 UG 20100 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
root@proxy-1:~#
4.4 配置负载均衡
## 节点1
root@proxy-1:~# cat /etc/nginx/conf.d/web1.conf
upstream lvsservers {
server 192.168.10.15:80;
server 192.168.10.16:80;
}
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
root /https;
location / {
proxy_pass http://lvsservers;
include proxy_params;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
##节点2
root@proxy-2:~# cat /etc/nginx/conf.d/web2.conf
upstream lvsservers {
server 192.168.10.15:80;
server 192.168.10.16:80;
}
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
location / {
proxy_pass http://lvsservers;
include proxy_params;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
5. 配置web节点
## web1节点
root@web-1:~# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
location / {
root /https;
index index.html;
}
}
root@web-1:~# cat /https/index.html
web1
root@web-1:~#
##web2节点
root@web-2:~# cat /etc/nginx/conf.d/web.conf
server {
listen 80;
server_name lvs_test.com www.lvs_test.com;
location / {
root /https;
index index.html;
}
}
root@web-2:~# cat /https/index.html
web2
root@web-2:~#
6. 测试
6.1 联通性测试
6.2 健康检查测试
当rs服务器(此处为Nginx服务器)宕机时,lvs自动剔除该节点的转发。
正常情况:
关闭proxy-1的nginx服务:
此时lvs的后端服务器为:
连通性测试:
恢复proxy-1的nginx
此时lvs的后端节点:
6.3 vip测试
暂停LVS-Msater的keepalived,vip切换