Linux云计算 |【第二阶段】CLUSTER-DAY1

news2025/1/8 5:29:23

主要内容:

集群概念、LVS概述、LVS-NAT集群、LVS-DR集群

一、集群概念

集群(Cluster)是指将多台计算机(节点)通过网络连接在一起,形成一个统一的计算资源池,共同完成一项或多项任务的系统。集群系统通过分布式计算和并行处理技术,提高了计算能力、可用性、可靠性和可扩展性。

1)集群的主要类型

  1. 计算集群(Compute Cluster)
    计算集群主要用于高性能计算(HPC),通过将大量计算任务分配到多个节点上并行处理,以加速复杂计算任务的完成。计算集群通常用于科学计算、工程模拟、数据分析等领域。

  2. 负载均衡集群(Load Balancing Cluster)
    负载均衡集群通过将客户端请求分发到多个节点上,以平衡各个节点的负载,提高系统的整体性能和可用性。负载均衡集群常用于Web服务器、应用服务器等场景。

  3. 高可用性集群(High Availability Cluster)
    高可用性集群通过在多个节点上运行相同的应用或服务,并实时监控节点的健康状态,一旦某个节点发生故障,立即切换到其他正常节点,以确保服务的持续可用性。高可用性集群常用于数据库、文件系统、关键业务应用等场景。

  4. 存储集群(Storage Cluster)
    存储集群通过将多个存储设备(如硬盘、SSD)组合在一起,形成一个统一的存储资源池,提供高性能、高可用性的存储服务。存储集群常用于分布式文件系统、对象存储、数据备份等场景。

2)集群的关键技术

  • 分布式计算:将一个大的计算任务分解成多个小的子任务,分配到多个节点上并行处理。
  • 并行处理:多个节点同时处理不同的任务或同一任务的不同部分,以提高计算效率。
  • 负载均衡:将工作负载均匀分配到各个节点上,避免某些节点过载,提高系统整体性能。
  • 故障切换:实时监控节点的健康状态,一旦发现故障,立即切换到其他正常节点,确保服务的持续可用性。
  • 数据一致性:在多个节点之间保持数据的一致性,确保数据在各个节点上的副本是一致的。

3)集群的优势

  • 提高计算能力:通过并行处理和分布式计算,集群可以显著提高计算能力,处理大规模的计算任务。
  • 提高可用性:通过故障切换和冗余设计,集群可以提高系统的可用性,确保服务的持续运行。
  • 提高可靠性:通过数据备份和冗余设计,集群可以提高数据的可靠性,避免数据丢失。
  • 提高可扩展性:集群可以根据需求灵活扩展节点,以满足不断增长的计算和存储需求。
  • 较低成本:相对百万美元级别的超级计算机,价格便宜;

4)集群的应用场景

  • 科学计算:如天气预报、基因测序、物理模拟等。
  • 大数据分析:如数据挖掘、机器学习、人工智能等。
  • 云计算:如虚拟化、容器化、分布式存储等。
  • 企业应用:如数据库、文件系统、关键业务应用等。

二、LVS概述

LVS(Linux Virtual Server)是一个用于构建高性能、高可用性网络服务的负载均衡软件项目。它最初由章文嵩博士在1998年创建,该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案并在Linux内核中得到了广泛应用。LVS主要用于将客户端的请求分发到多个服务器上,可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务器;最终目标是利用Linux操作系统和LVS集群软件实现一个高可用、高性能、低成本的服务器应用集群。

LVS集群组成:

  • 前段:负载均衡层,由一台或多台负载调度器构成;
  • 中间:服务器群组层,由一组实际运行应用服务的服务器组成;
  • 底端:数据共享存储层,提供共享存储空间的存储区域;

LVS术语:

- Directory Server:调度服务器(将负载分发到Real Server的服务器)

- Real Server:真实服务器(真正提供应用服务的服务器)

- VIP:虚拟IP地址(公布给用户访问的虚拟IP地址)

- DIP:调度器连接后端节点服务器的IP地址

- RIP:真实IP地址(集群节点上使用的IP地址)

- CIP:客户端地址

LVS有三种主要的工作模式:

  1. NAT(Network Address Translation)
    NAT模式(m),通过修改数据包的IP地址和端口号,将客户端的请求分发到后端服务器上。后端服务器处理完请求后,将响应数据包发送回LVS,LVS再将数据包的IP地址和端口号修改回客户端的地址和端口号,最后发送给客户端。缺点:大并发访问时,调度器的性能成为瓶颈;

  2. TUN(Tunneling)
    TUN模式(g),通过在LVS和后端服务器之间建立隧道,将客户端的请求封装在隧道中发送给后端服务器。后端服务器处理完请求后,直接将响应数据包发送给客户端,不需要经过LVS。

  3. DR(Direct Routing)
    DR模式(i),通过修改数据包的MAC地址,将客户端的请求分发到后端服务器上。后端服务器处理完请求后,直接将响应数据包发送给客户端,不需要经过LVS。

负载均衡调度算法(10种):

  • 轮询(Round Robin)
  • 加权轮询(Weighted Round Robin)
  • 最少连接(Least Connections)
  • 加权最少连接(Weighted Least Connections)
  • 源地址散列(Source Hashing)
  • 目标地址散列(Destination Hashing)
  • 基于局部性的最少链接
  • 带复制的基于局部性最少链接
  • 最短的期望的延迟
  • 最少队列调度

LVS的应用场景:

  1. Web服务器集群:通过LVS将客户端的HTTP请求分发到多个Web服务器上,提高网站的性能和可用性。
  2. 应用服务器集群:通过LVS将客户端的应用请求分发到多个应用服务器上,提高应用的性能和可用性。
  3. 数据库服务器集群:通过LVS将客户端的数据库请求分发到多个数据库服务器上,提高数据库的性能和可用性。

1、ipvsadm

ipvsadm 是 Linux 虚拟服务器(LVS)的管理工具,用于配置和管理 IP 虚拟服务器(IPVS)规则。IPVS 是 Linux 内核中的一个模块,负责实现负载均衡功能,而 ipvsadm 则是用户空间的一个命令行工具,用于与 IPVS 模块进行交互,从而创建、修改和删除负载均衡规则。

软件包:ipvsadm(关于ipvsadm的用法可以参考man ipvsadm资料)

命令选项

含义

ipvsadm -A

(add) 添加虚拟服务器

ipvsadm -E

(edit) 修改虚拟服务器

ipvsadm -D

(delete) 删除虚拟服务器

ipvsadm -C

(clear) 清空所有

ipvsadm -a

(add) 添加真实服务器

ipvsadm -e

(edit) 修改真实服务器

ipvsadm -d

(delete) 删除真实服务器

ipvsadm -L [n]

(list) (number) 查看LVS规则表

-s [ rr | wrr | lc | wlc | sh | dh...]

(scheduler) 指定集群负载调度算法

-t -u

设置集群地址(VIP,Virtual IP)

-r

指定真实服务器(Real Server)的地址

-m | -g | -i    (不加默认为DR模式)

LVS工作模式:NAT、DR、TUN

-w    (不加默认权重为1)

为节点服务器设置权重,默认为1

语法案例:

ipvsadm -A -t|u 192.168.4.5:80 -s [算法]

添加虚拟服务器,协议为TCP(-t)/UDP(-u)

ipvsadm -E -t|u 192.168.4.5:80 -s [算法]

修改虚拟服务器,协议为TCP(-t)/UDP(-u)

ipvsadm -D -t|u 192.168.4.5:80

删除虚拟服务器

ipvsadm -C

清空所有

Ipvsadm -a -t|u 192.168.4.5:80 -r 192.168.2.100 [-g|-i|-m]

在虚拟服务器集群,添加真实服务器

Ipvsadm -e -t|u 192.168.4.5:80 -r 192.168.2.100 [-g|-i|-m]

在虚拟服务器集群,修改真实服务器

Ipvsadm -d -t|u 192.168.4.5:80 -r 192.168.2.100

在虚拟服务器集群,删除真实服务器

ipvsadm -Ln查看当前配置

案例1:使用命令增、删、改LVS集群规则

1)创建LVS虚拟集群服务器(算法为加权轮询:wrr)

[root@proxy ~]# yum -y install ipvsadm     //安装ipvsadm软件工具
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
[root@proxy ~]# 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.4.5:80 wrr

2)为集群添加若干real server真实服务器

[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -m -w 2
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.201 -m -w 3
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.202 -m -w 4
[root@proxy ~]# ipvsadm -Ln
...
TCP  192.168.4.5:80 wrr
  -> 192.168.2.100:80             Route   1      0          0         
  -> 192.168.2.200:80             Masq    2      0          0         
  -> 192.168.2.201:80             Masq    3      0          0         
  -> 192.168.2.202:80             Masq    4      0          0   

集群规则为虚拟服务器增加真实服务器时,不加模式默认为DR模式;不设置权重默认为1;

3)修改集群服务器设置,修改调度器算法(将加权轮询wrr 修改为轮询rr)

[root@proxy ~]# ipvsadm -E -t 192.168.4.5:80 -s rr
[root@proxy ~]# ipvsadm -Ln
TCP  192.168.4.5:80 rr
...

4)修改read server工作模式(使用-g选项改为DR模式;-i选项改为隧道模式)

[root@proxy ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.202 -g
[root@proxy ~]# ipvsadm -Ln
TCP  192.168.4.5:80 rr
  -> 192.168.2.100:80             Route   1      0          0         
  -> 192.168.2.200:80             Masq    2      0          0         
  -> 192.168.2.201:80             Masq    3      0          0         
  -> 192.168.2.202:80             Route   1      0          0   
[root@proxy ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.201 -i
[root@proxy ~]# ipvsadm -Ln
TCP  192.168.4.5:80 rr
  -> 192.168.2.100:80             Route   1      0          0         
  -> 192.168.2.200:80             Masq    2      0          0         
  -> 192.168.2.201:80             Tunnel  1      0          0         
  -> 192.168.2.202:80             Route   1      0          0   

5)创建另一个集群(算法为最少连接算法lc;使用-m选项改为NAT模式)

[root@proxy ~]# ipvsadm -A -t 192.168.4.5:3306 -s lc
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:3306 -r 192.168.2.100 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:3306 -r 192.168.2.200 -m -w 2
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
...
TCP  192.168.4.5:80 rr
  -> 192.168.2.100:80             Route   1      0          0         
  -> 192.168.2.200:80             Masq    2      0          0         
  -> 192.168.2.201:80             Tunnel  1      0          0         
  -> 192.168.2.202:80             Route   1      0          0         
TCP  192.168.4.5:3306 lc
  -> 192.168.2.100:3306           Masq    1      0          0         
  -> 192.168.2.200:3306           Masq    2      0          0    

集群规则为虚拟服务器集群增加真实服务器时,不加权重,默认权重为1

6)清空所有规则

[root@proxy ~]# ipvsadm -C
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

7)永久保存所有规则

[root@proxy ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm

注意:永久规则需要确保ipvsadm服务为开机自启服务(# systemctl enable ipvsadm


案例2:部署LVS-NAT集群

案例要求:使用LVS实现NAT模式的集群调度服务器,为用户提供Web服务:

  • 1)LVS调度器公网IP地址为192.168.4.5(VIP)(实验private1虚拟网络)
  • 2)LVS调度器内网IP地址为192.168.2.5(DIP)(实验private2虚拟网络)
  • 3)真实Web服务器地址分别为192.168.2.100、192.168.2.200(RIP)
  • 4)将LVS调度服务器的Linux开启软路由功能;
  • 5)使用加权轮询调度算法(wrr),真实服务器权重任意;

注意:web1和web2必须配置网关地址192.168.2.5,跨网段必须配路由;(实验Private2虚拟网络,Yum源为ftp://192.168.2.254)

- CIP:是客户端的IP地址

- VIP:是对客户端提供服务的IP地址

- RIP:是后端服务器的真实IP地址

- DIP:是调度器与后端服务器通信的IP地址

主机配置表:

实验拓扑结构:

工作流程:

第一步,用户通过互联网DNS服务器解析到负载均衡设备(LVS调度器)上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real Server),用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。

第二步,用户将请求发送至192.168.4.5,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.2.100/200),将数据请求包转发给真实服务器,并且在转发之前LVS会基于路由NAT的原理,修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口

第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户。

缺点:LVS NAT实验请求数据包从LVS调度器进,web的相应数据包也从LVS调度器出,那么LVS调度器就需要承载所有数据的压力,会成为整个集群的瓶颈!!

配置网关说明:

英语词汇:source(src)代表源地址,destination(dest或dst)代表目标地址

 LVS采用的是路由器的NAT通讯原理,流程如下:

  • ① 客户端发送请求数据包(src:4.10,dst:4.5)给LVS调度器;
  • ② LVS调度器做NAT地址转换(外网转内网,内网转外网),将数据包修改为(src:4.10,dst:2.100或2.200),期间LVS调度器通过算法把数据包转发给后端真正的web服务器
  • ③ 假设web1收到数据包,准备开始回应客户端数据时(src:2.100,dst:4.10)
  • 备注:调度器访问web1服务器,在web1回复数据时需返回给调度器,由于web1是2.100,调度器是4.10,跨网段默认无法通讯,所以Web1和web2都需要设置默认网关(192.168.2.5)
  • ④ web1回复数据给4.10但跨网段无法与其通讯,所以数据包被交给默认网关;
  • ⑤ LVS调度器(软路由)收到后端web1发送回来的数据,再次做NAT地址转换,数据包被修改为(src:4.5,dst:4.10),LVS调度器把数据包转发给客户端主机;
  • ⑥ 客户端接收网页数据内容

注意:客户端访问的是4.5(VIP),最后是4.5给客户端回复的网页数据,若其他IP,即使同网段也会丢弃;


步骤1:配置基础环境

1)设置Web服务器(web1、web2主机操作)

[root@web1 ~]# firewall-cmd --set-default-zone=trusted  //设置防火墙
[root@web1 ~]# setenforce 0     //设置SELinux
[root@web1 ~]# sed -i  '/SELINUX/s/enforcing/permissive/'  /etc/selinux/config

[root@web2 ~]# firewall-cmd --set-default-zone=trusted
[root@web2 ~]# setenforce 0
[root@web2 ~]# sed -i  '/SELINUX/s/enforcing/permissive/'  /etc/selinux/config

[root@web1 ~]# yum -y install httpd    //安装软件
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd   //启动服务

[root@web2 ~]# yum -y install httpd    //安装软件
[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd   //启动服务

验证:使用proxy主机测试访问web1和web2

[root@proxy ~]# curl http://192.168.2.100
192.168.2.100
[root@proxy ~]# curl http://192.168.2.200
192.168.2.200

2)配置网关(web1、web2主机操作)

将web1和web2的网关设置为192.168.2.5(若在虚拟机已配网关,可忽略)

[root@web1 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.gateway 192.168.2.5
[root@web1 ~]# nmcli connection up eth1
[root@web1 ~]# ip route show    //查看默认网关,default后面的IP就是默认网关
default via 192.168.2.5 dev eth1 proto static metric 101

[root@web2 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.gateway 192.168.2.5
[root@web2 ~]# nmcli connection up eth1
[root@web2 ~]# ip route show    //查看默认网关,default后面的IP就是默认网关
default via 192.168.2.5 dev eth1 proto static metric 101

步骤2:部署LVS-NAT模式调度器(proxy操作)

1)设置防火墙,SELinux

[root@proxy ~]# firewall-cmd --set-default-zone=trusted
[root@proxy ~]# setenforce  0
[root@proxy ~]# sed -i  '/SELINUX/s/enforcing/permissive/'  /etc/selinux/config

2)确认调度器的路由转发功能(如果已开启,可忽略)

[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward  
0
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward  //开启临时路由转发,立即生效
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@proxy ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf  //修改内核配置文件,设置永久规则,重启生效
...
net.ipv4.ip_forward = 1

3)创建集群服务器

[root@proxy ~]# yum -y install ipvsadm    //安装ipvsadm软件包
[root@proxy ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr  //添加虚拟集群服务器

# -A(add)是创建添加虚拟服务器集群;

# -t(tcp)后面指定集群VIP虚拟服务器的地址和端口,协议是tcp协议(-u为udp);

# -s 后面指定调度算法;

4)添加真实服务器

[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 1 -m

# -a(add)往虚拟服务器集群中添加后端真实服务器IP,指定往-t 192.168.4.5:80这个集群中添加;

# -r(real)后面跟后端真实服务器的IP和端口,这里不写端口,默认是80端口;

# -w(weight)指定服务器的权重,权重越大被访问的次数越多,默认权重为1;

# -m 指定集群工作模式为NAT模式,-g代表DR模式,-i代表TUN模式

5)查看规则列表

[root@proxy ~]# 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.4.5:80 wrr
  -> 192.168.2.100:80             Masq    1      0          0         
  -> 192.168.2.200:80             Masq    1      0          0      

[root@proxy ~]# ipvsadm -L
...
TCP  proxy:http wrr
  -> 192.168.2.100:http           Masq    1      0          0         
  -> 192.168.2.200:http           Masq    1      0          0     

# L是list查看,n是number数字格式显示

验证:客户端client使用curl命令反复测试访问http://192.168.4.5,查看访问的页面是否会轮询到不同的后端真实服务器;

[root@client ~]# curl http://192.168.4.5
192.168.2.200
[root@client ~]# curl http://192.168.4.5
192.168.2.100

添加规则时若写错,可通过# ipvsadm -C 清空规则列表,再重新添加;


常见报错1:连接超时

[root@client ~]# curl http://192.168.4.5
curl: (7) Failed connect to 192.168.4.5:80; 连接超时

问题分析:

  • ① web服务器未配置网关(192.168.2.5)
  • ② 未开启调度器的路由转发功能(ip_forward)

常见报错2:拒绝连接

[root@client ~]# curl http://192.168.4.5
curl: (7) Failed connect to 192.168.4.5:80; 拒绝连接

问题分析:

  • ① 防火墙未设置trusted;
  • ② Web服务器的httpd服务未开启;
  • ③ 未配置虚拟服务器;
  • ④ 未配置虚拟服务器集群的规则(后端真实服务器);

常见报错3:Memory allocation problem,命令输入错误(例如lcss不存在的算法)

[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s lcss
Memory allocation problem

 


案例3:部署LVS-DR集群

案例要求:使用LVS实现DR模式的集群调度服务器,为用户提供Web服务:

  • 1)客户端IP地址为192.168.4.10(CIP)
  • 2)LVS调度器VIP地址为192.168.4.15(VIP)
  • 3)LVS调度器DIP地址为192.168.4.5(DIP)
  • 4)真实Web服务器地址分别为192.168.4.100、192.168.4.200(RIP)
  • 5)使用加权轮询调度算法,权重可以任意

说明:

- CIP:是客户端的IP地址

- VIP:是对客户端提供服务的IP地址,VIP必须配置在虚拟接口(目的是防止地址冲突)

- RIP:是后端服务器的真实IP地址

- DIP:是调度器与后端服务器通信的IP地址

补充:调度器需要两个IP,其中一个对外(Client),一个对内(web)

主机配置表:

实验拓扑结构:

工作原理:

- DR模式也叫直接路由模式,该模式中LVS调度器依然承担数据的入站请求及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端

- DR模式要求调度器与后端服务器必须在同一个局域网内,VIP地址(192.168.4.15)需要在调度器与后端所有的服务器间共享,因为最终的真实服务器给客户端回应数据包时需要设置源IP为VIP地址,目标IP为客户端IP,这样客户端访问的是调度器的VIP地址,回应的源地址也依然是该VIP地址(真实服务器上的VIP),客户端是感觉不到后端服务器存在的。

- 由于多台计算机都设置了同样一个VIP地址,会遇到地址冲突问题,所以在DR模式中要求调度器的VIP地址是对外可见的,客户端需要将请求数据包发送到调度器,而所有的真实服务器的VIP地址必须配置在Non-ARP的网络设备上,该网络设备并不会向外广播自己的MAC及对应的IP地址,真实服务器的VIP对外界是不可见的,但真实服务器却可以接收目标地址VIP的网络请求,并在回应数据包时将源地址设置为该VIP地址。


步骤1:配置网络环境

注意:为了防止地址冲突,必须要将VIP地址配置在网卡的虚拟接口上

1)设置Proxy服务器的VIP(192.168.4.15)和DIP(192.168.4.5已配置)

[root@proxy ~]# cd /etc/sysconfig/network-scripts/    //网卡配置目录
[root@proxy network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@proxy network-scripts]# vim ifcfg-eth0:0    //修改eth0:0虚拟接口配置文件
TYPE=Ethernet     //配置网卡类型(Ethernet以太网卡)
BOOTPROTO=none    //none手动配置IP(dhcp自动配置IP)
NAME=eth0:0   //网卡名称
DEVICE=eth0:0   //设备名称
ONBOOT=yes    //开机时是否自动激活该网卡
IPADDR=192.168.4.15   //网卡IP地址(VIP)
PREFIX=24     //子网掩码

常见问题:RHEL7和Centos7系统中有两个管理网络的服务,有可能冲突

解决方法:关闭NetworkManager服务,重启network服务

[root@proxy network-scripts]# systemctl stop NetworkManager
[root@proxy network-scripts]# systemctl restart network
[root@proxy network-scripts]# ip address show 

2)设置Web1服务器的RIP(192.168.4.100)

[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth0

DR模式要求调度器与后端服务器必须在同一个局域网内

3)设置web1服务器的VIP(192.168.4.15)

  • 注意:VIP地址的子网掩码必须是32(即全255),网络地址和广播地址与IP地址一样;
  • 注意:Lo为虚拟网卡(回环地址127.0.0.1)
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0   //修改lo:0虚拟接口配置文件
DEVICE=lo:0    //设备名称
IPADDR=192.168.4.15    //网卡IP地址(VIP)
NETMASK=255.255.255.255     //子网掩码(主机型IP,无网络位)
NETWORK=192.168.4.15      //网络地址
BROADCAST=192.168.4.15    //广播地址
ONBOOT=yes     //是否激活网卡
NAME=lo:0     //网卡名称

4)修改内核配置说明文件(忽略ARP广播,不向外宣告

防止地址冲突的问题:由于web1服务器同样配置与调度器一样的VIP地址,默认地址冲突;需要在sysctl.conf内核配置说明文件写入四行(真实服务器忽略ARP广播,不会向外广播自己的MAC及对应的IP地址),当客户端访问VIP(192.168.4.15),ARP进行广播,只有调度器会响应,其他主机不做任何响应,从而防止地址冲突的问题;(ARP地址解析协议)

[root@web1 ~]# vim /etc/sysctl.conf    //修改内核配置参数
net.ipv4.conf.all.arp_ignore = 1    //1代表忽略ARP广播,0代表不忽略(所有网卡)
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2   //0代表向外广播,1代表临时广播,2代表不向外宣告
net.ipv4.conf.all.arp_announce = 2

[root@web1 ~]# sysctl -p     //刷新配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2

解释说明:ignore忽略、忽视,announce宣告、广播通知

# ARP广播询问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应(防止进站冲突)

# 本机不会向外宣告自己的lo回环地址是192.168.4.15(防止出站冲突)

5)重启网络服务

常见错误:如果重启网络后未正确配置lo:0,有可能是NetworkManager和network服务有冲突,关闭NetworkManager后重启network即可。(非必须的操作)

[root@web1 ~]# systemctl stop NetworkManager
[root@web1 ~]# systemctl restart network        //重启网络服务
[root@web1 ~]# ip address show           //看到一个网卡下面有两个IP地址

注意:需要先进行内核参数配置修改后再进行服务重启,否则重启后,VIP就已向外宣告

6)设置Web2服务器的RIP(192.168.4.200)

[root@web2 ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.4.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth0

7)设置web2服务器的VIP(192.168.4.15)

[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 ~]# cp ifcfg-lo  ifcfg-lo:0
[root@web2 ~]# vim ifcfg-lo:0
DEVICE=lo:0    //设备名称
IPADDR=192.168.4.15    //IP地址
NETMASK=255.255.255.255     //子网掩码(主机型IP,无网络位)
NETWORK=192.168.4.15      //网络地址
BROADCAST=192.168.4.15    //广播地址
ONBOOT=yes     //是否激活网卡

8)修改内核配置说明文件

[root@web2 ~]# vim /etc/sysctl.conf    //修改内核参数配置
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@web2 ~]# sysctl -p   //刷新配置

9)重启网络服务

[root@web1 ~]# systemctl stop NetworkManager
[root@web1 ~]# systemctl restart network
[root@web2 ~]# ip address show      //会看到一个网卡下面有两个IP地址

步骤2:proxy调度器安装软件并部署LVS-DR模式调度器

1)安装软件

[root@proxy ~]# yum -y install ipvsadm
[root@proxy ~]# rpm -q ipvsadm
ipvsadm-1.27-7.el7.x86_64

2)创建新的集群服务器规则

[root@proxy ~]# ipvsadm -C     //清理之前实验的规则
[root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr   //添加虚拟服务器集群,算法wrr
[root@proxy ~]# 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.4.15:80 wrr

3)添加真实服务器(-g为DR模式,-w设置权重)

[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 1

4)查看规则列表

[root@proxy ~]# 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.4.15:80 wrr
  -> 192.168.4.100:80             Route   1      0          0         
  -> 192.168.4.200:80             Route   1      0          0      

验证:使用curl命令测试http://192.168.4.15,查看页面的轮询后端真实服务器效果

[root@client ~]# curl http://192.168.4.15
192.168.4.200
[root@client ~]# curl http://192.168.4.15
192.168.4.100

注意:实验不可在proxy主机(LVS调度器)访问网页验证,因调度器本机地址就是192.168.4.15,调度器将数据包转内部真实服务器(src:4.15,dct:4.15),真实服务器又做“地址伪装”(地址欺骗),返回数据给调度器(src:4.15,dct:4.15),结果就是地址冲突;

扩展知识:

LVS 功能设计简单,且默认LVS不带健康检查功能,假设ping测试真实服务器正常。但curl访问网址有问题(httpd服务出现问题),该问题真实服务器未在LVS规则中立刻删除,导致客户端访问时,轮询效果为正常服务和拒绝链接报错;

  1. 方法1:结合Keepalived服务 + LVS实现健康检查;
  2. 方法2:手动编写动态检测脚本

案例:手动编写动态检测脚本(参考脚本)

[root@proxy ~]# vim check.sh
#!/bin/bash
VIP=192.168.4.15:80    //定义变量VIP
RIP1=192.168.4.100    //定义web1的RIP
RIP2=192.168.4.200    //定义web2的RIP
while :
do
   for IP in $RIP1 $RIP2
   do
        curl -s http://$IP &>/dev/null    //执行访问网页
        if [ $? -eq 0 ];then    //判断网页执行是否成功状态
            ipvsadm -Ln |grep -q $IP || ipvsadm -a -t $VIP -r $IP
        else
            ipvsadm -Ln |grep -q $IP && ipvsadm -d -t $VIP -r $IP
        fi
   done
sleep 1
done

解释说明:

1.if双分支结构判断,当执行结果为0,说明网页访问成功,执行条件1;

        A)条件1中,ipvsadm -Ln查看规则并过滤$IP,如果规则中有$IP,“条件为真”,不执行加真实服务器的规则语句;(网页可正常访问,规则存在)

        B)条件1中,ipvsadm -Ln查看规则并过滤$IP,如果规则中没有$IP,”条件为假”,执行添加真实服务器的规则语句;(网页可正常访问,规则不存在)

2.if双分支结构判断,当执行结果为非0,执行条件2:

        A)条件2中,ipvsadm -Ln查看规则并过滤$IP,如果规则中有$IP,“条件为真”,执行删除真实服务器的规则语句;(网页不能正常访问,规则存在)

        B)条件2中,ipvsadm -Ln查看规则并过滤$IP,如果规则中有$IP,“条件为假”,不执行任何规则;(网页不能正常访问,规则不存在)

3.for循环+while循环实现重复监测LVS健康功能检查;

思维导图:

小结:

本篇章节为【第二阶段】CLUSTER-DAY1 的学习笔记,这篇笔记可以初步了解到 集群及LVS简介、LVS-NAT集群、LVS-DR集群。除此之外推荐参考相关学习网址:

  • LVS负载均衡(LVS简介、三种工作模式、十种调度算法)-CSDN博客

Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 FTP 将文件上传到 WordPress

作为新手站长,在学习如何管理和维护自己的网站时,掌握一些基本的文件管理技能是非常重要的。通过FTP上传文件到WordPress网站是其中一个必备的技能。本文将详细介绍如何使用FTP将文件上传到WordPress,并分享一些在使用Hostease主机的过程中积…

场外个股期权是什么?20倍奇迹,神仙操作的场外个股期权!

今天带你了解场外个股期权是什么?20倍奇迹,神仙操作的场外个股期权!场外期权交易具有独特的特点和优势,它结合了“彩票”和“保险”的双重属性,为投资者提供了一种灵活且高效的投资工具。 场外个股期权是一种金融合约…

Linux内存不够了?看看如何开启虚拟内存增加内存使用量

1、为什么要使用虚拟内存 当我们没有多余的钱去购买大内存的云服务器时,但是当前服务器里面的软件和程序运行的比较多导致内存不够用了。这个时候可以通过增加虚拟内存来扩大内存容量。但是在启用虚拟内存时,需要仔细考虑系统的实际需求和硬件配置&#…

前端技术回顾系列 14 | 总结 + Vue 3.x 必修课

欢迎关注公众号:CodeFit 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 1. 回顾系列的初衷和目标 在六月初,我开始编写 「前端技术回顾系列 2024」&a…

⭕️【读论文】Learning To Count Everything

2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) 任务名称: visual counting ; few shot counting;crowd counting;cell counting 目录 Abstract 1. Introduction 2. Related Works 3. Few-…

JavaScript (十)——JavaScript 比较 和 逻辑运算符

目录 JavaScript 比较 和 逻辑运算符 比较运算符 如何使用 逻辑运算符 条件运算符 语法 JavaScript 比较 和 逻辑运算符 比较和逻辑运算符用于测试 true 或者 false 比较运算符 比较运算符在逻辑语句中使用,以测定变量或值是否相等。 如何使用 可以在条件语…

Vulnhub靶机:JANGOW_ 1.0.1

目录 前言: 一、安装虚拟机Jangow:1.0.1靶机 二、Web部分 前言: 难度:简单,本文使用VirtualBox打开,下载地址: https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 一、安装虚拟机J…

JMeter接口测试-6.JMeter项目实战

1.项目介绍 知识点: 微信小程序项目及接口文档介绍 1.1 微信小程序项目介绍 微信开发者工具 下载:微信开发者工具下载地址与更新日志 | 微信开放文档 项目代码运行 使用登录扫码,登录开发者工具 登录成功后,选择小程序 点击…

Spring Security 概述,鸟瞰 Spring Security 及其功能

在本文中,我们将从鸟瞰的角度了解 Spring Security 的用途以及它能为我们提供什么。网络上的任何东西都可能是攻击的潜在受害者。不幸的是,在这个即使是最富有、最具创新性的技术公司也会受到黑客攻击的世界里,保护 Web 应用程序并实现授权和…

LLM:并行化训练

llama3.1论文称使用了:张量并行(TP)、流水线并行(PP)、上下文并行(CP)和数据并行(DP)。 并行化可以先粗分为: 1.数据并行 2.模型并行:张量并行&…

多模态多智能体,在实现系统2(深思熟虑)方面的探索

多模态和多智能体,在系统2(深思熟虑)方面的探索 提出背景理性的定义为什么理性定义是四大基本原则,而不是其他数量,又为何是这四个,而不是其他?理性 不等于 推理 通过多模态多智能体系统增强理性…

el-table 表格序号列前端实现递增,切换分页不从头开始

<el-table-column type"index" width"55" label"序号" :index"hIndex"> </el-table-column> 分页 <el-pagination size-change"handleSizeChange" current-change"handleCurrentChange"> <…

【Linux】动态库|静态库|创建使用|动态库加载过程

目录 ​编辑 前言 静态库 为什么要使用库(形成原理 ) 生成一个静态库 静态库的使用 动态库 生成一个动态库 动态库的使用 解决方法 动态库加载过程 ​编辑 前言 库&#xff08;Library&#xff09;是一种方式&#xff0c;可以将代码打包成可重用的格式&#xff08;站…

OrionX:革新GPU资源管理,助力AI开发团队高效运作

您的AI开发团队是否经常陷入这样的窘境&#xff1a; 人多卡少&#xff0c;GPU资源难以满足每个成员的需求&#xff1f; 当开发环境中需要变更GPU卡配置时&#xff0c;流程繁琐不堪&#xff0c;不得不关闭容器、重新配置再重启&#xff1f; 是否曾因GPU卡分配后未被充分利用而…

简单好用的DX修复工具下载|修复丢失损坏的DLL文件

DirectX是被广泛运用于游戏和多媒体应用程序的一种重要组件&#xff0c;它可以提供优良的视觉效果和音频体验。很多用户在使用计算机时或多或少会遇到因为DirectX缺失而导致相关问题。例如&#xff1a;系统故障、图形渲染错误、音频失真等问题。 今天小编将深入浅出地为大家讲…

在循环语句里面element重复提示最后一条的解决办法

做项目时遇到了个问题&#xff0c;要求把时间重叠的每个阶段都提示出来 但是发现$message的提示框不仅都重合在一起 并且数据内容只是最后一次循环出来的信息如下图 首先解决样式重合问题 这里我就用的是简单粗暴的方法加个定时器 这样重合问题就可以解决其次是提示内容只是最后…

删除分区 全局索引 drop partition global index Statistics变化

1.不一定unusable&#xff0c;可以先删除data (index 再删除过程中会更新结构)再drop/truncate. ---------------------- CREATE TABLE interval_sale ( prod_id NUMBER(6) , cust_id NUMBER , time_id DATE ) PARTITION BY RANGE (time_i…

前端面试宝典【HTML篇】【4】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

C++回顾——虚析构

一、示例代码 #include<iostream> using namespace std;class Weapon { public:virtual void getWeapon() 0;//virtual ~Weapon() default; };class bow :public Weapon { public:void getWeapon() override{cout << "弓箭 " << ends;}~bow(){c…