LVS负载均衡之DR模式
目录
1、LVS 的 DR 模式介绍
2、LVS 的 DR 模式部署过程
2.1 web 服务器准备
2.2 lvs 服务器配置
2.3 web 服务器配置
2.4 测试
2.5 keepalived 结合 lvs_DR 模式
本文来自我的博客旧文章~
1、LVS 的 DR 模式介绍
参考自官网:http://www.linuxvirtualserver.org/zh/lvs3.html
VS/DR
利用大多数Internet
服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM
的NetDispatcher
产品中使用的方法类似(其中服务器上的IP
地址配置方法是相似的),但IBM
的NetDispatcher
是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM
的专利。VS/DR
的体系结构如图所示:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过高速的交换机或者HUB
相连。VIP
地址为调度器和服务器组共享,调度器配置的VIP
地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP
地址配置在各自的Non-ARP
网络设备上,它对外面是不可见的,只 是用于处理目标地址为VIP
的网络请求。
VS/DR
的工作流程如图所示:它的连接调度和管理与VS/NAT
和VS/TUN
中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR
中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP
报文,而是将数据帧的MAC
地址改为选出服务器的MAC
地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC
地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP
报文。当服务器发现 报文的目标地址VIP
是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
在VS/DR
中,根据缺省的TCP/IP
协议栈处理,请求报文的目标地址为VIP
,响应报文的源地址肯定也为VIP
,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。VS/DR
负载调度器跟VS/TUN
一样只处于从客户到服务器的半连接中,按照半连接的TCP
有限状态机进行状态迁移。简单来说:请求由LVS
接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS
。DR
模式下需要LVS
和绑定同一个VIP
(RS 通过将VIP
绑定在loopback
实现)。一个请求过来时,LVS
只需要将网络帧的MAC
地址修改为某一台RS
的MAC
,该包就会被转发到相应的RS
处理,注意此时的源IP
和目标IP
都没变,LVS
只是做了一下移花接木。RS
收到LVS
转发来的包,链路层发现MAC
是自己的,到上面的网络层,发现IP
也是自己的,于是这个包被合法地接受,RS
感知不到前面有LVS
的存在。而当RS
返回响应时,只要直接向源IP
(即用户的IP
)返回即可,不再经过LVS
。DR
模式是性能最好的一种模式。优点:效率最高,负载均衡器只用分发请求,应答包通过单独的路由返回给客户端,提高了服务器并发能力。缺点:负载均衡器的网卡必须和物理网卡在同一网段上
2、LVS 的 DR 模式部署过程
环境:
lvs eth0:10.0.0.31 eth0:1:10.0.0.32 gateway:10.0.0.254
web01 eth0:10.0.0.71 lo:10.0.0.32 gateway:10.0.0.254
web02 eth0:10.0.0.81 lo:10.0.0.32 gateway:10.0.0.254
2.1 web 服务器准备
在 web 服务器上安装 httpd 服务来进行模拟,每台服务器的 web 首页不同,在负载均衡测试的时候以便区分 web01
[root@web01 ~]# yum install -y httpd
[root@web01 ~]# systemctl start httpd.service
[root@web01 ~]# systemctl enable httpd.service
[root@web01 ~]# echo 'web01'> /var/www/html/index.html
[root@web01 ~]# curl 127.0.0.1
web01
web02
[root@web02 ~]# yum install -y httpd
[root@web02 ~]# systemctl start httpd.service
[root@web02 ~]# systemctl enable httpd.service
[root@web02 ~]# echo 'web02'> /var/www/html/index.html
[root@web02 ~]# curl 127.0.0.1
web02
2.2 lvs 服务器配置
[root@lvs ~]# ifconfig eth0:0 10.0.0.32 netmask 255.255.255.255 #为网卡eth0增加辅助ip
[root@lvs ~]# yum install -y ipvsadm #安装lvs核心管理软件包
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -At 10.0.0.32:80 -s rr
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.71:80 -g
[root@lvs ~]# ipvsadm -at 10.0.0.32:80 -r 10.0.0.81:80 -g
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.32:80 rr
-> 10.0.0.71:80 Route 1 0 0
-> 10.0.0.81:80 Route 1 0 0
参数说明:-C --clear
清除内核虚拟服务器表中的所有记录-A --add-service
在内核的虚拟服务器表中添加一条新的虚拟服务器记录-t --tcp-service service-address
说明虚拟服务器提供的是 tcp 的服务-s --scheduler scheduler
使用的调度算法,调度算法可以指定以下 8 种:rr
(轮询),wrr
(权重),lc
(最后连接),wlc
(权重),lblc
(本地最后连接),lblcr
(带复制的本地最后连接),dh
(目的地址哈希),sh
(源地址哈希),sed
(最小期望延迟),nq
(永不排队)-a --add-server
在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器-r --real-server server-address
指定真实的服务器[Real-Server:port]
-g --gatewaying
指定LVS
的工作模式为直接路由模式(也是 LVS 默认的模式)-L --list
显示内核虚拟服务器表-n
不解析端口使用的协议
2.3 web 服务器配置
web01
[root@web01 ~]# ifconfig lo:0 10.0.0.32 netmask 255.255.255.255 #为环回地址增加辅助ip
[root@web01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.0.0.32/32 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:22:ee:cd brd ff:ff:ff:ff:ff:ff
inet 10.0.0.71/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe22:eecd/64 scope link
valid_lft forever preferred_lft forever
以下操作目的是修改内核参数,开启arp
抑制,调整arp
内核参数的意义:a)ARP
广播会产生的问题
当客户端发起访问VIP
对应的域名的请求(curl 10.0.0.32)时,根据网络通信原理会产生ARP
广播,因为负载均衡器dir
和真实的服务器rs
在同一网络并且VIP
设置在集群中的每个节点上,此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIP
的ARP
广播,这就会产生问题,大家都说我是"VIP"。b)为了达到负载均衡的目的,在所有real server
上要关闭所有arp
请求,导致不能响应client
发出的arp
请求(相当于哑巴),只有lvs
可以响应,这样请求就会传到lvs
的vip
中,这就是为什么要禁止real server
的arp
请求和响应。因此必须想法办让真实服务器忽略来自客户端计算机的ARP
广播请求 ——》 调整arp
内核参数
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
web02 的配置和 web01 相同
2.4 测试
测试的时候用这三台机器测试都不能成功,需要在浏览器访问或者另外找一台机器测试 测试的时候访问 10.0.0.32,访问到测试内容,配置 LVS 采用的是轮循模式。第一次是访问 web01,刷新后是访问 web02,再刷新后访问 web01
2.5 keepalived 结合 lvs_DR 模式
配置 keepalived 增加虚拟 ip,从而管理到 lvs,可以进一步配置为 lvs 服务器的高可用
[root@lvs ~]# yum install keepalived -y
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL #表示keepalived服务器的一个标识
}
vrrp_instance VI_1 { #定义一个vrrp组,组名唯一
state MASTER #定义改主机为keepalived的master主机
interface eth0 #监控eth0号端口
virtual_router_id 51 #虚拟路由id号为51,id号唯一,这个id决定了多播的MAC地址
priority 100 #节点优先级
advert_int 1 #检查间隔,默认为1秒
authentication {
auth_type PASS #认证方式,密码认证
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.32 #虚拟ip地址
}
}
virtual_server 10.0.0.32 80 { #虚拟主机设置
delay_loop 2 #每隔2秒查询realserver状态
lb_algo rr #lvs的调度算法
lb_kind DR #lvs的集群模式
protocol TCP #用TCP协议检查realserver状态
real_server 10.0.0.71 80 { #后端真实主机ip
weight 1 #每台机器的权重,0表示不给该机器转发请求,直到它恢复正常
HTTP_GET { #以下为健康检查项目
url {
path /index.html #访问的url首页
status_code 200 #返回状态码
}
connect_timeout 3 #连接超时时间,单位为秒
nb_get_retry 3 #检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除
delay_before_retry 3 #失败重试的间隔时间,单位为秒
}
}
real_server 10.0.0.81 80 {
weight 1
HTTP_GET {
url {
path /index.html
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# systemctl start keepalived.service
[root@lvs ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.32:80 rr
-> 10.0.0.71:80 Route 1 0 0
-> 10.0.0.81:80 Route 1 0 0
这里 keepalived 服务启动后,配置的 vip 也成功实现了 lvs 负载均衡,而且实现了对 web 服务器的健康检查,当某个 web 服务器宕机,lvs 的规则也会自动调整。