LVS负载均衡群集

119 阅读8分钟

一、群集的概念

1.群集的含义

  • Cluster,集群、群集
  • 由多台主机构成,但对外只表现为一一个整体,只提供一-个访问入口(域名或IP地址), 相当于一台大型计算机。

2.使用群集的原因

互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器已经无法满足负载均衡及高可用的要求。

解决方法

  • 使用价格昂贵的小型机、大型机。(纵向扩容)
  • 使用多台相对廉价的普通服务器构建服务群集。(横向扩容)

LVS群集技术

  • 在企业中常用的一种群集技术一LVS (Linux Virtual Server, Linux虚拟服务器)
  • 通过整合多台服务器,使用LVS来达到服务器的高可用和负载均衡,并以同一个IP地址对外提供相同的服务。

3.群集的目的

  • 提高性能:计算密集应用。如天气预报,核试验模拟。
  • 降低成本:相对百万美元的超级计算机,价格便宜。
  • 提高可扩展性:只要增加集群节点即可。
  • 增强可靠性:多个节点完成相同功能,避免单点失败。

二、企业群集应用概述

1. 系统性能扩展方式

  • Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务(升级单机的硬件设备)
  • Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务(调度分配问题,Cluster)

2. 群集的含义

Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统。

根据群集所针对的目标差异,Cluster 可分为三种类型:

  • LB(Load Balancing):负载均衡群集,多个主机组成,每个主机只承担一部分访问请求
  • HA(High Availiablity): 高可用群集,避免 SPOF(single Point Of failure) 单点故障
  • HPC(High-performance computing): 高性能群集

三、LVS 概述

LVS(Linux Virtual Server)虚拟服务器,是企业中常用的一种群集技术。

1. LVS工作原理

VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”。

2. LVS集群类型中的术语

名称详细名称描述
VSVirtual Server代理服务器
RSReal Server真实服务器 (节点服务器)
CIPClient  lP客户端请求IP
VIPVirtual  lP直接面向用户的IP地址,通常为公网IP (代理服务器的外网ip)
DIPDirector Server lP用于与后端RIP通信的IP地址 (代理服务器的内网ip)
RIP     Real Server lP后端真实服务器的IP地址

四、LVS 工作模式

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
  • lvs-dr:操纵封装新的MAC地址(直接路由)
  • lvs-tun:隧道模式
  • lvs-fullnat:修改请求报文的源和目标IP

1. LVS的NAT模式 (DNAT)

b7aac0623517da5cc075d8e0a4507b4.png

image.png

2. 直接路由(DR)

直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。

LVS 默认的模式是:DR 直连路由模式

3. IP隧道

image-20211117003814895.png

五、 LVS 调度算法

  • 静态方法: 不管后端真实服务器的状态,根据自身算法进行调度
  • 动态方法: 会根据后端服务器的状态来进行调度

1. 静态方法

  • RR (roundrobin):轮询,较常用
  • WRR (Weighted RR):加权轮询,较常用。先算总权重,再用自己的权重去除以总权重
  • SH (Source Hashing):实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
  • DH (Destination Hashing):目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存

2. 动态方法

主要根据每个RS当前的负载状态及调度算法进行调度,Overhead=value 较小的RS将被调度

  • LC (least connections):最小连接数调度。适用于长连接应用,不考虑权重。
Overhead=activeconns*256+inactiveconns
活动连接*256  +  非活动连接  ,得出的值越小,代表越有可能调度给你
  • WLC (Weighted LC):加权最小连接数调度。 默认调度方法
Overhead=(activeconns*256+inactiveconns)/weight
  • SED (Shortest Expection Delay):最短延迟调度。初始连接高权重优先,只检查活动连接,而不考虑非活动连接。
Overhead=(activeconns+1)*256/weight
  • NQ (Never Queue):第一轮均匀分配,后续SED
  • LBLC (Locality-Based LC):动态的DH算法,使用场景:根据负载状态实现正向代理,检查后端服务器忙不忙
  • LBLCR (LBLC with Replication):带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

注意:内核版本4.15版本后新增调度算法:FO 和 OVF

六、ipvsadm 工具

-A: 添加虚拟服务器
-D: 删除整个虚拟服务器
-s: 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc)
-a: 添加真实服务器(节点服务器)
-d: 删除某一个节点
-t: 指定VIP地址及TCP端口
-r: 指定RIP地址及TCP端口
-m: 表示使用NAT群集模式
-g: 表示使用DR模式
-i: 表示使用TUN模式
一w: 设置权重(权重为0时表示暂停节点)
-p 60: 表示保持长连接60秒
-l: 列表查看 LVS虚拟服务器(默认为查看所有)
-n: 以数字形式显示地址、端口等信息,常与"-l"选项组合使用。ipvsadm -ln


`管理集群服务`
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address   //删除
ipvsadm –C         //清空
ipvsadm –R         //重载,相当于ipvsadm-restore
ipvsadm -S [-n]    //保存,相当于ipvsadm-save

注意ipvsadm-save > /etc/sysconfig/ipvsadm 启动服务前,需要先准备好这个文件

七、 LVS-NAT负载均衡部署

ffc13ff6fb8bb636b22d9e181ed9b43.png

  • 7-1:LVS服务器 ens33:192.168.100.10 ; ens36:12.0.0.1
  • 7-2:真实服务器 192.168.100.20
  • 7-3:真实服务器 192.168.100.30
  • 7-4:客户端 12.0.0.100

7-1:添加一块网卡并设置为仅主机模式

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]# vim ifcfg-ens36
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36         //修改
DEVICE=ens36       //修改
ONBOOT=yes
IPADDR=12.0.0.1    //修改
NETMASK=255.255.255.0
GATEWAY=12.0.0.1   //修改
DNS1=218.2.135.1
DNS2=8.8.8.8

[root@localhost network-scripts]# yum install ipvsadm -y

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# sysctl -a |grep ipv4.ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens36.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@localhost network-scripts]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1   //添加,开启路由转发
[root@localhost network-scripts]# sysctl -p
net.ipv4.ip_forward = 1

image.png

1719736980948.jpg

image.png

image.png

添加ipvsadm策略

[root@localhost network-scripts]# ipvsadm  -A  -t 12.0.0.1:80 -s rr
//-A 添加虚拟服务器;-t 指定VIP地址及TCP端口;-s指定负载调度算法
[root@localhost network-scripts]# ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.100.20:80 -m
//-a 添加真实服务器;-t 指定VIP地址及TCP端口;-r 指定RIP地址及TCP端口;-m 使用NAT群集模式
[root@localhost network-scripts]# ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.100.30:80 -m
[root@localhost network-scripts]# ipvsadm -Ln   //查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  12.0.0.1:80 rr
  -> 192.168.100.20:80            Masq    1      0          0         
  -> 192.168.100.30:80            Masq    1      0          0 

image.png

7-2部署

[root@localhost ~]# systemctl stop firewalld 
set[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo 7-2 > /var/www/html/index.html
[root@localhost ~]# curl 192.168.100.20
7-2
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=566216cd-9e7c-4805-b004-4b446c8fdefb
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.20
NETMASK=255.255.255.0
GATEWAY=192.168.100.10   //指定网关,网关地址设置为负载调度器的内网地址
DNS1=218.2.135.1
DNS2=8.8.8.8

[root@localhost ~]# systemctl restart network

image.png

image.png

image.png

7-3部署

[root@localhost ~]# systemctl stop firewalld 
set[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# echo 7-3 > /var/www/html/index.html
[root@localhost ~]# curl 192.168.100.30
7-3
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=566216cd-9e7c-4805-b004-4b446c8fdefb
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.30
NETMASK=255.255.255.0
GATEWAY=192.168.100.10   //指定网关,网关地址设置为负载调度器的内网地址
DNS1=218.2.135.1
DNS2=8.8.8.8

[root@localhost ~]# systemctl restart network

image.png

image.png

image.png

7-4客户端

image.png

image.png

image.png