LVS(Linux Virtual Server)即 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目,它的基本工作原理是在集群的前端使用一台负载均衡器,将用户的请求转发到后端的一组服务器上执行,而这台负载均衡器对用户来说是透明的,用户并不会察觉到后端服务器的存在。NAT(Network Address Translation)模式和 DR(Direct Routing)模式是 LVS 负载均衡群集中常用的两种工作模式,它们各自的优势如下:
NAT 模式的优势
- 易于部署和管理:NAT 模式下,负载均衡器作为所有客户端请求的入口和出口,后端服务器只需要配置内部私有 IP 地址,无需公网 IP 地址。这样可以方便地对后端服务器进行管理和维护,添加、删除或更换服务器时,只需要在负载均衡器上进行相应的配置即可,无需对外部网络进行过多的调整。例如,企业内部的服务器集群,后端服务器使用私有 IP 地址,通过负载均衡器的 NAT 转换与外部网络进行通信,管理起来较为简单。
- 良好的安全性:后端服务器隐藏在负载均衡器之后,外界只能看到负载均衡器的公网 IP 地址,无法直接访问后端服务器的内部 IP 地址,减少了后端服务器暴露在公网上的风险,降低了被攻击的可能性。比如,对于一些对安全性要求较高的应用,如金融交易系统,使用 NAT 模式可以有效保护后端服务器的安全。
- 支持端口映射:NAT 模式可以灵活地进行端口映射,将客户端请求的不同端口映射到后端服务器的不同端口上。这对于一些需要使用特定端口的应用非常有用,例如,将客户端对 8080 端口的请求映射到后端服务器的 80 端口上,方便对应用进行管理和部署。
- 适用于小规模网络:在小规模的网络环境中,NAT 模式的性能开销相对较小,因为所有的请求和响应都经过负载均衡器进行地址转换,处理流程相对简单。对于一些访问量不是很大的网站或应用系统,NAT 模式可以满足需求,并且成本较低。
DR 模式的优势
- 高性能:DR 模式中,负载均衡器只负责将请求的目的 MAC 地址修改为后端服务器的 MAC 地址,然后将请求转发出去,而响应数据包则直接从后端服务器返回给客户端,无需经过负载均衡器。这样大大减少了负载均衡器的流量压力,提高了系统的整体性能和吞吐量,适用于高并发、大流量的应用场景。例如,大型电商网站在促销活动期间,会有大量的用户访问,使用 DR 模式可以有效地处理这些请求。
- 低延迟:由于响应数据包直接从后端服务器返回给客户端,避免了在负载均衡器上的再次处理和转发,减少了数据传输的延迟。对于对延迟敏感的应用,如在线游戏、实时通信等,DR 模式可以提供更好的用户体验。
- 后端服务器扩展性好:DR 模式下,后端服务器可以使用公网 IP 地址或者与负载均衡器在同一网段的私有 IP 地址,并且可以很方便地添加或删除后端服务器,只需要保证后端服务器的 IP 地址与负载均衡器的 IP 地址在同一物理网络即可。这使得系统具有良好的扩展性,可以根据业务需求灵活地调整后端服务器的数量。
- 支持多种操作系统:DR 模式对后端服务器的操作系统没有严格的限制,几乎可以支持所有主流的操作系统,如 Linux、Windows、Solaris 等。这使得企业在选择后端服务器时具有更大的灵活性,可以根据实际需求选择合适的操作系统和硬件平台。
基于 openEuler 构建 LVS-DR 群集
1、环境准备
准备好下面四台服务器:
|-----|----------------|-----------------|
| 主机名 | IP地址 | 备注 |
| op1 | 192.168.121.10 | Director Server |
| op2 | 192.168.121.12 | Real Server1 |
| op3 | 192.168.121.13 | Real Server2 |
| op4 | 192.168.121.14 | Client |
2、Web服务器配置:
[root@openEuler-2 ~]# yum install nginx -y
[root@openEuler-2 ~]# echo "this is test page!(ip:`hostname -I`)" > /usr/share/nginx/html/index.html
[root@openEuler-2 ~]# systemctl enable --now nginx
[root@openEuler-2 ~]# curl localhost
this is test page!(ip:192.168.121.12 )
第二台RS配置同上
3、添加VIP的相关配置
在两台RS和DS上:
[root@openEuler-1 ~]# nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.121.10/32
Connection 'dummy-dummy1' (7a44b435-72fc-4aa4-afb2-28bf52a1b5b4) successfully added.
[root@openEuler-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:12:dd:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.121.11/24 brd 192.168.121.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe12:dd13/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 82:81:c6:9e:a9:f6 brd ff:ff:ff:ff:ff:ff
inet 192.168.121.10/32 scope global noprefixroute dummy1
valid_lft forever preferred_lft forever
inet6 fe80::1837:14b2:ae95:267a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
剩下二台RS配置同上
4、配置arp抑制
在两台RS上:
[root@openEuler-2 ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy1.arp_ignore = 1
> net.ipv4.conf.dummy1.arp_announce = 2
> EOF
使其生效
[root@openEuler-2 ~]# sysctl -p
5.LVS配置:
[root@openEuler-1 ~]# yum install ipvsadm -y
[root@openEuler-1 ~]# ipvsadm -At 192.168.121.10:80 -s rr
[root@openEuler-1 ~]# ipvsadm -at 192.168.121.10:80 -r 192.168.121.12:80 -g
[root@openEuler-1 ~]# ipvsadm -at 192.168.121.10:80 -r 192.168.121.13:80 -g
[root@openEuler-1 ~]# 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.121.10:80 rr
-> 192.168.121.12:80 Route 1 0 0
-> 192.168.121.13:80 Route 1 0 0
[相关参数说明]
ipvsadm --help
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式;-g、-i分别对应DR、TUN模式
-w 为节点服务器设置权重,默认为1
6.测试:
在Client上:
[root@localhost ~]# for ((i=1;i<10;i++)); do curl 192.168.121.10; done
this is test page!(ip:192.168.121.13 )
this is test page!(ip:192.168.121.12 )
this is test page!(ip:192.168.121.13 )
this is test page!(ip:192.168.121.12 )
this is test page!(ip:192.168.121.13 )
this is test page!(ip:192.168.121.12 )
this is test page!(ip:192.168.121.13 )
this is test page!(ip:192.168.121.12 )
this is test page!(ip:192.168.121.13 )