一、 企业群集应用概述
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集群类型中的术语
| 名称 | 详细名称 | 描述 |
|---|---|---|
| VS | Virtual Server | 代理服务器 |
| RS | Real Server | 真实服务器 (节点服务器) |
| CIP | Client lP | 客户端请求IP |
| VIP | Virtual lP | 直接面向用户的IP地址,通常为公网IP (代理服务器的外网ip) |
| DIP | Director 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)
2. 直接路由(DR)
直接路由(Direct Routing):简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络。
LVS 默认的模式是:DR 直连路由模式
3. IP隧道
四、 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负载均衡部署
- 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
添加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
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
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 //验证
七、 LVS-DR负载均衡部署
- 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. 客户端访问: