1.集群和分布式简介
1.1.系统性能扩展方式
Scale UP :向上扩展,增强,有极限
Scale Out:向外扩展,增加设备,调度分配问题,cluster
1.2.集群
Cluster: 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统
Cluster常见的三种类型:
LB: LoadBalancing (负载均衡)由多个主机组成,每个主机只承担一部分访问 解决访问的压力问题
HA: High Availiablity(高可用)解决故障问题 SPOF(single Point Of failure)
MTBF : Mean Time Between Failure 平均无故障时间,正常时间
MTTR : Mean Time To Restoration( repair)平均恢复前时间,故障时间 故障恢复时间
A= MTBF /( MTBF+MTTR) (0,1) :99%, 99.5%, 99.9%, 99.99%, 99.999%值越小故障时间越长
SLA:Service level agreement (服务等级协议)是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一 些列的惩罚措施,而运维最主要的目标就是达成这种服务水平。停机时间又分为两种, 一种是计划内停机时间, 一种是计划外停机时间,而运维则主要关注计划外停机时间
HPC: High-performance computing (高性能计算,国家战略资源)
1.3分布式
a+b+c+d 主机A计算a+b 主机B计算c+d 主机C计算主机A+主机B
分布式存储:Ceph ,GlusterFs , FastDFS , MogileFs
分布式计算:hadoop ,Spark
分布式常见应用
分布式应用-服务按照功能拆分,使用微服务
分布式静态资源--静态资源放在不同的存储集群上
分布式数据和存储--使用key-value缓存系统
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.4集群和分布式
集群:一个业务系统部署在多台服务器上,集群中,每台服务器实现的功能没有差别
分布式: 将一个业务拆分成多个子业务,或者是不同的业务部署在多台服务器上。在分布式中,每台服务器实现的功能是有差别的,分布式每台服务器的功能加起来,才是完整的业务
分布式是缩短单个任务的执行时间来提升效率,而集群则是通过提高单位时间内执行的任务数来提升效率
2.LVS运行原理
2.1简介
LVS:Linux Virtual Server,Linux 虚拟服务器,是一个基于 Linux 内核的高性能负载均衡器,由章文嵩博士主导开发,主要用于在集群环境中实现对多台服务器的流量分发,提高服务的可用性和扩展性。
2.2lvs集群结构
工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS
2.3lvs概念
VS:Virtual Server
RS: Real Server
CIP :Client IP
VIP: Virtual serve IP VS外网的IP
DIP: Director IP VS内网的IP
RIP: Real server IP
访问流程: CIP <--> VIP == DIP <--> RIP
2.4lvs集群的类型
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
2.4.1nat模式
本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为被挑出的RS的RIP和 PORT实现转发
RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
请求报文和响应报文都必须经由Director转发, Director易于成为系统瓶颈
支持端口映射,可修改请求报文的目标PORT
LVS必须是Linux系统, 而RS可以是任意OS系统
传输过程:
客户端向lvs发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(vip)访问目标端口 (9000port)
lvs服务器接收到访问请求做DNAT把请求数据包中的目的地由vip换成RS的rip和相应端口
RS1响应请求,发送响应数据包,包中的响应报文为数据来源(rip1)响应目标(cip)和响应端口 (9000port)
lvs服务器接收到响应数据包,改变包中的数据来源(rip1-->vip),响应目标端口(9000-->80)
lvs服务器将修改过的报文的响应数据包回传给客户端
lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
客户请求到达vip后进入prerouting,在没有ipvs的时候该进入本机INPUT,当ipvs存在后访问请求在通 过prerouting后被ipvs结果并作nat转发
因为ipvs的作用点是在prerouting和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。
2.4.2dr模式
DR: Direct Routing,直接路由,lvs的默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
dr模式数逻辑:
在DR模式中, RS接收到访问请求后不需要回传给VS调度器,直接把回传数据发送给client,所以RS和vs 上都要有vip
传输过程:
客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
lvs调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端 的MAC+VIP+RS1的MAC
RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的 MAC
特点
Director和RS都配置有VIP
确保前端路由器将目标IP为VIP的请求报文发往Director
在前端网关做静态绑定VIP和Director的MAC地址
RS的RIP可以使用私网地址,也可以是公网地址; RIP与DIP在同一IP网络;
RIP的网关不能指向DIP,以确保响应报文不会经由Director
RS和Director要在同一个物理网络
请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
不支持端口映射(端口不能修改)
2.4.3tun模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)
传输过程:
客户端发送请求数据包,包内有源IP+vip+dport
到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client
特点:
DIP, VIP, RIP都应该是公网地址
RS的网关一般不能指向DIP
请求报文要经由Director,但响应不能经由Director
不支持端口映射
RS的OS须支持隧道功能
2.4.4fullnet模式
ullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
特点:
VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
请求和响应报文都经由Director
支持端口映射
2.5lvs调度算法
2.5.1lvs调度算法类型
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:根据每台RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
2.5.2lvs静态调度算法
RR:roundrobin 轮询 RS轮流被调度
WRR :Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH :Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次选择的RS,从而实现会话绑定
DH: Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS
2.5.3lvs动态调度算法
主要根据RS当前的负载状态及调度算法进行调度,Overhead=value较小的RS会被调度
LC: least connections(最少链接发)
适用于长连接应用Overhead(负载值)=activeconns(活动链接数)x 256+inactiveconns(非活动链接数)
WLC:Weighted LC(权重最少链接)
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
SED :Shortest Expection Delay,/初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1 , node2的权重为10,经过运算前几次的调度都会被node2承接
NQ: Never Queue,第一轮均匀分配,后续SED
LBLC: Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
LBLCR: LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
3.部署命令介绍
3.1lvs软件相关信息
程序包: ipvsadm
Unit File: ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
配置文件: /etc/sysconfig/ipvsadm-config
ipvs调度规则文件: /etc/sysconfig/ipvsadm
3.2ipvsadm命令
核心功能:
集群服务管理:增、删、改
集群服务的RS管理:增、删、改 查看
参数
命令 | 解释 |
---|---|
-A|E | 增加|修改 |
-D | 删除 |
-R | 重载 |
-S | 保存 |
-t | tcp服务 |
-u | udp服务 |
-s | 指定调度算法 |
-p | 设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver |
-f | firewall mask 火墙标记 |
-a|e | 添加|更改realserver |
-t|u | tcp|udp协议 |
-g | 直连路由模式 |
-i | ipip隧道模式 |
-m | nat模式 |
-w | 设定权重 |
-Z | 清空计数器 |
-C|-L | 清空|查看lvs策略 |
--rate | 输出速率信息 |
pvs规则:/proc/net/ip_vs
ipvs连接:/proc/net/ip_vs_conn
4.LVS实战
4.1部署NAT模式集群
克隆四台rhel9.4
client:nat模式
lvs:双网卡 nat连接外网,仅主机网卡与web服务器相连
web服务器采用仅主机网卡与lvs相连
web服务器网关为192.168.0.100
实验环境
主机名 IP VIP 角色 client nat:172.25.254.111 null 测试机 lvs nat:172.25.254.100 仅主机:192.168.0.100 调度器(vs) RS1 仅主机:192.168.0.20 null 真实服务器(RS) RS2 仅主机:192.168.0.20 null 真实服务器(RS) 配置命令
在RS1,RS2中安装并启用httpd服务
RS1: [root@RS1 ~]#dnf install httpd -y [root@RS1 ~]#firewall-cmd --permanent --add-service=http [root@RS1 ~]#firewall-cmd --permanent --add-service=https [root@RS1 ~]#echo RS1 - 192.168.0.10 > /var/www/html/index.html [root@RS1 ~]#systemctl enable --now httpd [root@RS1 ~]#vim /etc/NetworkManager/system-connections/eth0.nmconnection address1=192.168.0.10/24,192.168.0.100 [root@RS1 ~]#nmcli connection reload [root@RS1 ~]#nmcli connection up eth0 RS2: [root@RS2 ~]dnf install httpd -y [root@RS2 ~]#systemctl disable --now firewalld [root@RS2 ~]#echo RS2 - 192.168.0.20 > /var/www/html/index.html [root@RS2 ~]#systemctl enable --now httpd [root@RS2 ~]#vim /etc/NetworkManager/system-connections/eth0.nmconnection address1=192.168.0.20/24,192.168.0.100 [root@RS2 ~]#nmcli connection reload [root@RS2 ~]#nmcli connection up eth0
在lvs中测试
在lvs中启用内核路由功能
[root@LVS ~]# echo net.ipv4.ip_forward = 1> /etc/sysctl.d/ip_forward.conf
在lvs中安装ipvsadm
[root@lvs ~]# yum install ipvsadm -y #安装 [root@lvs ~]# systemctl enable --now ipvsadm #启用ipvsadm服务 Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
在lvs中添加调度策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr #添加虚拟服务172.25.254.100:80 使用轮询 [root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m #添加RS1 [root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m #添加RS2 [root@LVS ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.254.100:80 rr -> 192.168.0.10:80 Masq 1 0 0 -> 192.168.0.20:80 Masq 1 0 0
测试
[root@client ~]# for i in {1..10}; do curl 172.25.254.100;done RS2 - 192.168.0.20 RS1 - 192.168.0.10 RS2 - 192.168.0.20 RS1 - 192.168.0.10 RS2 - 192.168.0.20 RS1 - 192.168.0.10 RS2 - 192.168.0.20 RS1 - 192.168.0.10 RS2 - 192.168.0.20 RS1 - 192.168.0.10 [root@client ~]#
4.2部署DR模式集群
实验环境
主机名 ip vip 角色 client nat:172.25.254.111 null 测试机 router nat:172.25.254.100,仅主机:192.168.0.100 null 路由器 DR-LVS 仅主机192.168.0.200,GW:192.168.0.100 192.168.0.210 调度器 RS1 仅主机192.168.0.10,GW:192.168.0.100 lo:192.168.0.210 真实服务器(RS) RS2 仅主机192.168.0.20,GW:192.168.0.100 lo:192.168.0.210 真实服务器(RS) 配置实验环境
client:
router
DR-LVS
RS1
RS2
测试:确保每台主机都可以互相通信
解决vip响应问题
#在RS1和RS2中解决响应问题: RS1: [root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf [root@RS1 ~]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf [root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf [root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf [root@RS1 ~]# sysctl -p net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 RS2: [root@RS2 ~]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf [root@RS2 ~]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf [root@RS2 ~]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf [root@RS2 ~]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf [root@RS2 ~]# sysctl -p net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2
配置详情
配置内容如下:
#在lvs中配置策略 [root@DR-LVS ~]# ipvsadm -A -t 192.168.0.210:80 -s rr [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.10:80 -g [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.20:80 -g [root@DR-LVS ~]# 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.0.210:80 rr -> 192.168.0.10:80 Route 1 0 0 -> 192.168.0.20:80 Route 1 0 0
测试:
4.3防火墙标签解决轮询错误
轮询规则中可能会遇到的错误
在RS中同时开放80和443端口时,默认控制是分开轮询的,这样就出现了一个轮询错乱的问题#在RS1,RS2中开启443端口 #RS1 [root@rs1 ~]# dnf install mod_ssl -y [root@rs1 ~]# systemctl restart httpd #RS2 [root@rs2 ~]# dnf install mod_ssl -y [root@rs2 ~]# systemctl restart httpd #在lvs中设置两组调度 [root@DR-LVS ~]# ipvsadm -A -t 192.168.0.210:443 -s rr [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:443 -r 192.168.0.10:443 -g [root@DR-LVS ~]# ipvsadm -a -t 192.168.0.210:443 -r 192.168.0.20:443 -g [root@DR-LVS ~]# 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.0.210:80 rr -> 192.168.0.10:80 Route 1 0 1 -> 192.168.0.20:80 Route 1 0 1 TCP 192.168.0.210:443 rr -> 192.168.0.10:443 Route 1 0 0 -> 192.168.0.20:443 Route 1 0 0 #测试问题 [root@router ~]# curl -k http://192.168.0.210;curl -k https://192.168.0.210 RS2 - 192.168.0.20 RS2 - 192.168.0.20
防火墙标记解决轮询调度问题
示例:#在lvs调度器中设定端口标签,使80和443为一个整体 [root@DR-LVS ~]# iptables -t mangle -A PREROUTING -d 192.168.0.210 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666 [root@DR-LVS ~]# ipvsadm -A -f 6666 -s rr [root@DR-LVS ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g [root@DR-LVS ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g [root@DR-LVS ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 6666 rr -> 192.168.0.10:0 Route 1 0 0 -> 192.168.0.20:0 Route 1 0 0
测试:
[root@router ~]# curl -k http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10
[root@router ~]# curl -k http://192.168.0.210;curl -k https://192.168.0.210
RS2 - 192.168.0.20
RS1 - 192.168.0.10