目录
2.2负载均衡群集(Load Balance Cluster)
2.3高可用群集(High Availability Cluster)
2.4高性能运算群集(High Performance Computer Cluster)
3.1.2.2应用层(专用)——针对特定协议(常称为Proxy Server)
LVS集群(Linux Vritual Server)
- 集群概念
- lvs模型
- lvs调度算法
- lvs实现
- lvs高可用性,负载均衡
一、LVS定义
1.企业群集应用概述
1.1群集的含义
- Cluster,集群、群集,为解决某个特定问题将多台计算机组合起来形成的单个系统
- 由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名和IP地址),相当于一台大型计算机。
1.1.1Cluster分三种类型
- LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
- HA: High Availiablity,高可用,避免 SPOF(single Point Of failure)
- HPC: High-performance computing,高性能
1.1.2扩展——SLA
SLA 服务等级协议(简称:SLA,全称:service level agreement)。是在一定开销下为保障服
务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服
务质量的主要因素。在常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这
种水平的时候,就会有一些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。
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%;1年 = 365天 = 8760小时
90 = (1-90%)*365=36.5天
99 = 8760 * 1% = 87.6小时
99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小时
99.99 = 8760 * 0.0001 = 0.876小时 = 0.876 * 60 = 52.6分钟
99.999 = 8760 * 0.00001 = 0.0876小时 = 0.0876 * 60 = 5.26分钟
99.9999= (1-99.9999%)*365*24*60*60=31秒
停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间。
1.2问题
互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器已经无法满足负载均衡及高可用的要求。
1.3解决方法
- 使用价格昂贵的小型机、大型机
- 使用多台相对廉价的普通服务器构建服务群集
通过整合多台服务器,使用LVS来达到服务器构建服务群集,并以同一个IP地址对外提供相同的服务;在企业中常用的一种群集技术——LVS(Linux Virtual Server,Linux虚拟服务器)
1.4集群和分布式
系统性能扩展方式
- Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
- Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,Cluster
水平扩展 增加服务器的数量 垂直扩展 提升单台服务器的性能;
横向扩展就是群集;
垂直扩展不再提及 随着计算机性能的增长,其价格会成倍增长。
1.4.1分布式系统
分布式存储:Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark
1.4.2分布式常见应用
- 分布式应用-服务按照功能拆分,使用微服务(单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值服务)
- 分布式静态资源--静态资源放在不同的存储集群上
- 分布式数据和存储--使用key-value缓存系统
- 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
1.5集群和分布式的对比
- 集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。
- 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
1.6集群设计原则
- 可扩展性—集群的横向扩展能力
- 可用性—无故障时间 (SLA service level agreement)
- 性能—访问响应时间
- 容量—单位时间内的最大并发吞吐量(C10K 并发问题)
1.7集群设计实现
1.7.1基础设施层面
- 提升硬件资源性能—从入口防火墙到后端 web server 均使用更高性能的硬件资源
- 多域名—DNS 轮询A记录解析
- 多入口—将A记录解析到多个公网IP入口
- 多机房—同城+异地容灾
- CDN(Content Delivery Network)—基于GSLB(Global Server Load Balance)实现全局负载均衡,如:DNS
1.7.2业务层面
- 分层:安全层、负载层、静态层、动态层、(缓存层、存储层)持久化与非持久化
- 分割:基于功能分割大业务为小服务
- 分布式:对于特殊场景的业务,使用分布式计算
- 微服务
2.企业群集分类
2.1根据群集所针对的目标差异
- 负载均衡群集
- 高可用群集
- 高性能运算群集
2.2负载均衡群集(Load Balance Cluster)
- 提高应用系统的响应能力、尽可能处理更多的访问请求、减少延迟为目标,获得高并发、高负载(LB)的整体性能
- LB的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载
2.3高可用群集(High Availability Cluster)
- 提供应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果
- HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线;主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点。例如,“故障切换”“双机热备”等
2.4高性能运算群集(High Performance Computer Cluster)
- 以提高应用系统的CPU运算速度,扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能(HPC)能力
- 高性能依赖于“分布式运算”、“并行运算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力。例如,”云计算“”网络计算“等
3.负载均衡群集架构
第一层,负载调度器(Load Balancer或Director)
访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP地址,也称为群集IP地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后能够平滑地替换至备用调度器,确保高可用性。
第二层,服务器池(Server Pool)
群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机的请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
第三层,共享存储(Share Storage)
为服务器池中所有节点提供稳定、一致的文件存取服务,确保整个群集的统一性;共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。
3.1LB Cluster负载均衡集群
3.1.1按实现方式划分
3.1.1.1硬件
- F5 Big-IP(F5服务器负载均衡模块)
- Citrix Netscaler
- A10 A10
3.1.1.2软件
- lvs:Linux Virtual Server,阿里四层 SLB (Server Load Balance)使用
- nginx:支持七层调度,阿里七层SLB使用 Tengine
- haproxy:支持七层调度
- ats:Apache Traffic Server,yahoo捐助给apache
- perlbal:Perl 编写
- pound
3.1.2基于工作的协议层次划分
3.1.2.1传输层(通用)——DNAT和DPORT
- LVS
- nginx:stream
- haproxy:mode tcp
以上三个软件都可以使用四层
SNAT:内网用户可以通过SNAT技术科学上网到达外网;
DNAT:把内网服务共享给公网(公网用户可以访问内网)
3.1.2.2应用层(专用)——针对特定协议(常称为Proxy Server)
- http:nginx, httpd, haproxy(mode http)
- fastcgi:nginx, httpd
- mysql:mysql-proxy, mycat
3.1.3负载均衡的会话保持
- session sticky:同一用户调度固定服务器 Source IP:LVS sh算法(对某一特定服务而言) Cookie
- session replication:每台服务器拥有全部session(复制) session multicast cluster
- session server:专门的session服务器(server) Memcached,Redis
3.2 HA 高可用集群实现
keepalived:vrrp协议
Ais:应用接口规范
- heartbeat
- cman+rgmanager(RHCS)
- coresync_pacemaker
二、LVS 介绍
1.LVS简介
LVS:Linux Virtual Server,负载调度器,内核集成,针对Linux内核开发的负载均衡解决方案;1998年5月,由我国章文嵩(花名正明)博士创建, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现;LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决方法。
LVS 官网:http://www.linuxvirtualserver.org/
阿里SLB和LVS:https://yq.aliyun.com/articles/1803 https://github.com/alibaba/LVS
整个SLB系统由三部分构成:四层负载均衡、七层负载均衡 和 控制系统
- 四层负载均衡,采用开源软件LVS(Linux Virtual Server),并根据云计算需求对其进行定制化;该技术已经在阿里巴巴内部业务全面上线应用2年多
- 七层负载均衡,采用开源软件Tengine,该技术已经在阿里巴巴内部业务全面上线应用3年多
- 控制系统,用于配置和监控负载均衡系统
2.LVS工作原理
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”
[root@localhost ~]#grep -i -C 10 ipvs /boot/config-3.10.0-693.el7.x86_64
#可以看到编译操作系统时开启或者关闭哪些功能
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
--
CONFIG_IP_SET_HASH_NET=m
CONFIG_IP_SET_HASH_NETPORT=m
CONFIG_IP_SET_HASH_NETIFACE=m
CONFIG_IP_SET_LIST_SET=m
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
#
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m
#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
3.LVS功能及组织架构
负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性。
3.1应用于高访问量的业务
如果您的应用访问量很高,可以通过配置监听规则将流量分发到不同的云服务器 ECS(Elastic Compute Service 弹性计算服务)实例上。此外,可以使用会话保持功能将同一客户端的请求转发到同一台后端ECS
3.2扩展应用程序
可以根据业务发展的需要,随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和App服务器。
3.3消除单点故障
可以在负载均衡实例下添加多台ECS实例。当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的ECS实例,将请求分发给正常运行的ECS实例,保证应用系统仍能正常工作
3.4同城容灾(多可用区容灾)
为了提供更加稳定可靠的负载均衡服务,阿里云负载均衡已在各地域部署了多可用区以实现同地域容灾。当主可用区出现机房故障或不可用时,负载均衡仍然有能力在非常短的时间内(如:大约30s中断)切换到另外一个备可用区恢复服务能力;当主可用区恢复时,负载均衡同样会自动切换到主可用区提供服务。使用负载均衡时,您可以将负载均衡实例部署在支持多可用区的地域以实现同城容灾。此外,建议您结合自身的应用需要,综合考虑后端服务器的部署。如果您的每个可用区均至少添加了一台ECS实例,那么此种部署模式下的负载均衡服务的效率是最高的。
4.LVS集群类型中术语
- VS:Virtual Server,Director Server(DS), Dispatcher(调度器),Load Balancer(lvs服务器)
- RS:Real Server(lvs), upstream server(nginx), backend server(haproxy)(真实服务器)
- CIP:Client IP(客户机IP)
- VIP:Virtual serve IP VS外网的IP
- DIP:Director IP VS内网的IP
- RIP:Real server IP (真实IP)
VS 代理服务器;RS 真实服务器;VIP 外网IP代理服务器;DIP 内网IP代理服务器;RIP 真实服务器IP
访问流程 CIP <--> VIP == DIP <--> RIP
5.LVS工作模式和相关命令
5.1LVS集群的工作模式
- lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr:操纵封装新的MAC地址(直接路由)
- lvs-tun:隧道模式
- lvs-fullnat:修改请求报文的源和目标IP
5.1.1LVS的NAT模式
完整请求过程
1.客户端发起请求报文,源IP为客户端IP地址(CIP),目的地址为VIP(代理服务器的外网地址);
2.当数据包到达我们的代理服务器,源IP不变,需要修改目的IP及端口号,此时源IP为客户端IP地址(CIP),目的地址为RIP(后端真实服务器IP);
3.真实服务器收到报文后构建响应报文,此时源IP修改为真实服务器自己的IP(VIP是内网地址),目的地址为CIP(外网客户端地址);
4.此时再发给代理服务器,源IP为代理服务器IP地址(VIP),目的地址为CIP(外网客户端地址)
6.LVS调度算法
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态,调度算法分为静态和动态
静态不管后端真实服务器的状态 根据自身算法进行调度;动态会根据后端服务器的状态进行调度;
动态服务器根据一个参考值 确定服务器是否忙 这个值越小 代表服务器比较清闲 代表优先级越高 就会优先调度
6.1静态调度算法
- RR(Roundrobin) 轮询 较为常用
- WRR(Weighted RR )加权轮询 较为常用
- SH(Source Hashing)实现Session Sticky,源IP地址hash,将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH(Destination Hashing)目标地址hash,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存
6.2动态调度算法
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
- LC:least connections 适用于长连接应用,不考虑权重
-
Overhead=activeconns*256+inactiveconns
- 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算法,使用场景:根据负载状态实现正向代理,实现Web Cache等
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
6.3其他调度算法
内核版本 4.15 版本后新增调度算法 FO 和 OVF
- FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法
- OVF(Overflow-Connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器,属于动态算法
一个可用的真实服务器需要通式满足以下条件
- 未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
- 真实服务器当前的活动连接数量小于其权重值
- 其权重值不为零
7.ipvsadm 工具
ipvsadm是实现LVS内核的工具
选项 | 含义 |
---|---|
-A | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc) |
-a | 添加真实服务器(节点服务器) |
-d | 删除某一个节点 |
-t | 指定VIP地址及TCP端口 |
-r | 指定RIP地址及TCP端口 |
-m | 表示使用NAT群集模式 |
-g | 表示使用DR模式 |
-i | 表示使用TUN模式 |
-w | 设置权重(权重为0时表示暂停节点) |
-p | -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
#管理集群中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
选项:
lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
例子:
ipvsadm -A -t 12.0.0.1:80 -s rr
-A 新建代理服务器
-t tcp协议
-s 调度算法
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
三、NAT模式 LVS负载均衡部署
1.搭建实验环境
Centos 7-1作为代理服务器;Centos 7-2和Centos 7-3作为后端真实服务器;Centos7-4作为NFS共享存储服务器
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@node2 ~]#systemctl stop firewalld
[root@node2 ~]#setenforce 0
[root@node3 ~]#systemctl stop firewalld
[root@node3 ~]#setenforce 0
[root@G ~]#systemctl stop firewalld
[root@G ~]#setenforce 0
2.部署NFS共享存储服务器
NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。通过使用 NFS
协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡
群集来说,使用 NFS 协议来共享数据存储是比较常见的做法,NFS 也是 NAS 存储设备必然支
持的一种协议。
NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程
到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS
共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持
[root@G ~]#rpm -qa |grep nfs
nfs-utils-1.3.0-0.48.el7.x86_64
nfs4-acl-tools-0.3.3-15.el7.x86_64
libnfsidmap-0.25-17.el7.x86_64
[root@G ~]#systemctl start nfs
[root@G ~]#systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
Active: active (exited) since 二 2024-03-05 15:39:44 CST; 3s ago
Process: 37332 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 37325 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
Process: 37324 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 37332 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
3月 05 15:39:44 G.D systemd[1]: Starting NFS server and services...
3月 05 15:39:44 G.D systemd[1]: Started NFS server and services.
[root@G ~]#mkdir /benet
[root@G ~]#mkdir /accp
[root@G ~]#vim /etc/exports
[root@G ~]#cat /etc/exports
/benet *
/accp *
[root@G ~]#exportfs -v
[root@G ~]#exportfs -r
exportfs: No options for /benet *: suggest *(sync) to avoid warning
exportfs: No options for /accp *: suggest *(sync) to avoid warning
[root@G ~]#exportfs -v
/benet <world>(ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/accp <world>(ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
[root@G ~]#cd /accp/
[root@G accp]#ls
[root@G accp]#echo accp > index.html
[root@G accp]#cat index.html
accp
[root@G accp]#cd /benet/
[root@G benet]#ls
[root@G benet]#echo benet > index.html
[root@G benet]#cat index.html
benet
3.搭建中间件服务器
[root@node2 ~]#yum install httpd -y
[root@node2 ~]#showmount -e 192.168.241.24
Export list for 192.168.241.24:
/accp *
/benet *
[root@node2 ~]#mount 192.168.241.24:/accp /var/www/html
[root@node2 ~]#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 52403200 3622304 48780896 7% /
devtmpfs 917604 0 917604 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 17412 916112 2% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 5232640 182380 5050260 4% /boot
tmpfs 186708 12 186696 1% /run/user/42
tmpfs 186708 0 186708 0% /run/user/0
192.168.241.24:/accp 52403200 4006912 48396288 8% /var/www/html
[root@node2 ~]#systemctl start httpd
[root@node2 ~]#systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2024-03-05 02:49:04 EST; 8s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 6712 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
├─6712 /usr/sbin/httpd -DFOREGROUND
├─6716 /usr/sbin/httpd -DFOREGROUND
├─6717 /usr/sbin/httpd -DFOREGROUND
├─6718 /usr/sbin/httpd -DFOREGROUND
├─6719 /usr/sbin/httpd -DFOREGROUND
└─6720 /usr/sbin/httpd -DFOREGROUND
Mar 05 02:48:09 node2.localdomain systemd[1]: Starting The Apache HTTP Se....
Mar 05 02:48:29 node2.localdomain httpd[6712]: AH00558: httpd: Could not r...
Mar 05 02:49:04 node2.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@node3 ~]#yum install httpd -y
[root@node3 ~]#systemctl start httpd
[root@node3 ~]#systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 三 2024-03-06 00:03:52 CST; 8s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 37651 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
├─37651 /usr/sbin/httpd -DFOREGROUND
├─37653 /usr/sbin/httpd -DFOREGROUND
├─37654 /usr/sbin/httpd -DFOREGROUND
├─37655 /usr/sbin/httpd -DFOREGROUND
├─37656 /usr/sbin/httpd -DFOREGROUND
└─37657 /usr/sbin/httpd -DFOREGROUND
3月 06 00:03:26 node3.node3 systemd[1]: Starting The Apache HTTP Server...
3月 06 00:03:52 node3.node3 systemd[1]: Started The Apache HTTP Server.
[root@node3 ~]#mount 192.168.241.24:/benet /var/www/html
[root@node3 ~]#df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 52403200 3625648 48777552 7% /
devtmpfs 917604 0 917604 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 9172 924352 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 5232640 182372 5050268 4% /boot
tmpfs 186708 12 186696 1% /run/user/42
tmpfs 186708 0 186708 0% /run/user/0
192.168.241.24:/benet 52403200 4006912 48396288 8% /var/www/html
测试
[root@localhost ~]#curl 192.168.241.22
accp
[root@localhost ~]#curl 192.168.241.23
benet
4.搭建代理服务器配置
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#ls
ifcfg-ens33 ifdown-ppp ifup-ib ifup-Team
ifcfg-lo ifdown-routes ifup-ippp ifup-TeamPort
ifdown ifdown-sit ifup-ipv6 ifup-tunnel
ifdown-bnep ifdown-Team ifup-isdn ifup-wireless
ifdown-eth ifdown-TeamPort ifup-plip init.ipv6-global
ifdown-ib ifdown-tunnel ifup-plusb network-functions
ifdown-ippp ifup ifup-post network-functions-ipv6
ifdown-ipv6 ifup-aliases ifup-ppp
ifdown-isdn ifup-bnep ifup-routes
ifdown-post ifup-eth ifup-sit
[root@localhost network-scripts]#cp ifcfg-ens33 ifcfg-ens36
[root@localhost network-scripts]#vim ifcfg-ens33
[root@localhost network-scripts]#vim ifcfg-ens36
[root@localhost ~]#systemctl restart network
[root@localhost ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:51:4b:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.241.11/24 brd 192.168.241.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::de6f:32c8:5a64:a6b2/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:53:c1:45 brd ff:ff:ff:ff:ff:ff
5: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:51:4b:bf brd ff:ff:ff:ff:ff:ff
inet 12.0.0.1/24 brd 12.0.0.255 scope global ens36
valid_lft forever preferred_lft forever
inet6 fe80::8cb:b13b:40ac:6df1/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.241.11 0.0.0.0 UG 100 0 0 ens33
0.0.0.0 12.0.0.1 0.0.0.0 UG 101 0 0 ens36
12.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 ens36
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.241.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@localhost ~]#sysctl -a|grep 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 ~]#vim /etc/sysctl.conf
[root@localhost ~]#sysctl -p
net.ipv4.ip_forward_use_pmtu = 1
本地yum仓库搭建ipvsadm
[root@localhost ~]#cd /etc/yum.repos.d/
[root@localhost yum.repos.d]#ls
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-Media.repo epel.repo
CentOS-Debuginfo.repo CentOS-Sources.repo epel-testing.repo
[root@localhost yum.repos.d]#mkdir bak
[root@localhost yum.repos.d]#mv *.repo bak/
[root@localhost yum.repos.d]#ls
bak
[root@localhost yum.repos.d]#vim local.repo
[root@localhost yum.repos.d]#cat local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
[root@localhost yum.repos.d]#yum clean all
[root@localhost yum.repos.d]#yum makecache
[root@localhost yum.repos.d]#mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost yum.repos.d]#yum install ipvsadm.x86_64 -y
[root@localhost yum.repos.d]#ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost yum.repos.d]#systemctl start ipvsadm
[root@localhost yum.repos.d]#systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; vendor preset: disabled)
Active: active (exited) since 二 2024-03-05 17:19:22 CST; 5s ago
Process: 10518 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm (code=exited, status=0/SUCCESS)
Main PID: 10518 (code=exited, status=0/SUCCESS)
3月 05 17:19:22 localhost.localdomain systemd[1]: Starting Initialise the...
3月 05 17:19:22 localhost.localdomain systemd[1]: Started Initialise the ...
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost yum.repos.d]#ipvsadm -C
[root@localhost yum.repos.d]#ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@localhost yum.repos.d]#ipvsadm -A -t 12.0.0.1:80 -s rr
[root@localhost yum.repos.d]#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
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.1:80 -r 192.168.241.22:80 -m
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.1:80 -r 192.168.241.23:80 -m
[root@localhost yum.repos.d]#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.241.22:80 Masq 1 0 0
-> 192.168.241.23:80 Masq 1 0 0
[root@node2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@node2 ~]#systemctl restart network
[root@node2 ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.241.11 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.241.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@node3 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
[root@node3 ~]#systemctl restart network
[root@node3 ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.241.11 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.241.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
5.测试
6.补充
[root@localhost ~]#cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 0C000001:0050 rr
-> C0A8F117:0050 Masq 1 0 0
-> C0A8F116:0050 Masq 1 0 0