集群
一台主机无法解决,需要多台主机来支撑,一种扩展资源的方案。
三轴扩展
x轴:水平扩展,增加机器设备来扩展业务。
y轴:垂直扩展,增加或升级设备来扩展业务。
z轴:拆分扩展,基于业务属性,结合x、y轴方法满足扩展业务。
集群类型
高扩展:一个主机资源不足时,增加主机来满足资源需求。
高可用:集群中有主机市区连接,为了避免业务中断,其他主机来接受承担。
高性能:实现承担更多用户请求的解决方案。
单点故障
集群中唯一的服务器崩了,用户访问入口被关闭。
解决方案:使用高可用集群来提高网页业务的可用性和恢复能力。
高可用集群
也称之为主机冗余集群,核心业务用多台主机,保障核心业务正常运行,可解决单点故障问题。
前置知识-OSI七层模型
物理层(网线、MAC)
数据链路层(ARP、PPTP)
网络层(IP、ICMP)传输层(Port)
会话层(Session、ssl、tsl、rpc)
表示层(各种文件格式,JPEG、ASCII)
应用层(HTTP/HTTPS、各种应用服务)
分布式系统
分布式:多台分散的计算机,通过网络联接而成的系统,系统的处理和控制功能分布在各个计算机上。
分布式应用、分布式存储、分布式计算
集群与分布式特点区分
集群---同一任务的多个副本- 集群是多个主机在一起,共同承担,通过负载均衡分担请求,主要用于高可用、负载均衡,比如k8s、Redis 集群,能够提高处理业务的可用性和性能,满足不断增长的业务需求。
分布式---拆分任务
分布式是拆分成多个任务,分开处理,再合并在一起,主要用户处理大规模任务,比如Hadoop、微服务、区块链。
实现软件方案
LVS:可以实现二~四层的负载均衡
Nginx:可以实现二~七层的负载均衡
Haproxy:可以实现二~七层的负载均衡
阿里云:可以实现二~七层的负载均衡- ALB七层负载均衡、NLB四层负载均衡、CLB传统型负载均衡
亚马逊云:可以实现二~七层的负载均衡- ALB七层负载均衡、NLB四层负载均衡、CLB传统型负载均衡
五表五链
五表
security:对数据的mac信息进行过滤
filter:对主机接受的数据包实现过滤功能,是iptables的默认规则
nat:对主机接受的数据包实现装换功能,端口映射、地址映射等
mangle:用于对特定数据包的修改,报文拆开、修改、封装表
raw:特殊场景下实现的自定义规则
五链
PREROUTING:数据包进入路由前
FORWARD:通过路由表后,目的地不为本机
POSTROUTING:发送到网卡接口之前
INPUT:通过路由表后目的地为本机
OUTPUT:由本机产生,向外转发
流程:
PREROUTING---在刚进入网卡,还没决定去向---可以在这里做DNAT目标地址转换---外网访问内网
路由决策---判断这个包是不是发送给本机,还是给别人
如果是---INPUT---是否允许该包进入本机服务
如果是转发---FORWARD---可以决定是否允许这个包被本机转发出去
如果是本机发的包---OUTPUT---可以控制本机主动发给哪些连接
POSTROUTING---数据包即将从网卡发出---可以在这里做SNAT源地址转换---内网访问外网
LVS
全称Linux Virtual Server,Linux虚拟服务器。
可以基于LVS的负载均衡技术,实现一个高扩展的Linux服务器集群。
三部分组成:- 负载调度器(load balancer):负责将客户的请求调度到后端服务器上。- 服务器池(server pool):真正响应用户请求的后端主机。- 共享存储(shared storage):存储配置、元数据等相关信息。
四种主要的资源调度:(此外还有其他)- NAT:修改请求数据包的目标IP地址,实现请求转发功能。- Tunneling:给请求数据包外部增加新的IP首部,实现请求转发功能。- DirectRouting:修改请求数据包的MAC地址,实现请求转发功能。- FULLNAT:结合SYNPROXY技术,修改数据包的源IP地址和目标IP地址,实现请求转发功能。
LVS工作原理

数据先经过PREROUTING链做处理,再到路由裁决,如果是本机服务,则走LOCAL_IN到上层协议栈;如果是转发到后端服务器,LVS拦截,通过LVS规则让数据区选定的后端服务器,经LVS改写的数据包,进入FORWARD链做转发效验,再到POSTROUTING链做出口网络适配,最终将数据发往后端服务器。
LVS中常见术语

DS:Director Server,部署的LVS主机,也可以叫VS(Virtual Server)。
RS:Real Server,真正响应用户主机的后端服务器主机,也可以叫BS(Backend Server)。
VIP:Virtual Server IP,LVS主机的外网IP。
DIP:Director Server IP,LVS主机的内网IP。
RIP:Real Server IP,在LVS调度主机后端,真正响应用户请求的主机IP。
CIP:Client IP,发起请求的用户客户端IP。
四IP关系:CIP<--->VIP===DIP<--->RIP
LVS用户访问流程
用户在客户端发起访问请求,经过DNS域名解析获得虚拟服务IP(VIP),请求到达VIP所在的LVS主机(VS),LVS主机(VS)根据调度策略将请求通过DIP网卡转发到内网,由选定真正响应的后端主机(RS)处理请求,最终通过特定方式直接返回给客户端。
四层负载和七层代理
四层负载(port)+七层负载(协议数据)- 四层:性能上强,但是功能上要弱些- 七层:功能上强,但是性能上要弱些
标准的四层负载代理- 不参与客服端雨服务端TCP握手过程,直接进行握手- Nginx虽然支持四层,但本质是伪四层代理,客户端、服务端都要核Nginx进行连接握手
标准的七层负载代理- 需要参与客户端和服务端的TCP握手过程
LVS软件
IPVS:LVS中一个支持多种IP负载均衡的IP虚拟服务器软件。内核中开启模块应用就能用。
ipvsadm:命令行工具,负责伪IPVS资源调度编写转交规则- 定义lvs集群名称- 定义该集群中处于后端提供真实服务器的主机列表RS- 需要安装该软件
软件部署
rocky:yum install ipvsadm
ubuntu:apt install ipvsadm
查看集群状态
----------------------------------------------------------
[👑root💻rocky9-12🚀~]
#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
----------------------------------------------------------
格式:ipvsadm -Ln-L:显示当前的服务或者主机信息-n:地址和端口的数字输出
结果格式:协议 服务器地址:服务端口 调度标识-> 后端主机地址:端口信息 数据包转发标识 主机权重 活动连接数 非活动链接数----------------------------------------------------------
[👑root💻rocky9-12🚀~]
#ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS-> RemoteAddress:Port
----------------------------------------------------------
结果显示:多了一些性能评判的指标数据CPS-连接数、InPPS-输入连接数、OutPPS-输出连接数、Inbps-输入数据量、OutBPS-输出数据量
LVS工作模式
三种工作模式:NAT模式、DR模式、TUN模式
NAT模式
Network address translation网络地址转换
私网主机和公网主机通信时,数据包经过NAT网关是,会将数据包IP报文首部的源IP或目的IP进行转换。本质是多目标的DNAT。
NAT工作流程
用户先向有公网IP的LVS主机地址(VIP)发起请求(源地址为CIP,目标地址为VIP)
LVS主机收到数据包后,将目标地址修改为后端RS1主机并转发(源地址为CIP,目标地址改为RIP1)
后端RS1主机处理完请求,将源地址为RIP1、目标地址为CIP的数据包返回给LVS主机
LVS主机接受后,将数据包源地址修改为自身公网地址(VIP),再转发出去(源地址为VIP,目标地址为CIP)
NAT模式特点
涉及两个网段:公网网段和私网网段
请求和响应报文都要经由LVS转发- 数据包进入私网的时候,转换的是目标IP地址,提供服务的是RIP主机- 数据包进入外网的时候,转换的是源IP地址,数据包来的时候找的VIP
RIP和DIP应在一个IP网络,并使用私网地址
LVS主机需要开启ip_forward转发
DR模型
Direct Routing直接路由
LVS的默认模式
DR工作流程
用户向右公网IP的LVS主机地址(VIP)发起请求(源地址为CIP,目标地址为VIP)
LVS主机接受到数据包后,修改数据包的目标MAC地址为后端RS主机并转发出去(源地址为CIP,目标地址为CIP)
后端RS主机处理玩请求,返回数据包给客户端主(源地址为VIP,目标地址为CIP)
DR模式特点
LVS服务器和RS服务器上都有VIP地址
RS的RIP可以使用死亡地址,也可以是公网地址
LVS服务器只处理请求报文,不处理响应报文
RS服务器可以使用大多数OS系统
TUN模式
IP tunneling IP隧道
TUN工作流程
用户向有公网IP的LVS主机地址(VIP)发起请求(源地址为CIP,目标地址为VIP)
LVS主机接受到数据包后,将原数据包封装到IP隧道数据包中,转发到后端RS主机(源地址为DIP,目标地址为RIP)
后端RS主机处理玩请求,返回数据包给客户端主机(源地址为VIP,目标地址为CIP)
TUN模型整体流程效果
数据包到达LVS主机之后对数据包进行二次封装处理通过POSTROUTING将数据包转发给后端的真实主机
数据包到达RS主机后拆解数据包,然后响应数据直接将数据返回给客户端主机
相对DR模型来讲,TUN模型修改的是更深层的IP报文,性能有些差,但可以跨网络
TUN特点
RIP和DIP可以处于不同的物理网络
集群节点可以跨互联网实现
LVS服务器只处理请求报文,不处理响应报文,相对于NAT模型负载性能会大幅提升
不支持端口映射
无需开启ip_forward
RS服务器的操作系统必须支持隧道功能
各个模型相比较

NAT:多目标的DNAT,四层,支持端口修改,请求报文和响应报文都要经过LVS
DR:默认模型,二层,只修改MAC,不支持端口修改,性能好,LVS负载比较小,LVS和RS在同一个网段,请求报文经过LVS,响应报文不经过LVS
TUN:三层,添加一个新的IP头,支持LVS和RS不在同一个网段,不支持端口修改,请求报文经过LVS,响应报文不经过LVS

调度算法
根据一些方法和策略,处理用户请求按需妆发,从而实现所有主机高效工作。
常见调度算法
内置策略雨露均沾定向服务商业类型
扩展策略定义算法第三方算法
LVS内置策略
RR---循环调度LVS服务器讲前端请求轮流转发到每一台RS服务器上,后端每台RS服务器处理的请求量都是相同
WRR---加权循环调度LVS服务器讲前端请求根据后端RS服务器的权重进行转发,对于后端RS服务器中性能好的机器可以设置较高权重
SH---源哈希调度将来自同一个IP地址的客服端请求调度到后端同一台RS服务器上,从而实现会话保持
DH---目标哈希调度客户端请求第一次调度到某台RS服务器后,其后续请求都会发往同一台RS服务器,一般用于正向代理缓存场景
LC---最少连接调度
WLC---加权最小连接调度
FO---加权故障转移调度
OVF---加权溢出调度
LBLC---基于位置的最小连接调度
LBLCR---基于位置的最小连接调度
MH---磁悬浮哈希调度
SED---最短的逾期延迟调度
NQ---从不排队调度
分类:静态:RR、WRR、DH、SH动态:LC、WLC、LBLC、LBLCR、SED、NQ高版本内核新增:FO、OVF、MH、TNDR等
LVS实践
增加集群
ipvsadm -A -t 192.168.8.14:80
ipvsadm -A -t 192.168.8.15:80
ipvsadm -Ln #查看集群,默认采用wlc调度

编辑集群
ipvsadm -E -t 192.168.8.14:80 -s rr #修改为rr调度算法

删除集群
ipvsadm -D -t 192.168.8.14:80
ipvsadm -D -t 192.168.8.15:80

增加主机
ipvsadm -A -t 192.168.8.12:80 #增加集群
ipvsadm -a -t 192.168.8.12:80 -r 192.168.8.13:80 #增加13主机
ipvsadm -a -t 192.168.8.12:80 -r 192.168.8.14:8080 -m #增加14主机,端口8080
ipvsadm -a -t 192.168.8.12:80 -r 192.168.8.15:80 -w 3 #增加15主机,权重为3

编辑主机
ipvsadm -e -t 192.168.8.12:80 -r 192.168.8.15:80 -m #改为NAT模式
ipvsadm -e -t 192.168.8.12:80 -r 192.168.8.13:80 -i #改为TUN模式

删除主机
ipvsadm -d -t192.168.8.12:80 -r 192.168.8.14:8080 #删除14主机
ipvsadm -D -t 192.168.8.12:80 #删除12集群

清除规则
ipvsadm -C

查看保存规则
ipvsadm-save #查看规则
ipvsadm -S #查看规则
ipvsadm-save -n > n-ipvsadm #导出规则,-n会更详细更精确

导入规则
ipvsadm-restore < n-ipvsadm

持久连接
为了确保来自同一个客户端的请求能在一定时间内被调度到同一台后端真是服务器(RS),以实现会话保持等功能
功能定位
保证会话连续性、提高效率与性能、便于数据处理
NAT实践
准备工作
准备工作IP
12主机:10.0.0.12 NAT网卡
13主机:10.0.0.13 NAT网卡、192.168.13 仅主机网卡
14主机:192.168.8.14 仅主机网卡
15主机:192.168.8.15 仅主机网卡
13主机开启转发
sysctl -a | grep ip_forward # 查看转发是否开启
vim /etc/sysctl.conf # 编辑sysctl配置文件
写入:net.ipv4.ip_forward = 1
sysctl -p # 重新加载


lvs真实主机增加路由
ip route add default via 192.168.8.13 #14、15主机都要加此路由
ip route list


lvs-server主机定制集群
安装ipvsadm服务
apt install ipvsadm

定制规则
ipvsadm -A -t 10.0.0.13:80 -s rr # 轮询
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.14 -m
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.15 -m
ipvsadm -Ln

测试效果
curl 10.0.0.13

修改为加权轮询(wrr)
ipvsadm -E -t 10.0.0.13:80 -s wrr
ipvsadm -e -t 10.0.0.13:80 -r 192.168.8.14:80 -w 3 -m
ipvsadm -Ln

测试效果
curl 10.0.0.13

NAT进阶实践
准备工作
各主机网卡IP
12主机:10.0.0.12 NAT网卡
13主机:10.0.0.13 NAT网卡、192.168.8.13 仅主机网卡
16主机:192.168.8.16 仅主机网卡、172.168.100.16 仅主机网卡
14主机:172.168.100.14 仅主机网卡
15主机:172.168.100.15 仅主机网卡
13、16主机开启转发
sysctl -a | grep ip_forward
vim /etc/sysctl.conf
写入:net.ipv4.ip_forward = 1
sysctl -p

配置路由
13主机路由
ip route add 192.168.8.0/24 via 172.168.100.16

16主机路由
ip route add 10.0.0.0/24 via 172.168.100.13

14、15主机路由
ip route list
ip route del default
ip route add default via 192.168.8.16 # 14、15主机都加
ip route list


定制规则
ipvsadm -A -t 10.0.0.13:80 -s rr
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.14 -m
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.15 -m
ipvsadm -Ln

测试效果
curl 10.0.0.13

多业务NAT实践
准备工作
14、15、16真实主机路由
ip route list
ip route del default
ip route add default via 192.168.8.13



14主机Nginx配置https
生成证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt

修改配置
vim /etc/nginx/nginx.conf
写入:
server {listen 443 ssl;ssl_certificate /etc/pki/tls/certs/server.crt;ssl_certificate_key /etc/pki/tls/private/server.key;
ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
root /usr/share/nginx/html;index index.html;
}

重启服务,测试
systemctl restart nginx
curl https://localhost
curl https://localhost -k
curl localhost

15主机光盘镜像源
mkdir /image
mount /dev/cdrom /image/
mkdir /etc/yum.repos.d/bak
vim /etc/yum.repos.d/rocky.repo
修改:
[baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=file:///image/BaseOS/ #改为光盘路径
gpgcheck=0
enabled=1
[appstream]
name=Rocky Linux $releasever - AppStream
baseurl=file:///image/AppStream/ #改为光盘路径
gpgcheck=0
enabled=1
yum makecache

15主机HTTPS配置
安装httpd
yum install httpd

安装mod_ssl模块
yum install mod_ssl.x86_64

生成自签证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/server.key -out /etc/pki/tls/certs/server.crt

修改ssl配置
vim /etc/httpd/conf.d/ssl.conf
修改:
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key

测试https
systemctl start httpd
curl https://localhost -k

13主机增加规则
ipvsadm -A -t 10.0.0.13:80 # 80端口集群
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.14 -m
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.15 -m
ipvsadm -a -t 10.0.0.13:80 -r 192.168.8.16 -m
ipvsadm -A -t 10.0.0.13:443 # 433端口集群
ipvsadm -a -t 10.0.0.13:443 -r 192.168.8.14:443 -m
ipvsadm -a -t 10.0.0.13:443 -r 192.168.8.15:443 -m
ipvsadm -Ln

测试
curl https://10.0.0.13
curl https://10.0.0.13 -k
curl 10.0.0.13


调度算法实践
WRR算法
ipvsadm -E -t 10.0.0.13:80 -s wrr
ipvsadm -e -t 10.0.0.13:80 -r 192.168.8.14:80 -m -w 1
ipvsadm -e -t 10.0.0.13:80 -r 192.168.8.15:80 -m -w 2
ipvsadm -e -t 10.0.0.13:80 -r 192.168.8.16:80 -m -w 3

测试
curl 10.0.0.13

SH算法
ipvsadm -E -t 10.0.0.13:80 -s sh

测试
curl 10.0.0.13

防火墙标识实践
定制防火墙
iptables -t mangle -A PREROUTING -d 10.0.0.13 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
iptables -t mangle -vnL

定制规则
ipvsadm -C
ipvsadm -A -f 10
ipvsadm -a -f 10 -r 192.168.8.14 -m
ipvsadm -a -f 10 -r 192.168.8.15 -m
ipvsadm -a -f 10 -r 192.168.8.16 -m

测试
curl 10.0.0.13
curl https://10.0.0.13 -k

DR实践
带不动那么多台看课件和视频模拟练吧