目录
1.LVS简介
2.LVS体系结构
3.LVS相关术语
4. LVS工作模式
5. LVS调度算法
6.LVS集群介绍
6.1 LVS-DR模式
6.2 LVS – NAT 模式
6.3 LVS – TUN 模式
7.LVS 集群构建
7.1 LVS/NAT 模式配置
实验操作步骤
步骤 1 Nginx1 和 Nginx2 配置
步骤 2 安装和配置 LVS
步骤 3 检查验证 LVS 配置
附加任务:尝试将 LVS 的算法修改加权轮询。
步骤 1 修改 LVS 配置
步骤 2 修改两台 RS 的权重
7.2LVS/DR 模式配置
步骤 1 Nginx1 和 Nginx2 配置
步骤 2 LVS 预配置
步骤 3 LVS 配置
步骤 4 检查验证 LVS 配置
1.LVS简介
LVS是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项 目,它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux 标准内核的一部分,在 Linux2.4内核以前,使用 LVS 时必须要重新编译内核以支持 LVS 功能模块,但是从 Linux2.4 内核以后,已 经完全内置了LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。 使用LVS 技术要达到的目标是:通过 LVS 提供的负载均衡技术和 Linux 操作系统实现一个高性能、高可用 的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS自从 1998 年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用 LVS 技术实现高可伸缩 的、高可用的网络服务,例如WWW 服务、 Cache 服务、 DNS 服务、 FTP 服务、 MAIL 服务、视频 / 音频点 播服务等等,有许多比较著名网站和组织都在使用LVS 架设的集群系统,例如: Linux 的门户网站( www.linux.com )、向 RealPlayer 提供音频视频服务而闻名的 Real 公司、( www.real.com )、全球最大的开 源网站(sourceforge.net )等。
2.LVS体系结构
使用LVS 架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用 Load Balancer 表示,中间的服务器群组层,用Server Array 表示,最底端的数据共享存储层,用 Shared Storage 表示。
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器( Director Server ) 组成,LVS 模块就安装在 Director Server 上,而 Director 的主要作用类似于一个路由器,它含有完成 LVS 功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array 层的应用服务( Real Server)上。同时,在 Director Server 上还要安装对 Real Server 服务的监控模块 Ldirectord ,此模块用于监测各个Real Server 服务的健康状况。在 Real Server 不可用时把它从 LVS 路由表中剔除,恢复时重新加入。
Server Array层:由一组实际运行应用服务的机器组成, Real Server 可以是 WEB 服务器、 MAIL 服务器、FTP 服务器、 DNS 服务器、视频服务器中的一个或者多个,每个 Real Server 之间通过高速的 LAN 或分布在各地的WAN 相连接。在实际的应用中, Director Server 也可以同时兼任 Real Server 的角色。
Shared Storage层:是为所有 Real Server 提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS 网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如 Red hat 的 GFS 文件系统,oracle 提供的 OCFS2 文件系统等。
3.LVS相关术语
为了方便大家探讨 LVS 技术, LVS 社区提供了一个命名的约定,内容如下表
4. LVS工作模式
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server 节点,而 Real Server节点如何返回数据给用户,是 IPVS 实现的重点技术, IPVS 实现负载均衡机制有三种,分别是NAT、 TUN 和 DR 。
VS/NAT: 即( Virtual Server via Network Address Translation ) 也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址 (即虚拟IP 地址)改写成选定的 Real Server 地址,同时报文的目标端口也改成选定的 Real Server 的相应端口,最后将报文请求发送到选定的Real Server 。在服务器端得到数据后, Real Server 返回数据给用户 时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟 IP 地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
VS/TUN :即( Virtual Server via IP Tunneling ) 也就是IP 隧道技术实现虚拟服务器。它的连接调度和管理与 VS/NAT 方式一样,只是它的报文转发方法不同,VS/TUN 方式中,调度器采用 IP 隧道技术将用户请求转发到某个 Real Server ,而这个 Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server 的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在 TUN 方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
VS/DR: 即( Virtual Server via Direct Routing )也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT 和 VS/TUN 中的一样,但它的报文转发方法又有不同,VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server ,而 Real Server将响应直接返回给客户,免去了VS/TUN 中的 IP 隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server 与 Real Server 都有一块网卡连在同一物理网段上。
5. LVS调度算法
固定调度算法: rr , wrr , dh , sh
动态调度算法: wlc , lblc , lblcr , SED , NQ (后两种官方站点没提到)
详细讲述最常用的四种调度算法:
轮询调度(Round Robin )“轮询 ” 调度也叫 1:1 调度,调度器通过 “ 轮询 ” 调度算法将外部用户请求按顺序 1:1 的分配到集群中的每个Real Server上,这种算法平等地对待每一台 Real Server ,而不管服务器上实际的负载状况和连接状态。
加权轮询调度(Weighted Round Robin )“加权轮询 ” 调度算法是根据 Real Server 的不同处理能力来调度访问请求。可以对每台 Real Server 设置不同的调度权值,对于性能相对较好的Real Server 可以设置较高的权值,而对于处理能力较弱的 Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server 的负载情况,并动态地调整其权值。
最少链接调度(Least Connections ) “ 最少连接 ” 调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“ 最小连接 ” 调度算法可以较好地均衡负载。
加权最少链接调度(Weighted Least Connections ) “ 加权最少链接调度 ” 是 “ 最少连接调度 ” 的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1 ,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。
6.LVS集群介绍
6.1 LVS-DR模式
LVS-DR模式工作原理
首先,来自客户端计算机CIP 的请求被发送到 Director 的 VIP 。然后 Director 使用相同的 VIP 目的 IP 地址将请求发送到集群节点或真实服务器。然后,集群某个节点将回复该数据包,并将该数据包直接发送到客户端计算机(不经过director ),并且以此回复数据包使用的目的 VIP 地址作为源 IP 地址。因此,实际上是客户计算机被“ 欺骗 ” 了,客户计算机始终认为它正与同一台计算机对话,而实际上它正在发送请求数据包给一台计算机(LB ),并从另一台计算机( RS )接收回复的数据包。
6.2 LVS – NAT 模式
(a). 当用户请求到达 Director Server ,此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源IP 为 CIP ,目标 IP 为 VIP
(b). PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
(c). IPVS 比对数据包请求的服务是否为集群服务,若是,修改数据包的目标 IP 地址为后端服务器 IP ,然后将数据包发至POSTROUTING 链。 此时报文的源 IP 为 CIP ,目标 IP 为 RIP
(d). POSTROUTING 链通过选路,将数据包发送给 Real Server
(e). Real Server 比对发现目标为自己的 IP ,开始构建响应报文发回给 Director Server 。 此时报文的源 IP为RIP ,目标 IP 为 CIP
(f). Director Server 在响应客户端前,此时会将源 IP 地址修改为自己的 VIP 地址,然后响应给客户端。 此时报文的源IP 为 VIP ,目标 IP 为 CIP
6.3 LVS – TUN 模式
(a) 当用户请求到达 Director Server ,此时请求的数据报文会先到内核空间的 PREROUTING 链。 此时报文的源IP 为 CIP ,目标 IP 为 VIP 。
(b) PREROUTING 检查发现数据包的目标 IP 是本机,将数据包送至 INPUT 链
(c) IPVS 比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层 IP 报文,封装源IP为为 DIP ,目标 IP 为 RIP 。然后发至 POSTROUTING 链。 此时源 IP 为 DIP ,目标 IP 为 RIP
(d) POSTROUTING 链根据最新封装的 IP 报文,将数据包发至 RS (因为在外层封装多了一层 IP 首部,所以可以理解为此时通过隧道传输)。 此时源IP 为 DIP ,目标 IP 为 RIP
(e) RS 接收到报文后发现是自己的 IP 地址,就将报文接收下来,拆除掉最外层的 IP 后,会发现里面还有一层IP 首部,而且目标是自己的 lo 接口 VIP ,那么此时 RS 开始处理此请求,处理完成之后,通过 lo 接口送给eth0网卡,然后向外传递。 此时的源 IP 地址为 VIP ,目标 IP 为 CIP
(f) 响应报文最终送达至客户端
7.LVS 集群构建
7.1 LVS/NAT 模式配置
本实验由四台 Linux构成,分别是 Client、LVS、Ngxin1 和 Nginx2,其中 LVS 的 VIP 为192.168.186.50/24、DIP 为 192.168.186.100/24,Nginx1 的 RIP 为 192.168.186.101/24,Nginx2 的 RIP 为192.168.186.102/24
实验操作步骤
步骤 1 Nginx1 和 Nginx2 配置
[root@Nginx2 ~]# yum install nginx -y
[root@Nginx2 ~]# systemctl start nginx
[root@Nginx2 ~]# mkdir -p /data/nginx
[root@Nginx2 ~]# touch /data/nginx/index.html
[root@Nginx1 ~]# cat /etc/nginx/conf.d/vhost.conf
server{listen 80;server_name www.test.com;root /data/nginx;index index.html;}
[root@Nginx1 ~]# curl 192.168.186.102
hello,nginx2
[root@Nginx2 ~]# curl 192.168.186.101
hello,nginx1在 LVS 虚拟机上开启路由转发功能,具体参考命令如下:sed -i "s/ip_forward=0/ip_forward=1/g" /etc/sysctl.confsysctl -p | grep net.ipv4.ip_forwardsysctl -a | grep net.ipv4.ip_forward
配置完成后,测试是否能够正常访问 Nginx1 和 Nginx2,具体如下:
[root@LVS ~]# curl 192.168.186.101
hello,nginx1
[root@LVS ~]# curl 192.168.186.102
hello,nginx2
步骤 2 安装和配置 LVS
yum install -y ipvsadm
等待安装完成后,创建 ipvsadm 启动时所需的配置文件:touch /etc/sysconfig/ipvsadm
然后使用启动该服务,并查看该服务是否启动正常,具体如下:
[root@LVS ~]# systemctl enable ipvsadm --now
[root@LVS ~]# systemctl status ipvsadm
如果服务启动正常,使用以下命令创建算法为轮询的集群:
ipvsadm -A -t 192.168.186.50:80 -s rr
再将 Nginx1 和 Nginx2 添加为后端 RS,具体命令如下:
ipvsadm -a -t 192.168.186.50:80 -r 192.168.186.101 -m
ipvsadm -a -t 192.168.186.50:80 -r 192.168.186.102 -m
配置完成后,检查和核实配置是否生效:
[root@LVS ~]# 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.186.50:80 rr-> 192.168.186.101:80 Masq 1 0 0 -> 192.168.186.102:80 Masq 1 0 0
步骤 3 检查验证 LVS 配置
在 LVS 所在的 ECS 上,多次通过 LVS VIP 访问 web 服务,可以查看到以下现象
附加任务:尝试将 LVS 的算法修改加权轮询。
步骤 1 修改 LVS 配置
使用以下命令将当前 LVS 的算法修改为加权轮询:ipvsadm -E -t 192.168.186.50:80 -s wrr
修改完成后,查看是否生效,具体如下:
步骤 2 修改两台 RS 的权重
使用以下命令,将 Nginx1 的权重修改为 2:
[root@LVS ~]# ipvsadm -e -t 192.168.186.50:80 -r 192.168.186.101 -m -w 2
[root@LVS ~]# 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.186.50:80 wrr
-> 192.168.186.101:80 Masq 2 0 0
-> 192.168.186.102:80 Masq 1 0 0
步骤 3 检查验证 LVS 配置
登录 Client 虚拟机,多次通过 LVS VIP 访问 web 服务,可以查看到以下现象:
根据上图,可得出 LVS 的算法已修改为加权轮询
7.2LVS/DR 模式配置
本实验共使用四台虚拟机,其中一台配置为 LVS 服务器,两台用于 Nginx 服务器的搭建,剩余一台为 Client。其中 Nginx 服务器可以和上一实验复用,两台 Nginx 服务器和 LVS 服务器处于同一子网中,客户端 处于另外一个子网。Nginx 服务器和 LVS 服务器配置 dummy 类型的接口接口用于承载 VIP 。
步骤 1 Nginx1 和 Nginx2 配置
Nginx1 和 Nginx2 中的 Nginx 服务相关配置和上实验保持一致即可。
两台 Nginx 上都需完成以下网络相关的配置。
网络需增加 VIP 的相关配置,具体命令如下:
[root@Nginx1 ~]# nmcli connection add type dummy ifname dummy2 ipv4.method manual
ipv4.addresses 192.168.186.50/32
[root@Nginx2 ~]# nmcli connection add type dummy ifname dummy2 ipv4.method manual
ipv4.addresses 192.168.186.50/32
将 RIP 的网关地址修改为路由器接口地址,参考命令如下:
[root@Nginx1 ~]# nmcli connection modify ens33 ipv4.gateway 192.168.186.1
[root@Nginx1 ~]# nmcli connection down ens33
[root@Nginx1 ~]# nmcli connection up ens33
[root@Nginx2 ~]# nmcli connection modify ens33 ipv4.gateway 192.168.186.1
[root@Nginx2 ~]# nmcli connection down ens33
[root@Nginx2 ~]# nmcli connection up ens33
完成网络配置后,修改相应的 arp 内核配置,具体命令如下:
[root@Nginx1 ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy2.arp_ignore = 1
> net.ipv4.conf.dummy2.arp_announce = 2
> EOF
[root@Nginx2 ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy2.arp_ignore = 1
> net.ipv4.conf.dummy2.arp_announce = 2
> EOF
步骤 2 LVS 预配置
如果本实验中的 LVS 服务器和上实验复用,则需删除残留配置。
删除上实验中增加的 LVS 相关配置,具体命令为:
[root@LVS ~]# ipvsadm -D -t 192.168.186.50:80
清理完成后,新增 VIP 相关配置,具体命令如下:
[root@LVS ~]# nmcli connection add type dummy ifname dummy2 ipv4.method manual
ipv4.addresses 192.168.186.50/32
如果需要,请将 DIP 网关配置为路由器接口地址,参考命令如下:
[root@LVS ~]# nmcli connection modify ens33 ipv4.gateway 192.168.186.1
[root@LVS ~]# nmcli connection down ens33
[root@LVS ~]# nmcli connection up ens33
如果是新创建的 LVS 服务器,则仅需要添加 VIP 和修改网关地址即可
步骤 3 LVS 配置
然后使用以下命令,添加相关配置:
[root@LVS ~]# ipvsadm -A -t 192.168.186.50:80 -s rr
[root@LVS ~]# ipvsadm -a -t 192.168.186.50:80 -r 192.168.186.101
[root@LVS ~]# ipvsadm -a -t 192.168.186.50:80 -r 192.168.186.102
添加完成后,查看具体配置,具体如下:
[root@LVS ~]# 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.186.50:80 rr
-> 192.168.186.101:80 Route 1 0 0
-> 192.168.186.102:80 Route 1 0 0
步骤 4 检查验证 LVS 配置
登录 Client 虚拟机,多次通过 LVS VIP 访问 web 服务,可以查看到以下现象:
可以看出, LVS 服务器以轮询方式分别向 Nginx1 和 Nginx2 转发请求,并将页面返回给客户端。