掘金 阅读 ( ) • 2024-06-19 11:09

theme: qklhk-chocolate

1、LVS集群

LVS 即 linux virtual server,是Linux虚拟服务器。

系统性能扩展方式:

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

LVS默认的规则:

  • 默认工作模式:DR模式(直连路由模式)
  • 默认调度算法:WLC 加权最小连接

1.1 Cluster

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

集群 Cluster 分为三种类型:

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

小拓展: HA高可用集群实现

keepalived:vrrp协议 虚拟路由协议

1.2 软件

  • LVS:四层 nginx 负载均衡软件,支持百万级并发
  • haproxy:支持七层,十万级
  • nginx:支持七层,万级

2、LVS 术语

LVS是四层:主要通过ip、协议、端口号。

四层协议是:tcp和udp;http是七层协议。

简称 名称 全称 VS 代理服务器 Virtual Server RS 真实服务器 Real Server(lvs) CIP 客户机IP Client IP VIP 代理服务器 外网IP Virtual serve IP DIP 代理服务器 内网IP Director IP RIP 真实服务器IP Real server IP

流程: CIP——VIP——DIP——RIP

image.png

3、LVS 工作模式

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

3.1 LVS-NAT 模式⭐⭐⭐

  1. 客户端访问时,源地址不变,目的地址一直在变;
  2. 服务端回复时,目的地址不变,源地址一直在变。

image.png

3.2 LVS-DR 模式

DR模式,是LVS默认的工作模式,也称为直连路由模式。主要是关于 路由器转发的过程。

NAT和DR模式 工作原理的区别:

  • NAT模式的工作原理是:原路进去,也从原路返回;
  • DR模式从原路进去,但不按原路返回,类似于打圈闭环,返回时,不经过LVS调度服务器。

NAT和DR模式 不同点:

  • NAT的代理服务器 和 真实服务器可以不在同一网段,中间可以添加路由器;
  • 但DR 直连路由模式中,代理和后台真实服务器,必须在同一网段,中间不能加路由器。因为真实服务器不需要通过代理服务器,会主动回包给客户端,但是客户端因为访问的是代理,所以并不认识真实服务器的ip地址,收到包后会将包丢掉。

关键原理:

ip不变,mac地址一直在变。怎么得到mac地址,通过ARP广播。

3.3 LVS 工作模式 对比

NAT DR TUN 优点 端口转换 性能最好 WAN 缺点 性能瓶颈 不支持跨网段 服务器支持隧道模式 真实服务器要求 any Non-arp device Tunneling 支持网络 private(私网) LAN(私网) LAN/WAN(私网/公网) 真实服务器数量 low (10~20) High (100) High (100) 真实服务器网关 lvs内网地址 Own router(网工定义) Own router(网工定义)

4、LVS 调度算法⭐⭐

分为两种:

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

4.1 静态算法:

类型 名称 说明 RR 轮询 roundrobin,较常用 WRR 加权轮询 Weighted RR,加权轮询,较常用。先算总权重 再用自己的 权重去除以 总权重 SH 源IP地址hash Source Hashing,将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现session sticky会话绑定 DH 目标地址哈希 Destination Hashing,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS

小拓展:什么是会话绑定?

假如客户端,第一次访问的时候是web1服务器,那么所有的信息都是在web1上。如果下次访问的是web2,那么web2要从web1上先读取缓存数据。这样就会浪费时间和资源。所以才希望客户端如果第一次访问的是web1,那么就一直访问web1,从而实现会话绑定。

4.2 动态算法:

  • active 活动连接
  • inactive 非活动连接
类型 名称 说明 LC 最小连接数 least connections,适用于长连接应用,不考虑权重 WLC 加权最小连接数 默认调度算法⭐,Weighted LC,但该默认算法第一轮算的并不合理 SED —— Shortest Expection Delay,初始连接 高权重优先,只检查活动连接,而不考虑非活动连接 NQ —— Never Queue,第一轮均匀分配,后续SED LBLC 动态的DH算法 Locality-Based LC,使用场景:根据负载状态实现正向代理,实现Web Cache等 LBLCR 带复制功能的LBLC LBLC with Replication,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

延展:

  1. LC 最小连接数
 公式算法:活动连接*256 + 非活动链接    //得出的值越小,代表相对较闲
  1. WLC 加权最小连接数 第一轮不合理
 Overhead=(activeconns*256+inactiveconns)/weight    //weight权重越大,总值就越小,越清闲
  1. SED 只检查活动连接,而不考虑非活动连接 权重小的 空闲的
 Overhead=(activeconns+1)*256/weight

动态算法 是根据参考值,判断服务器是忙碌还是清闲。参考值是通过算法公式,计算得到的。

5、ipvsadm工具

keepalive 会自动生成 ipvsadm工具

 yum install ipvsadm -y    //安装
 ​
 //软件启动之前,必须要有下面文件:
 ipvsadm-save > /etc/sysconfig/ipvsadm
 ​
 systemctl restart ipsvadm    //重启

5.1 选项

1、增删改查 选项:

选项 含义 -A 添加虚拟服务器 LVS调度器 -a 添加真实服务器,也就是节点服务器 -D 删除整个虚拟服务器策略 -d 删除某一个节点 -L 查看 LVS虚拟服务器。(默认为查看所有) -n 以数字形式显示地址、端口等信息

2、调度算法 选项:

选项 含义 -s 指定 调度算法。默认是 wlc 加权最小链接⭐ -w 设置权重。权重为0时,表示暂停节点

3、地址 端口 选项:

选项 含义 -t 指定VIP地址及TCP端口 tcp协议 -r 指定RIP地址及TCP端口

4、工作模式 选项:

选项 含义 -m 工作模式。表示使用NAT群集模式 -g 表示使用DR模式 -i 表示使用TUN 隧道模式

5、基础命令:

 ipvsadm -Ln     //查看规则,并以数字形式显示。注意:n必须放在L的后面
 ipvsadm -d      //删除单个策略
 ipvsadm -D      //删除所有策略
 ipvsadm -C      //清空策略

小拓展:

 iptables-save   //打印防火墙规则

6、LVS-NAT模式 负载均衡实验

image.png 实验环境:

7-1 LVS调度服务器

ens36 12.0.0.1

ens33 192.168.125.100

7-4 客户端 12.0.0.100

7-2 真实服务器 192.168.125.120 httpd

7-3 真实服务器 192.168.125.130 httpd

实验目的:客户机访问LVS调度服务器,LVS按照轮询的算法,分配给真实服务器7-2和7-3

 7-4:
 [root@7-4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
 //修改ip和网关
 [root@7-4 ~]# systemctl restart network
 7-1:
 [root@7-1 ~]#  systemctl stop firewalld
 [root@7-1 ~]#  setenforce 0
 ******添加ens36网卡*******
 [root@7-1 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33
 //修改ens33网关
 [root@7-1 ~]#  cd /etc/sysconfig/network-scripts/
 [root@7-1 network-scripts]#  cp ifcfg-ens33 ifcfg-ens36
 [root@7-1 network-scripts]#  vim ifcfg-ens36
 //修改ens36的ip、网关、网卡名,uuid删掉
 [root@7-1 network-scripts]#  systemctl restart network
 ​
 [root@7-1 network-scripts]#  yum install ipvsadm -y
 
 `开启路由转发功能:`
 [root@7-1 network-scripts]#  vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1
 [root@7-1 network-scripts]#  sysctl  -p
 [root@7-1 network-scripts]#  ipvsadm-save  >   /etc/sysconfig/ipvsadm
 [root@7-1 network-scripts]#  systemctl start ipvsadm.service
 
 `设置ipvsadm策略:`
 [root@7-1 network-scripts]#  ipvsadm  -A  -t 12.0.0.1:80 -s rr               //添加LVS虚拟服务器,tcp协议,vip地址为12.0.0.1:80,调度算法是轮询
 [root@7-1 network-scripts]#  ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.125.120:80 -m    //添加真实服务器,vip为12.0.0.1:80,RIP为192.168.125.120:80,工作模式是lvs-nat模式
 [root@7-1 network-scripts]#  ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.125.130:80 -m     //添加真实服务器,vip为12.0.0.1:80,RIP为192.168.125.130:80,工作模式是lvs-nat模式
 [root@7-1 network-scripts]#  ipvsadm  -Ln     //查看ipvsadm策略
 7-2:
 [root@7-2 ~]#  systemctl stop firewalld
 [root@7-2 ~]#  setenforce 0
 [root@7-2 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33       //修改网关
 GATEWAY=192.168.125.100
 [root@7-2 ~]#  systemctl restart network
 ​
 `创建httpd默认页面:`
 [root@7-2 ~]#  yum install epel-release.noarch -y
 [root@7-2 ~]#  yum install nginx -y
 [root@7-2 ~]#  systemctl start nginx
 [root@7-2 ~]#  echo "7-2" > /usr/share/nginx/html/index.html
 [root@7-2 ~]#  systemctl restart nginx
 7-3:
 [root@7-3 ~]#  systemctl stop firewalld
 [root@7-3 ~]#  setenforce 0
 [root@7-3 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33       //修改网关
 GATEWAY=192.168.125.100
 [root@7-3 ~]#  systemctl restart network
 ​
 `创建httpd默认页面:`
 [root@7-3 ~]#  yum install epel-release.noarch -y
 [root@7-3 ~]#  yum install nginx -y
 [root@7-3 ~]#  systemctl start nginx
 [root@7-3 ~]#  echo "7-3" > /usr/share/nginx/html/index.html
 [root@7-3 ~]#  systemctl restart nginx
 7-4:验证
 [root@localhost ~]# curl 12.0.0.1    //访问网关
 7-3
 [root@localhost ~]# curl 12.0.0.1
 7-2
 [root@localhost ~]# curl 12.0.0.1
 7-3
 [root@localhost ~]# curl 12.0.0.1
 7-2

7、LVS-DR模式 实验

ARP进行广播时,会问所有人谁是12.0.0.1,此时因为有多个虚拟地址,调度器和后台真实服务器 都会进行回复。这种情况下,要使用参数,对真实服务器进行设置,使其忽略ARP广播,从而只让调度器进行回复。

实验环境:客户机、调度器、真实服务器在同一网段。

7-6 客户机 192.168.125.160

7-1 调度器 192.168.125.100

7-2 服务器1 192.168.125.120

7-3 服务器2 192.168.125.130

虚拟ip 192.168.125.123

image.png

 7-1:
 [root@7-1 ~]#  systemctl stop firewalld
 [root@7-1 ~]#  setenforce 0
 [root@7-1 ~]#  yum install ipvsadm.x86_64 -y
 [root@7-1 ~]#  ipvsadm-save >/etc/sysconfig/ipvsadm
 [root@7-1 ~]#  systemctl start ipvsadm.service
 ​
 `配置虚拟ip`
 [root@7-1 ~]#  cd /etc/sysconfig/network-scripts/
 [root@7-1 network-scripts]#  cp ifcfg-ens33 ifcfg-ens33:0
 [root@7-1 network-scripts]#  vim ifcfg-ens33:0
 NAME=ens33:0
 DEVICE=ens33:0
 IPADDR=192.168.125.123
 NETMASK=255.255.255.255
 [root@7-1 network-scripts]#  systemctl restart network 
 ​
 `内核调优:`
 [root@7-1 network-scripts]#  vim /etc/sysctl.conf
 net.ipv4.ip_forward = 0
 net.ipv4.conf.all.send_redirects = 0
 net.ipv4.conf.default.send_redirects = 0
 net.ipv4.conf.ens33.send_redirects = 0
 [root@7-1 network-scripts]#  sysctl -p
 ​
 `设置ipvsadm策略:`
 [root@7-1 ~]#  ipvsadm -C     //清空策略
 [root@7-1 ~]#  ipvsadm -A -t 192.168.125.123:80 -s rr
 [root@7-1 ~]#  ipvsadm -a -t 192.168.125.123:80 -r 192.168.125.120:80 -g
 [root@7-1 ~]#  ipvsadm -a -t 192.168.125.123:80 -r 192.168.125.130:80 -g
 [root@7-1 ~]#  ipvsadm -Ln   //查看策略
 7-2:
 [root@localhost ~]# yum install httpd -y
 [root@localhost ~]# systemctl start httpd
 ​
 `修改回环地址:`
 [root@localhost ~]#  cd /etc/sysconfig/network-scripts/
 [root@localhost network-scripts]#  vim ifcfg-lo
 DEVICE=lo:0
 IPADDR=192.168.125.123
 NETMASK=255.255.255.255
 NETWORK=127.0.0.0
 [root@localhost network-scripts]#  systemctl restart network
 [root@localhost network-scripts]#  ip a    //可以查看ip设置
 ​
 `内核调优:关闭ARP广播`
 [root@localhost network-scripts]# vim /etc/sysctl.conf
 net.ipv4.conf.all.arp_ignore = 1
 net.ipv4.conf.all.arp_announce = 2
 net.ipv4.conf.default.arp_ignore = 1
 net.ipv4.conf.default.arp_announce = 2
 net.ipv4.conf.lo.arp_ignore = 1
 net.ipv4.conf.lo.arp_announce = 2
 [root@localhost network-scripts]# sysctl -p
 //0是回复、ignore是忽略、announce只回复真实网卡
 ​
 `新建访问页面:`
 [root@localhost network-scripts]#  cd /var/www/html
 [root@localhost html]#  echo "7-2 2-7" > index.html
 7-3:
 前面都同7-2一样!
 ​
 `新建访问页面:`
 [root@localhost network-scripts]#  cd /var/www/html
 [root@localhost html]#  echo "7-3 3-7" > index.html
 7-6:验证访问
 [root@localhost ~]# curl 192.168.125.123
 7-2 2-7
 [root@localhost ~]# curl 192.168.125.123
 7-3 3-7
 [root@localhost ~]# curl 192.168.125.123
 7-2 2-7
 [root@localhost ~]# curl 192.168.125.123
 7-3 3-7

注意:这个实验,不能用本机访问自己,不然会死循环,出不来效果。

因为,LVS是在INPUT链前设置规则,所以不会进入INPUT里,而访问自己又没办法进行转发。所以就陷入了死循环。