一、群集的概念
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集群类型中的术语
| 名称 | 详细名称 | 描述 |
|---|---|---|
| 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.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
添加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
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
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
7-4客户端