lvs+keepAlived高可用部署

news2024/12/22 11:23:18

LVS+KeepAlived高可用部署实战

1. 构建高可用集群

1.1 什么是高可用集群

高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外部不间断的提供服务,把因为软件,硬件,认为造成的故障对业务的影响降低到最小程度。总而言之就是保证公司业务7*24小时不宕机

1.2 高可用衡量标准

衡量集群的可用性(HA)高低,可以从MTTF(平均无故障时间)和MTTR(平均故障维修时间)进行考量,公式为:HA=MTTF/(MTTF+MTTR)*100%,具体衡量标准可以参考下表

基本可用性2个999%年度宕机时间:87.6小时
较高可用性3个999.9%年度宕机时间:8.8小时
具有故障自动恢复4个999.99%年度宕机时间:53分钟
极高可用性5个999.999%年度宕机时间:5分钟
1.3 高可用保障

对集群中的服务器进行负载均衡、健康监测,并在服务器出现故障时能进行故障转移,自动切换到正常服务器是高可用保障的必要手段。

1.3.1 负载均衡

常见的负载均衡手段如下:

硬件负载均衡,如F5

软件负载均衡,如nginx、haproxy、lvs

几种软件负载均衡技术比较

技术优点缺点
nginx可以针对http应用做一些分流的策略; 对网络稳定性的依赖非常小 安装和配置简单,测试方便 能支撑几万的并发量 可作为静态网页和图片服务器仅支持http、https和Email协议 只支持通过端口进行健康检测
haproxy支持通过URL进行健康检测 ,单纯做负载均衡,效率高于nginx 支持TCP的负载均衡,可以对mysql集群负载不支持POP/SMTP协议 不支持HTTP cache功能 多进程模式支持不够好 重载配置需要重启进程
lvs抗负载能力强,工作在网络4层,性能最好 配置性比较低 ,工作稳定 只分发请求,无流量产生,保证IO性能 应用范围比较广不支持正则表达式处理 不能做动静分离 大型网站实施复杂
没有专门用于windows的版本
1.3.2 健康监测和自动切换

常见的健康监测和自动切换软件有keepAlived和heartBeat,其二者对比如下:

Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单

Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能

1.4 高可用拓扑图

'xxs'

2. 软件负载均衡技术LVS

需要有一定会的网络相关基础
了解虚拟机三种网络连接方式参考 文献

2.1 LVS简介
2.1.1 什么是lvs

LVS是Linux Virtual Server的简写,在1998年5月由章文嵩博士成立。

工作在OSI模型的四层,基于IP进行负载均衡。

在linux2.2内核时,IPVS就已经以内核补丁的形式出现。

从2.4版本以后,IPVS已经成为linux官方标准内核的一部分。

2.1.2 lvs官方资料链接

a. lvs项目介绍 http://www.linuxvirtualserver.org/zh/lvs1.html

b. lvs集群的体系结构 http://www.linuxvirtualserver.org/zh/lvs2.html

c. lvs集群中的IP负载均衡技术 http://www.linuxvirtualserver.org/zh/lvs3.html

d. lvs集群的负载调度 http://www.linuxvirtualserver.org/zh/lvs4.html

e. lvs中文站点 http://zh.linuxvirtualserver.org

2.2 lvs拓扑
2.2.1 lvs术语

LVS服务器(DS)

集群中节点服务器(RS)

虚拟IP地址(VIP),用于向客户端提供服务的IP地址(配置于负载均衡器上)

真实服务器的IP地址(RIP), 集群中节点服务器的IP地址

负载均衡器IP地址(DIP),负载均衡器的IP地址,物理网卡上的IP

客户端主机IP地址(CIP),终端请求用户的主机IP地址

2.2.2 工作原理和拓扑图

LVS负载均衡调度技术是在linux内核中实现的,使用配置LVS时,不是直接配置内核中的IPVS,而是通过IPVS的管理工具IPVSADM来管理配置,LVS集群负载均衡器接受所有入站客户端的请求,并根据算法来决定由哪个集群的节点来处理请求。

'xxs'

2.3 lvs的三种工作模式
2.3.1 NAT模式

NAT(Network Address Translation)模式是基于NAT技术实现的。在此模式中,LVS服务器既要处理请求的接入,又要处理请求的响应。因此存在较大的性能瓶颈。

'xxs'

2.3.2 DR模式

DR(Direct Routing)模式是LVS的默认工作模式,也叫直接路由模式。只处理请求的接入,不处理请求的响应。因此性能高,瓶颈小。

'xxs'

2.3.3 TUN模式

TUN(Tunneling)模式需要服务器支持IP隧道(IP tunneling,是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程)技术,限制较大,一般不用。

'xxs'

2.4 LVS调度算法
2.4.1 静态调度算法
调度算法说 明
RRroundrobin轮询调度
WRRWeighted RR加权轮询调度
SHSoure Hashing源地址哈希调度
DHDestination Hashing目标地址哈希调度
2.4.2 动态调度算法
调度算法说 明
LCLeast Connections最小连接数调度
WLCWeighted LC加权最小连接数调度 *(默认
SEDShortest Expection Delay初始连接高权重优先
NQNerver Queue 第一轮平均分配,后续SED
LBLCLocality-Based LC 动态的DH算法
LBLCRLBLC with Replication 带复制功能的LBLC
FOWeighted Fail Over,linux内核4.15后新增的调度算法
OVFOverflow-connection,linux内核4.15后新增的调度算法
2.5 lvs基本命令

安装:yum install ipvsadm

对于lvs的操作,主要是通过ipvsadm软件实现,常用的lvs操作命令如下:

2.5.1 集群服务管理
命令说 明
ipvsadm -A -t IP(VIP) -s 调度算法(RR)此命令用来添加一个lvs策略,IP指VIP,调度算法是12种调度算法的一种
ipvsadm -C此命令用来清除一个lvs策略
ipvsadm -S此命令用来保存一个lvs策略
ipvsadm -R此命令用来加载一个lvs策略
ipvsadm -L此命令用来查看策略
2.5.2 集群RS管理
命令说 明
ipvsadm -a -t IP1(VIP) -r IP2(RIP) -mg
ipvsadm -d -t IP1 -r IP2此命令用来删除一台RS,IP1指VIP,IP2指RIP
2.6 lvs实战
2.6.1 NAT模式实战

NAT实战拓扑图

'xxs'

NAT模式实现

按照上面的拓扑图,进行NAT实战,步骤如下:

A. 准备4台linux虚拟机,并确定每台虚拟机的角色,为了方便区分,可以对每台虚拟机设置新的主机名,比如 LVS服务器可以设置主机名为lvs,设置方式如下

#设置主机名
hostnamectl set-hostname lvs
#断开远程连接
logout
#重新连接即可看到主机名已经更改

然后对四台虚拟机分别进行配置如下:

RS1和RS2配置

  1. 配置网卡为NAT模式,RS1设置静态IP为192.168.10.31,RS2设置静态IP为192.168.10.32。

  2. 下载安装httpd服务,命令如下

yum install -y httpd
  1. 设置首页内容(RS2把内容改为this is RS2)
echo this is RS01 > /var/www/html/index.html
  1. 启动httpd
systemctl start httpd
  1. 在RS1和RS2上测试访问,能输出 this is RS01或this is RS02即为成功
[root@rs01 ~]# curl localhost
this is RS01
  1. RS1和RS2指定网关为 192.168.10.30 ,子网掩码255.255.255.0

  2. 查看网关是否生效

[root@linux31 network-scripts]# route -n
-bash: route: 未找到命令
[root@linux31 network-scripts]# yum install net-tools
[root@linux31 network-scripts]# systemctl restart network
[root@linux31 network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.30   0.0.0.0         UG    100    0        0 ens33
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
[root@linux31 network-scripts]#

LVS服务器配置

  1. 安装ipvsadm
yum install -y ipvsadm
  1. 设置双网卡

仅主机网卡一块,IP配置为192.168.3.30,此IP是接受外部请求的VIP

NAT网卡一块,IP配置为192.168.10.30,此IP是与后端RS服务器通信的DIP

  1. 配置ip_forward转发
vi /etc/sysctl.conf
#添加如下内容并保存退出
net.ipv4.ip_forward = 1
#执行如下命令使修改生效
sysctl -p
  1. 使用ipvsadm进行负载均衡配置
#指定负载80端口的VIP,并指定调度策略为轮询
[root@linux30 ~]# ipvsadm -A -t 192.168.3.30:80 -s rr
#添加两台RS,并指定负载均衡工作模式为NAT
[root@linux30 ~]# ipvsadm -a -t 192.168.3.30:80 -r 192.168.10.31 -m
[root@linux30 ~]# ipvsadm -a -t 192.168.3.30:80 -r 192.168.10.32 -m
#查看上述配置是否生效
[root@linux30 ~]# 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.10.30:80 rr
  -> 192.168.10.31:80             Masq    1      0          0
  -> 192.168.10.32:80             Masq    1      0          0
[root@linux30 ~]#

client虚拟机配置和测试

配置网卡为仅主机模式,IP为192.168.3.31,网关无需配置即可。

在client上测试负载均衡效果,如下:

[root@localhost ~]# curl 192.168.3.30
this is RS02
[root@localhost ~]# curl 192.168.3.30
this is RS01
[root@localhost ~]# curl 192.168.3.30
this is RS02
[root@localhost ~]# curl 192.168.3.30
this is RS01

NAT模式存在的问题–>LVS性能瓶颈

2.6.2 DR模式实战

小贴士: ARP(Address Resolution Protocol)地址解析协议,是根据IP地址获取物理地址(MAC)的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

DR模式拓扑图

'xxs'

DR模式实现

通过对比NAT模式和DR模式的拓扑图可以发现,需要让LVS和RS在同一个网段,并且在两个RS服务器上也需要绑定VIP。所以DR模式实验可以在刚才的基础上进行,步骤如下:

  1. 在RS1和RS2上进行如下ARP抑制操作,并配置VIP到lo网卡上,如下:
#1: arp抑制.rs1.rs2上都配置
#arp_ignore: default 0
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#arp_announce: default 0
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
#2:rs1,rs2都去掉网关配置!!!然后重启:systemctl restart network
#3:rs1,rs2均配置VIP到lo网卡  这里的子网掩码需要4个255
[root@linux31 network-scripts]# ifconfig lo:9 192.168.10.34 netmask 255.255.255.255
[root@linux31 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.31  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2e:d2:bc  txqueuelen 1000  (Ethernet)
        RX packets 4124  bytes 4025075 (3.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2066  bytes 181284 (177.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 10  bytes 1062 (1.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 1062 (1.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo:9: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.10.34  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

注意:RS1和RS2在之前进行NAT模式实验时设置了网关为LVS的DIP,这里进行DR试验时需要把网关删除

  1. 在LVS服务器上关闭之前的ens37网卡(注意:你的网卡名称可能不是这个)
ifdown ens37
ifconfig ens37 down
  1. 在 lvs 的ens33网卡上绑定VIP:192.168.10.34
[root@linux30 ~]# ifconfig ens33:9 192.168.10.34/24
[root@linux30 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.30  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::db30:9838:de0e:8127  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::6d7c:9692:c7a8:6320  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)
        RX packets 1246  bytes 543590 (530.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 711  bytes 76124 (74.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.34  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. 在lvs服务器上清空LVS策略,并重新设置DR模式策略
#查看策略
[root@linux30 ~]# 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.3.30:80 rr
  -> 192.168.10.31:80             Masq    1      0          0
  -> 192.168.10.32:80             Masq    1      0          0        
#清空策略
[root@linux30 ~]# ipvsadm -C
#再次查看策略
[root@linux30 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

设置DR策略

#设置规则
[root@linux30 ~]# ipvsadm -A -t 192.168.10.34:80 -s rr
#添加RS
[root@linux30 ~]# ipvsadm -a -t 192.168.10.34:80 -r 192.168.10.31 -g
[root@linux30 ~]# ipvsadm -a -t 192.168.10.34:80 -r 192.168.10.32 -g
#查看策略
[root@linux30 ~]# 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.10.34:80 rr
  -> 192.168.10.31:80             Route   1      0          0
  -> 192.168.10.32:80             Route   1      0          0
  1. 修改client服务器配置,更改使用NAT网卡,并设置IP为192.168.10.33

  2. 在client测试效果

[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
  1. 在LVS服务器上查看调度情况
[root@lvs01 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:30  FIN_WAIT    192.168.116.133:45810 192.168.116.134:80 192.168.116.131:80
TCP 01:31  FIN_WAIT    192.168.116.133:45812 192.168.116.134:80 192.168.116.132:80
TCP 01:32  FIN_WAIT    192.168.116.133:45814 192.168.116.134:80 192.168.116.131:80
TCP 01:30  FIN_WAIT    192.168.116.133:45808 192.168.116.134:80 192.168.116.132:80
2.6.3 四个问题

a. 如果后端某台RS服务器挂了会出现什么问题?

b.如果LVS服务器挂了会出现什么问题?

c. 如何获知RS服务器状态?

d. 如何进行故障转移、自动切换?

3. KeepAlived

3.1 keepAlived简介

Keepalived的作用是检测服务器状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。

3.2 keepAlived主要特点
3.2.1 健康检查
检查方式说 明
tcp_check工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除
http_get工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
misc_check用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内
ssl_get和http_get相似,不同的只是用SSL连接
smtp_check主要用于邮件系统SMTP协议的检测
3.2.2 故障迁移

VRRP协议

在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。

VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信

故障迁移原理

在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。

3.3 keepAlived原理

Keepalived工作在TCP/IP参考模型的三层、四层、五层,其原理如下:

工作层说 明
网络层Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似于Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常。 比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用 层Keepalived的运行方式更加全面化和复杂化,用户可以通过自定义Keepalived工作方式。例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
3.4 分布式选主策略
3.4.1 仅设置priority

在一个一主多备的Keepalived集群中,priority值最大的将成为集群中的MASTER节点,而其他都是BACKUP节点。在MASTER节点发生故障后,BACKUP节点之间将进行“民主选举”,通过对节点优先级值priority和weight的计算,选出新的MASTER节点接管集群服务。

3.4.2 设置priority和weight

weight值为正数时

在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值将是weight值与priority值之和;如果脚本检测失效,那么MASTER节点的权值保持为priority值

MASTER 节点vrrp_script脚本检测失败时,如果MASTER节点priority值小于BACKUP节点weight值与priority值之和,将发生主、备切换。

MASTER节点vrrp_script脚本检测成功时,如果MASTER节点weight值与priority值之和大于BACKUP节点weight值与priority值之和,主节点依然为主节点,不发生切换。

weight值为负数时

在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值仍为priority值,当脚本检测失败时,MASTER节点的权值将是priority值与weight值之和(ex: 1 + -2)= -1

MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值与weight值之和小于BACKUP节点priority值,将发生主、备切换。

MASTER节点vrrp_scrip脚本检测成功时,如果MASTER节点priority值大于BACKUP节点priority值时,主节点依然为主节点,不发生切换。

weight设置标准

对于weight值的设置,有一个简单的标准,即weight值的绝对值要大于MASTER和BACKUP节点priority值之差。由此可见,对于weight值的设置要非常谨慎,如果设置不好,主节点发生故障时将导致集群角色选举失败,使集群陷于瘫痪状态。

4. LVS+keepAlived实战

4.1 实战拓扑

'xxs'

为了测试lvs的高可用,这里需要增加一台lvs服务器,需在此服务器上安装ipvsadm。

4.2 keepAlived安装和配置
4.2.1 安装keepAlived

在两台lvs服务器上都需要安装keepAlived,安装命令如下:

yum install -y keepalived

keepAlived安装完成后,在/etc/keepalived目录下有一个keepalived.conf配置文件,内容如下:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
#上面的配置无需关注,重点关注和修改下面的配置
vrrp_instance VI_1 {
    state MASTER#标识当前lvs是主,根据实际lvs服务器规划确定,可选值MASTER和BACKUP
    interface eth0#lvs服务器提供服务器的网卡,根据实际服务器网卡进行修改
    virtual_router_id 51#lvs提供的服务所属ID,目前无需修改
    priority 100#lvs服务器的优先级,主服务器最高,备份服务器要低于主服务器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #virtual_ipaddress用于配置VIP和LVS服务器的网卡绑定关系,一般需要修改
    #示例: 192.168.10.34/24 dev ens33 label ens33:9
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
#配置lvs服务策略,相当于ipvsadm -A -t 192.168.10.34:80 -s rr,一般需要修改
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr#配置lvs调度算法,默认轮询
    lb_kind NAT#配置lvs工作模式,可以改为DR
    persistence_timeout 50#用于指定同一个client在多久内,只去请求第一次提供服务的RS,为查看轮询效     果,这里需要改为0
    protocol TCP#TCP协议
    #配置RS信息,相当于ipvsadm -a -t 192.168.10.34:80 -r 192.168.10.31 -g
    real_server 192.168.201.100 443 {
        weight 1#当前RS的权重
        SSL_GET {#SSL_GET健康检查,一般改为HTTP_GET
            #两个url可以删除一个,url内的内容改为path /和status_code 200,digest删除
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
#下面的配置实际是两组lvs服务的配置,含义和上面的lvs服务配置一致。如果用不到,下面的配置可以全部删除
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
4.2.2 配置keepAlived

基于上述配置文件和实战拓扑图及服务器规划,对两台lvs服务器分别修改keepalived.conf配置如下:

lvs主服务器

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.34/24 dev ens33 label ens33:9
    }
}

virtual_server 192.168.10.34 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.10.31 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.32 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

lvs备份服务器

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.34/24 dev ens33 label ens33:9
    }
}

virtual_server 192.168.10.34 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.10.31 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.10.32 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200 
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

注意:配置文件中的key和大括号之间一定要有空格

4.2.3 启动keepAlived

在两台lvs服务器上分别启动keepAlived,命令如下:

service keepalived start
4.3 高可用测试
4.3.1 测试环境检查

上述步骤执行完毕后,可以在lvs主服务器和备份服务器分别执行ifconfig命令,可以查看到VIP被绑定到了主服务器,如下:

[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.30  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::db30:9838:de0e:8127  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::6d7c:9692:c7a8:6320  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)
        RX packets 11864  bytes 14964468 (14.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6054  bytes 449187 (438.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.34  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

这样,就可以在客户端请求VIP192.168.10.34来进行测试。

4.3.2 测试负载均衡

在客户端发起请求,测试负载均衡,如下:

[root@client ~]# curl 192.168.10.34
this is RS01
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
[root@client ~]# curl 192.168.10.34
this is RS02
4.3.3 测试RS高可用

关闭一台RS后(这里可以使用ifconfig 网卡名 down命令暂时关闭网卡),客户端继续发起请求,查看是否可以正常访问,如下:

[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS02

会发现,此时客户端可以正常访问,但只有RS2在提供服务。这说明,keepAlived检测到了RS1服务器异常,将其剔除了。

此时再启动RS1服务器,客户端继续访问,会发现响应结果如下,keepAlived检测到RS1服务器恢复正常,又将其加入服务列表了。

[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
4.3.4 测试LVS高可用

这里主要进行两个测试:

测试lvs主服务宕机

使用ifconfig 网卡名 down命令,关闭主服务器网卡,此时主服务器不能提供服务。观察备份服务器是否将VIP绑定到自己,以及客户端是否可以继续正常访问。如下:

关闭主服务器网卡

[root@lvs01 keepalived]# ifconfig ens33 down

观察备份服务器,会发现VIP已经绑定过来了。这里实际是keepAlived检测到了主服务器的异常,而做出的故障转移和自动切换。

[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.35  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::db30:9838:de0e:8127  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::6d7c:9692:c7a8:6320  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2e:ba:c0  txqueuelen 1000  (Ethernet)
        RX packets 24929  bytes 33887638 (32.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8458  bytes 590453 (576.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.34  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:2e:ba:c0  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 16  bytes 1392 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1392 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

观察客户端是否可以继续正常访问

[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01
[root@client ~]# curl 192.168.10.34
this is RS02
[root@client ~]# curl 192.168.10.34
this is RS01

测试lvs主服务器恢复

上述测试通过后,可以开启主服务器网卡,让其能够提供服务,然后观察VIP是否会回到主服务器。

开启主服务器网卡

ifconfig ens33 up

查看主服务器和备份服务器

主服务器

[root@lvs01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.30  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::db30:9838:de0e:8127  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::6d7c:9692:c7a8:6320  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)
        RX packets 12942  bytes 15089760 (14.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7888  bytes 585418 (571.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.34  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:2d:6c:7f  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 7  bytes 616 (616.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 616 (616.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

备份服务器

[root@lvs02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.35  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::db30:9838:de0e:8127  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::6d7c:9692:c7a8:6320  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::3b38:154b:fc3d:6269  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:2e:ba:c0  txqueuelen 1000  (Ethernet)
        RX packets 25287  bytes 33927783 (32.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8906  bytes 624556 (609.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 16  bytes 1392 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1392 (1.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

会发现,VIP重新绑定到了主服务器。

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

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

相关文章

【果树农药喷洒机器人】Part5:基于深度相机与分割掩膜的果树冠层体积探测方法

文章目录 一、引言二、树冠体积测量对比方法2.1冠层体积人工测量法2.2冠层体积拟合测量法 三、基于深度相机与分割掩膜探测树冠体积方法3.1像素值与深度值的转换3.2树冠体积视觉探测法3.3实验分析 总结 一、引言 果树靶标探测是实现农药精准喷施的关键环节&#xff0c;本章以果…

Java集合中的Set和Map:理解两类集合的特点与用途

文章目录 引言Set集合&#xff1a;独特性与无序性HashSet&#xff1a;快速查找LinkedHashSet&#xff1a;保持插入顺序TreeSet&#xff1a;自然排序 Map集合&#xff1a;键值对的存储HashMap&#xff1a;高效查找LinkedHashMap&#xff1a;保持插入顺序TreeMap&#xff1a;有序…

七月学习总结

一晃暑期七月份已经结束了&#xff0c;八月份需要做的事情更多。 在成长的路上不断地迷茫&#xff0c;不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发&#xff0c;往架构方向做&#xff0c;主语言Java或者go&#xff0c;408基础一定要扎实&#xff0c;计…

natapp内网穿透

网络穿透 什么是内网穿透? 内网穿透简单来说就是将内网外网通过natapp隧道打通,让内网的数据让外网可以获取 。我门开发的app项目的时候&#xff0c;必须通过irs的配置来实现访问&#xff0c;但是irs配置必须要配置外网地址我们通过ip是不可以访问到的&#xff0c;这就需要na…

VMware16.2.5版本虚拟机克隆服务步骤(图解版)

目录 一、VMware16.2.5版本虚拟机克隆服务具体步骤二、VMware16.2.5版本虚拟机克隆服务后如何配置静态ip 一、VMware16.2.5版本虚拟机克隆服务具体步骤 1.1、先停止需要克隆的服务&#xff0c;选中需要克隆的服务——>鼠标右键选择【电源】——>【关闭客户机】&#xff…

【JAVA】有关时间的操作在编程中如何实现?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言Date 类Date 类方法Data的缺陷实例获取当前日期时间日期比较java中设置date数据的显示格式 前言 在许多应用程序中&#xff0c;日期和时间的处理是必不可少的。Java提供了一…

【CSS3】CSS3 动画 ② ( 动画序列 | 使用 from 和 to 定义动画序列 | 定义多个动画节点 | 代码示例 )

文章目录 一、动画序列二、代码示例 - 使用 from 和 to 定义动画序列三、代码示例 - 定义多个动画节点 一、动画序列 定义动画时 , 需要设置动画序列 , 下面的 0% 和 100% 设置的是 动画 在 运行到某个 百分比节点时 的 标签元素样式状态 ; keyframes element-move { 0% { tr…

3.1 计算机网络和网络设备

数据参考&#xff1a;CISP官方 目录 计算机网络基础网络互联设备网络传输介质 一、计算机网络基础 1、ENIAC&#xff1a;世界上第一台计算机的诞生 1946年2月14日&#xff0c;宾夕法尼亚大学诞生了世界上第一台计算机&#xff0c;名为电子数字积分计算机&#xff08;ENIAC…

计算机网络—TCP

这里写目录标题 TCP头格式有哪些为什么需要TCP&#xff0c;TCP工作在哪什么是TCP什么是TCP连接如何确定一个TCP连接TCP和UDP的区别&#xff0c;以及场景TCP和UDP能共用一个端口&#xff1f;TCP的建立TCP三次握手过程为什么是三次握手、不是两次、四次why每次建立连接&#xff0…

网工内推 | 高校招网工、运维,可落户厦门,IE认证优先

01 厦门工学院 招聘岗位&#xff1a;网络工程师 职责描述: 1.负责学校网络架构的规划、设计、调整和性能优化&#xff0c;确保网络的性能、稳定和安全性。 2.负责网络类、安全类,智慧教室等系统集成项目整体技术方案设计及配合项目实施。 3.对建设项目进行跟踪&#xff0c;参与…

青少年CTF训练平台 SSH01-04

SSH-01 隐藏的文件.flag.txt SSH-02 配置了ssh和apt查看配置文件 第一个flag在 /etc/apt/sources.list 第二个flag/etc/ssh/sshd_config qsnctf{781dc104-1fc2-4de5-9b6e-c457ef64f799}SSH-03 提示flag是某个用户的用户名查看/etc/passwd文件 SSH-04 提示黑客带着f…

用PointNet分类3D点云

在本教程中&#xff0c;我们将学习如何训练PointNet进行分类。 我们将主要关注数据和训练过程&#xff1b; 展示如何从头开始编码 Point Net 的教程位于此处。 本教程的代码位于这个Github库中&#xff0c;我们将使用的笔记本位于这个Github库中。 一些代码的灵感来自于这个Git…

【计算机网络笔记】第二章物理层

物理层 1、四大特性 ①机械特性&#xff1a;接口是怎样的&#xff08;接口所用接线器的形状和尺寸&#xff0c;引脚数目和排列&#xff0c;固定和锁定装置等&#xff09;。 ②电气特性&#xff1a;用多少的电 ③功能特性&#xff1a;线路上电平电压的特性 ④过程特性&#xf…

高通GPIO寄存器值参数意义和设置(深度理解)

目录 1、GPIO寄存器参数值及含义 2、读写寄存器地址 3、施密特触发器引起的滞后 4、高通设备树pinctrl的定义及配置 5、高通设备树GPIO的msmxxxx-pinctrl.dtsi结构定义 本文主要介绍基于高通的gpio配置&#xff0c;其中最少见的就是配置gpio的滞后效应引起的电压偏移对实际使用…

基于Helm快速部署私有云盘NextCloud

1. 添加源 helm repo add nextcloud https://nextcloud.github.io/helm/2. 编写values.yaml 为了解决通过不被信任的域名访问。请联系您的管理员。如果您就是管理员&#xff0c;请参照 config.sample.php 中的示例编辑 config/config.php 中的“trusted_domains”设置。 nex…

Vue中使用uuid生成(脚手架创建自带的)

1.utils 说明&#xff1a;一般封装工具函数。 // 单例模式 import { v4 as uuidv4 } from uuid; // 要生成一个随机的字符串&#xff0c;且每次执行不能发生变化 // 游客身份还要持久存储 function getUUID(){// 先从本地获取uuid&#xff0c;本地存储里面是否有let uuid_tok…

【OpenCV常用函数:轮廓检测+外接矩形检测】cv2.findContours()+cv2.boundingRect()

文章目录 1、cv2.findContours()2、cv2.boundingRect() 1、cv2.findContours() 对具有黑色背景的二值图像寻找白色区域的轮廓&#xff0c;因此一般都会先经过cvtColor()灰度化和threshold()二值化后的图像作为输入。 cv2.findContous(image, mode, method[, contours[, hiera…

Chapter 13: Network Programming | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Network ProgrammingNetworked programsHypertext Transfer Protocol - HTTPThe world’s simplest web browserRetrieving an image over HTTPRetrieving web pages with urllibReading binary files using urllibParsing HTML and scra…

【DP+矩阵加速】CF691 E

Problem - 691E - Codeforces 题意&#xff1a; 思路&#xff1a; 有人只会暴力DP忘记矩阵快速幂怎么写了 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long long;using namespace std;const int N 1e2 10; const int mod 1e9 7;int…

【Transformer】自注意力机制Self-Attention

1. Transformer 由来 & 特点 1.1 从NLP领域内诞生 "Transformer"是一种深度学习模型&#xff0c;首次在"Attention is All You Need"这篇论文中被提出&#xff0c;已经成为自然语言处理&#xff08;NLP&#xff09;领域的重要基石。这是因为Transfor…