LVS 群集

1,008 阅读8分钟

一、 企业群集应用概述

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)

LVS工作原理1.png LVS工作原理2.png

2. 直接路由(DR)

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

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

3. IP隧道

ip隧道.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负载均衡部署

LVS部署(NAT).png
  • 7-1:LVS服务器 ens33:192.168.204.10 ; ens36:12.0.0.1
  • 7-2:真实服务器 192.168.204.20
  • 7-3:真实服务器 192.168.204.30
  • 7-4:客户端 12.0.0.100

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

[root@node1 ~]#  systemctl stop firewalld
[root@node1 ~]#  setenforce 0
[root@node1 ~]#  cd /etc/sysconfig/network-scripts/
[root@node1 network-scripts]#  cp ifcfg-ens33 ifcfg-ens36
[root@node1 network-scripts]#  vim ifcfg-ens36

[root@node1 network-scripts]#  yum install ipvsadm -y    //安装软件
[root@node1 network-scripts]#  systemctl restart network
//此时7-4能够ping通7-1


[root@node1 network-scripts]#  sysctl  -a |grep ipv4.ip_forward
   ......................
   net.ipv4.ip_forward = 0
   net.ipv4.ip_forward_use_pmtu = 0

[root@node1 network-scripts]#  vim /etc/sysctl.conf
   net.ipv4.ip_forward = 1      //开启路由转发!!!
[root@node1 network-scripts]#  sysctl -p   
net.ipv4.ip_forward = 1
7-1配置.png

添加ipvsadm策略

[root@node1 network-scripts]#  ipvsadm-save > /etc/sysconfig/ipvsadm
[root@node1 network-scripts]#  systemctl start ipvsadm

[root@node1 network-scripts]#  ipvsadm  -A  -t 12.0.0.1:80 -s rr
//-A 添加虚拟服务器;-t 指定VIP地址及TCP端口;-s指定负载调度算法
[root@node1 network-scripts]#  ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.204.20:80 -m
//-a 添加真实服务器;-t 指定VIP地址及TCP端口;-r 指定RIP地址及TCP端口;-m 使用NAT群集模式
[root@node1 network-scripts]#  ipvsadm  -a  -t 12.0.0.1:80 -r 192.168.204.30:80 -m

[root@node1 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.204.20:80            Masq    1      0          0
  -> 192.168.204.30:80            Masq    1      0          0

2. 7-2部署

[root@node2 ~]#  systemctl stop firewalld
[root@node2 ~]#  setenforce 0
[root@node2 ~]#  yum install httpd -y
[root@node2 ~]#  echo 7-2 > /var/www/html/index.html  //生成页面
[root@node2 ~]#  systemctl start httpd
[root@node2 ~]#  curl 192.168.204.20
7-2

//指定网关,网关地址设置为负载调度器的内网地址
[root@node2 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33
  GATEWAY=192.168.204.10
[root@node2 ~]#  systemctl restart network
7-2配置.png

3. 7-3部署

[root@node3 ~]#  systemctl stop firewalld
[root@node3 ~]#  setenforce 0
[root@node3 ~]#  yum install httpd -y
[root@node3 ~]#  echo 7-3 > /var/www/html/index.html
[root@node3 ~]#  systemctl start httpd
[root@node3 ~]#  curl 192.168.204.30
7-3

//指定网关,网关地址设置为负载调度器的内网地址
[root@node3 ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33
  GATEWAY=192.168.204.10
[root@node3 ~]#  systemctl restart network
7-3配置.png

4. 7-4客户端

[root@localhost ~]#  systemctl stop firewalld
[root@localhost ~]#  setenforce 0
[root@localhost ~]#  vim /etc/sysconfig/network-scripts/ifcfg-ens33 
  IPADDR=12.0.0.100
  GATEWAY=12.0.0.1
[root@localhost ~]#  systemctl restart network

[root@localhost ~]#  curl 12.0.0.1   //验证
7-4配置.png 7-4验证.png

七、 LVS-DR负载均衡部署

DR部署图.png
  • DR 服务器:192.168.204.10
  • web 服务器1:192.168.204.20
  • web 服务器2:192.168.204.30
  • vip(虚拟回环):192.168.204.188
  • 客户端:192.168.204.40

1. DR 服务器部署:

[root@node1 ~]#  systemctl stop firewalld
[root@node1 ~]#  setenforce 0
[root@node1 ~]#  cd /etc/sysconfig/network-scripts/
[root@node1 network-scripts]#  cp ifcfg-ens33 ifcfg-ens33:0  
[root@node1 network-scripts]#  vim ifcfg-ens33:0   //配置虚拟网卡
   NAME=ens33:0
   DEVICE=ens33:0
   IPADDR=192.168.204.188
   NETMASK=255.255.255.255
   //删除dns与网关,注意子网
[root@node1 network-scripts]#  systemctl restart network



[root@node1 network-scripts]#  vi /etc/sysctl.conf  //调整/proc响应参数
   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@node1 network-scripts]#  sysctl -p

[root@node1 network-scripts]#  yum install ipvsadm.x86_64 -y
[root@node1 network-scripts]#  ipvsadm-save > /etc/sysconfig/ipvsadm
[root@node1 network-scripts]#  systemctl start ipvsadm.service
[root@node1 network-scripts]#  ipvsadm -A -t 192.168.204.188:80 -s rr
[root@node1 network-scripts]#  ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.20:80 -g
[root@node1 network-scripts]#  ipvsadm -a -t 192.168.204.188:80 -r 192.168.204.30:80 -g

[root@node1 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  192.168.204.188:80 rr
  -> 192.168.204.20:80            Route   1      0          0
  -> 192.168.204.30:80            Route   1      0          0

2. 真实服务器1部署:

[root@node2 ~]#  systemctl stop firewalld
[root@node2 ~]#  setenforce 0
[root@node2 ~]#  cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]#  vim ifcfg-lo:0  //修改回环网卡名,IP地址,子网掩码
   DEVICE=lo:0
   IPADDR=192.168.204.188
   NETMASK=255.255.255.255
   NETWORK=127.0.0.0
[root@node2 network-scripts]#  systemctl restart network

[root@node2 network-scripts]#  yum install httpd -y
[root@node2 network-scripts]#  vim /etc/sysctl.conf
[root@node2 network-scripts]#  sysctl -p
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@node2 network-scripts]#  cd /var/www/html/
[root@node2 html]#  echo "7-2" > index.html
[root@node2 html]#  systemctl start httpd

3. 真实服务器2部署:

[root@node3 ~]#  systemctl stop firewalld
[root@node3 ~]#  setenforce 0
[root@node3 ~]#  vim /etc/sysctl.conf
[root@node3 ~]#  sysctl -p
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@node3 ~]#  ifconfig lo:0 192.168.204.188/32
[root@node3 ~]#  yum install httpd -y
[root@node3 ~]#  cd /var/www/html/
[root@node3 html]#  echo "7-3" > index.html
[root@node3 html]#  systemctl start httpd

4. 客户端访问:

LVS-DR.png