Linux 基于HAProxy+KeepAlived实现

Linux 基于HAProxy+KeepAlived实现

  • 1. 介绍
    • 1.1 高可用(HA-High Avaialbility)
    • 1.2 负载均衡(LB-Load Balance)
    • 1.3 HAProxy
    • 1.4 KeepAlived
  • 2. 后端服务为Nginx
    • 2.1 系统拓扑
    • 2.2 环境说明
    • 2.3 前提条件
    • 2.4 详细步骤
      • 2.4.1 机器初始化
      • 2.4.2 部署Nginx
        • 2.4.2.1 安装
        • 2.4.2.2 配置
        • 2.4.2.3 启动
        • 2.4.2.4 验证
    • 2.4.3 部署HAProxy
      • 2.4.3.1 安装
      • 2.4.3.3 启动
      • 2.4.3.4 验证
    • 2.4.4 第一次测试
      • 2.4.4.1 测试LB能力
      • 2.4.4.2 测试HA能力
    • 2.4.5 部署KeepAlived
      • 2.4.5.1 安装
      • 2.4.5.2 配置
      • 2.4.5.3 启动
      • 2.4.6.1 测试VIP是否会漂移
      • 2.4.6.2 测试LB+HA能力
    • 2.4.7 配置健康检查
    • 2.4.8 第三次测试
      • 2.4.8.1 测试LB+HA+健康检查能力
  • 3. 疑问和思考
    • 3.1 keepalive是怎么通信选举出master节点?
    • 3.2 keepalive的切换策略是怎么样的?
  • 4. 参考文档

高可用(HA-High Avaialbility)
广义上理解,可以认为高可用是系统设计的目标,而容灾是达到高可用这一目标的手段。
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。

负载均衡(LB-Load Balance)
负载均衡用于解决系统流量分发问题。客户端的流量首先会到达负载均衡服务器,由负载均衡服务器通过一定的调度算法将流量分发到不同的应用服务器上面,同时负载均衡服务器也会对应用服务器做周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。


1. 介绍

1.1 高可用(HA-High Avaialbility)

广义上理解,可以认为高可用是系统设计的目标,而容灾是达到高可用这一目标的手段。
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。

1.2 负载均衡(LB-Load Balance)

负载均衡用于解决系统流量分发问题。客户端的流量首先会到达负载均衡服务器,由负载均衡服务器通过一定的调度算法将流量分发到不同的应用服务器上面,同时负载均衡服务器也会对应用服务器做周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。

1.3 HAProxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。
简单理解HAProxy的作用,就是承担LB负载均衡器的角色。

1.4 KeepAlived

KeepAlived是一个基于VRRP 协议来实现的 LVS 服务高可用方案,可以利用其来解决单点故障。
一个高可用的LB服务会有2台服务器运行Keepalived,一台为主服务(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

2. 后端服务为Nginx

本章先以后台服务为Nginx时为例,说明基于KeepAlived+HAProxy实现的服务高可用方案的设计与详细搭建步骤。

2.1 系统拓扑

本次实验的拓扑如图所示。
在这里插入图片描述

说明如下:

  1. 后端服务器:

    • 两台,分别是Backend-1和Backend-2。
    • 均部署了Nginx服务,监听80端口。
  2. 负载均衡服务器:

    • 两台,分别是LB-Master和LB-Backup,均部署了HAProxy。
    • 每一台HAProxy上,绑定后端两台Nginx服务器,协议为HTTP即L7 LB,轮询算法,将流量负载到Backend-1和Backend-2的80端口。
    • 在LB-Master和LB-Backup上,均部署了KeepAlived,配置其VIP为192.168.24。配置LB-Master的权重比LB-Backup高,那么选举时一般情况下会把LB-Master选举为主,所以VIP会优先漂移到LB-Master上。
    • KA配置健康检查,定期查询本机HAProxy是否健康,如异常则将KA本身挂起,让出VIP,使其漂移到另外的KA节点上。
  3. VIP:

    • 一个虚拟IP,由KeepAlived软件来决定LB的哪个机器可以抢到。
  4. 业务流量:

    • 业务对系统的访问地址为VIP,例如此处如果业务流量需要访问Nginx,则访问 http://192.168.0.24:80 即可。
    • 正常工作情况下,只有LB-Master或LB-Backup作为复杂均衡器,对外提供服务

2.2 环境说明

本次实验的环境说明如下:

序号类型内网IP角色部署内容操作系统内核版本CPU内存系统盘
1CVM192.168.0.14LB-masterHaproxy 1.5.18KeepAlived 1.3.5CentOS 7.73.10.0-1062.18.1.el7.x86_641c2g50g
2CVM192.168.0.8LB-backupHaproxy 1.5.18KeepAlived 1.3.5CentOS 7.73.10.0-1062.18.1.el7.x86_641c2g50g
3CVM192.168.0.17Backend-1Nginx 1.16.1CentOS 7.73.10.0-1062.18.1.el7.x86_641c2g50g
4CVM192.168.0.4Backend-2Nginx 1.16.1CentOS 7.73.10.0-1062.18.1.el7.x86_641c2g50g
5HAVIP192.168.0.24VIPVIP

2.3 前提条件

  1. 本次实验均在云上环境进行,因此具备yum源,使用其来安装相关软件。如果私有化场景下,未提供yum源,则需要单独去下载各软件的rpm源来安装,或源码编译方式安装。具体安装方式参考网上指引。
  2. 所有环境资源(CVM、HAVIP等)准备就绪。

2.4 详细步骤

2.4.1 机器初始化

在所有服务器上面进行配置,关闭防火墙和Selinux,设置主机名。

#关闭防火墙
systemctl stop firewalld  
#关闭selinux,临时生效
setenforce 0   
vim /etc/hosts# 内容如下
192.168.0.14 LB-master
192.168.0.8  LB-backup
192.168.0.17  Backend-1
192.168.0.4  Backend-2

2.4.2 部署Nginx

在后端服务器部署Nginx服务,模拟后端提供服务。

2.4.2.1 安装
# 分别在Backend-1、Backend-2服务器上操作:
ssh Backend-1
yum install -y nginx

在这里插入图片描述

2.4.2.2 配置

写入nginx访问页面显示内容,并启动nginx,验证Nginx服务正常

# Backend-1服务器
ssh Backend-1
echo "Hello World server1" > /usr/share/nginx/html/index.html# Backend-2服务器
ssh Backend-2
echo "Hello World server2" > /usr/share/nginx/html/index.html
2.4.2.3 启动

配置完成后,启动Nginx

# Backend-1服务器
ssh Backend-1
systemctl start nginx
systemctl status nginx# Backend-2服务器
ssh Backend-2
systemctl start nginx
systemctl status nginx

在这里插入图片描述

2.4.2.4 验证

验证Nginx服务可用性

  • 浏览器验证
http://192.168.0.17/
http://192.168.0.4/

在这里插入图片描述

  • 服务器上curl验证
curl http://192.168.0.17:80
curl http://192.168.0.4:80

在这里插入图片描述

2.4.3 部署HAProxy

在负载均衡服务器LB-Master和LB-Backup上部署HAProxy,模拟LB调度器。

2.4.3.1 安装

分别在LB-Master、LB-Backup服务器上操作:

主HAProxy配置

# 主HAProxy
ssh LB-Master
yum -y install haproxy# 备 HAProxy
ssh LB-Backup
yum -y install haproxy
2.4.3.2 配置安装完成后,配置HAProxy,注意标红的关键信息。
cp -rf /etc/haproxy/haproxy.cfg{,.bak}
vim /etc/haproxy/haproxy.cfg# 配置如下,注意标红的关键的信息globallog                     127.0.0.1 local2 infopidfile                 /var/run/haproxy.pidmaxconn                 4000                  #优先级低user                    haproxygroup                   haproxydaemon                                        #以后台形式运行ha-proxynbproc 1                                      #工作进程数量  cpu内核是几就写几
defaultsmode                    http                #工作模式 http ,tcp 是 4 层,http是 7 层   log                     globalretries                 3                  #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查option                  redispatch            #服务不可用后重定向到其他健康服务器。maxconn                 4000                  #优先级中contimeout              5000                  #ha服务器与后端服务器连接超时时间,单位毫秒msclitimeout              50000                 #客户端超时srvtimeout              50000                 #后端服务器超时
listen statsbind                    *:81         # HAProxy自身使用的端口stats                   enablestats uri               /haproxy               #使用浏览器访问 http://172.16.0.10:81/haproxy,可以看到服务器状态  stats auth              admin:xxxx  #用户认证
frontend  webmode                    httpbind                            *:80      #监听哪个ip和什么端口option                  httplog           #日志类别 http 日志格式acl html url_reg  -i  \.html$             #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)use_backend backend-nginx if  html          #2.如果满足acl html规则,则推送给后端服务器backend-nginxdefault_backend         backend-nginx     #默认使用的服务器组
backend backend-nginx                         #名字要与上面的名字必须一样balance     roundrobin                    #负载均衡的方式server  http1 192.168.0.17:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2server  http2 192.168.0.4:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

备 HAProxy

# 备 HAProxy
cp -rf /etc/haproxy/haproxy.cfg{,.bak}
vim /etc/haproxy/haproxy.cfg# 配置如下,注意标红的关键的信息
globallog                     127.0.0.1 local2 infopidfile                 /var/run/haproxy.pidmaxconn                 4000                        #优先级低user                    haproxygroup                   haproxydaemon                                              #以后台形式运行ha-proxynbproc 1                                            #工作进程数量  cpu内核是几就写几
defaultsmode                    http                        #工作模式 http ,tcp 是 4 层,http是 7 层   log                     globalretries                 3                           #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查option                  redispatch                  #服务不可用后重定向到其他健康服务器。maxconn                 4000                        #优先级中contimeout              5000                        #ha服务器与后端服务器连接超时时间,单位毫秒msclitimeout              50000                       #客户端超时srvtimeout              50000                       #后端服务器超时
listen statsbind                    *:81stats                   enablestats uri               /haproxy                    #使用浏览器访问 http://172.16.0.8:81/haproxy,可以看到服务器状态  stats auth              admin:UDC@Tencent2020       #用户认证
frontend  webmode                    httpbind                    *:80                        #监听哪个ip和什么端口option                  httplog                     #日志类别 http 日志格式acl html url_reg  -i  \.html$                       #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)use_backend backend-nginx if  html                    #2.如果满足acl html规则,则推送给后端服务器backend-nginxdefault_backend    backend-nginx                    #默认使用的服务器组
backend backend-nginx                                   #名字要与上面的名字必须一样balance     roundrobin                              #负载均衡的方式server  http1 192.168.0.17:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2server  http2 192.168.0.4:80 maxconn 2000 weight 1  check inter 1s rise 2 fall 2

2.4.3.3 启动

配置完成后,LB-Master和LB-Backup上分别启动haproxy

主HAProxy

# 主HAProxy
ssh LB-Master
systemctl start haproxy
systemctl status haproxy

备HAProxy

# 备HAProxy
ssh LB-Backup
systemctl start haproxy
systemctl status haproxy

在这里插入图片描述

2.4.3.4 验证

浏览器验证

http://192.168.0.14:81/haproxy

在这里插入图片描述

http://192.168.0.8:81/haproxy

在这里插入图片描述

2.4.4 第一次测试

2.4.4.1 测试LB能力

访问LB-Master的80端口,可以看到,已按预期轮询的转发到Backend-1和Backend-2的80端口上
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试LB-Backup,也是一样的效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此,已经解决负载均衡问题。

2.4.4.2 测试HA能力

但高可用问题仍未解决,即假如LB-Master(或LB-Backup,访问任意一台LB节点时)的HAProxy服务挂掉,即使底层的Nginx服务都正常,访问LB地址实际的服务亦不可达。
LB-Master停掉HAProxy,继续访问LB地址,Nginx服务不可达。

测试完后重启HAProxy。
在这里插入图片描述

2.4.5 部署KeepAlived

2.4.5.1 安装

在LB-Master和LB-Backup上安装KeepAlived

# 主KA
ssh LB-Master
yum install -y keepalived
# 备KA
ssh LB-Backup
yum install -y keepalived

在这里插入图片描述
在这里插入图片描述

2.4.5.2 配置

注意:需要参考腾讯云官方的指引来配置KA,否则可能会绑不上VIP。在官方指引给的示例中,注意修改本机IP、对端IP、VIP等配置项,以及后文提及的健康检查相关脚本设置。

主KA配置

# 主KA
ssh LB-Master
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf# 注意标红配置
global_defs {# 路由id:当前安装keepalived的节点主机标识符,保证全局唯一router_id keep_01script_user rootenable_script_security
}vrrp_script checkhaproxy {script "/etc/keepalived/do_sth.sh"interval 5
}vrrp_instance VI_1 {# 表示状态是MASTER主机还是备用机BACKUPstate BACKUP# 该实例绑定的网卡名称interface eth0# 保证主备节点一致即可virtual_router_id 51# 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选priority 100# 主备之间同步检查时间间隔,单位秒advert_int 2# 认证权限密码,防止非法节点进入authentication {auth_type PASSauth_pass 1111}unicast_src_ip 192.168.0.14  # 设置本机内网IP地址unicast_peer {192.168.0.8             # 对端设备的 IP 地址}# 虚拟出来的ip,可以有多个(vip)virtual_ipaddress {192.168.0.24}track_script {checkhaproxy}
}

在这里插入图片描述

备KA配置

# 备KA
LB-Backup
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf
global_defs {router_id keep_02script_user rootenable_script_security
}vrrp_script checkhaproxy {script "/etc/keepalived/do_sth.sh"interval 5
}vrrp_instance VI_1 {# 备用机设置为BACKUPstate BACKUPinterface eth0virtual_router_id 51# 权重低于MASTERpriority 80advert_int 2authentication {auth_type PASSauth_pass 1111}unicast_src_ip 192.168.0.8  # 设置本机内网IP地址unicast_peer {192.168.0.14             # 对端设备的 IP 地址}virtual_ipaddress {# 注意:主备两台的vip都是一样的,绑定到同一个vip192.168.0.24}
}

在这里插入图片描述

2.4.5.3 启动

启动KA前,确认主备服务器上的IP地址,与启动后进行对比。

# LB-Master
ip a

在这里插入图片描述

# LB-Backup
ip a

在这里插入图片描述

LB-Master和LB-Backup上,分别启动KA
ssh LB-Master
systemctl start keepalived
systemctl status keepalived

在这里插入图片描述

ssh LB-Backup
systemctl start keepalived
systemctl status keepalived

在这里插入图片描述

启动KA后,查看VIP的绑定。由于优先度设置关系,可以看到绑定VIP(192.168.0.24)的是LB-Master服务器(192.168.0.14)
在这里插入图片描述
在这里插入图片描述
并创建了相关的路由表,因此master节点能够正常响应流量

Backup服务器没有绑定vip
在这里插入图片描述

因此访问vip是,相关的流量会转发到master节点,slave节点处于standby状态。

##2.4.6 第二次测试

2.4.6.1 测试VIP是否会漂移

将LB-Master的KeepAlived服务停止,验证VIP是否能正常漂移。

# 停止KA前,先查看各自的ip
# LB-Master节点
ip a 
# LB-Backup节点
ip a 
# LB-Master节点
systemctl stop keepalived
# 停止KA后,再查看各自的ip
# LB-Master节点
ip a 
# LB-Backup节点
ip a 

可以发现VIP已经从LB-Master漂移到了LB-Backup上。
在这里插入图片描述
之后重启LB-Master的KeepAlived服务,但是VIP是不会漂移到LB-Master上,还在LB-Backup上。
在这里插入图片描述
重启LB-Backup的KeepAlived服务,此时VIP会漂移到LB-Master上
在这里插入图片描述

2.4.6.2 测试LB+HA能力

此时,由于KA的加入,加上之前的HAProxy,整个架构已经具备了LB+HA的能力。
此时系统对外的高可用入口为VIP。通过VIP来访问Nginx服务(HTTP协议,80端口),看是否可以达到高可用+负载均衡的目标。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4.7 配置健康检查

上面的测试中,已经验证了同一时刻中单个KA的服务的不可用,另外一个KA的服务可以将VIP抢到对应所在的服务器,确保整个系统的高可用。但另外还有一个场景是,如果HAProxy宕机了,那么访问VIP就会有问题,因为HAProxy已经不能转发到后端服务上去了。

例如此处将LB-Master的HAProxy停止,但由于KA服务是正常的,VIP仍在LB-Master上,所以访问不到Nginx服务。
在这里插入图片描述
要解决该问题的话,需要考虑实现一个健康检查的脚本,让KeppAlived定期去检查本机HAProxy的状态,或者检查本机的HAProxy功能可用性(例如通过本地的HAProxy访问后端服务是否正常))。如果本机HAProxy已经挂掉或功能不可用,那么可以设置退出本机的KeepAlived,从而让对端的KeepAlived(LB-Backup)来承接起Master的角色。

例如在KeepAlived的配置文件中,定义一个do_sth.sh脚本,每隔5秒检查一次。如果发现haproxy访问不通,则停止本地KeepAlived服务。

/etc/keepalived/do_sth.sh脚本内容:

#!/bin/bash
# 检查通过本地的HAProxy访问后端服务是否正常
if ! /usr/bin/curl -I http://localhost:80 >/dev/null 2>&1; then
# 或者检查HAProxy的服务状态
# if ! systemctl status haproxy > /dev/null 2>&1; thensystemctl stop keepalived
fi
chmod +x /etc/keepalived/do_sth.sh

在这里插入图片描述
在这里插入图片描述

测试停止LB-Master上的HAProxy,查看LB-Master的KeepAlived服务是否会停止
在这里插入图片描述
在这里插入图片描述

此时验证确认配置无误。

2.4.8 第三次测试

2.4.8.1 测试LB+HA+健康检查能力

在一台客户端机器(如192.168.0.16)上不断的请求VIP上80 HTTP服务(curl http://192.168.0.24:80),两秒超时。

watch -e "curl -m 2 http://192.168.0.24:80"

此时,在LB-Master上,停止HAProxy。会发现有一定时间的宕机窗口,过一小会再测,等VIP漂移到LB-Backup上后,服务访问就能恢复。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 疑问和思考

3.1 keepalive是怎么通信选举出master节点?

  • VRRP(Virtual Router Redundancy Protocol)心跳检测:
    Keepalived的核心功能之一是实现了VRRP协议,多个节点之间形成一个虚拟路由器组,其中一个节点作为主节点(MASTER),其余节点为备份节点(BACKUP)。主节点会定期发送VRRP通告(heartbeat)给所有组内的节点,以证明自己仍在正常工作。备份节点监听这些心跳信息。如果在预定的时间内,备份节点没有接收到主节点的心跳,则认为主节点已失效,并按照VRRP优先级规则选举新的主节点。这种机制可以确保在主节点发生故障时,服务能够快速切换到备份节点,从而维持服务的高可用性。

  • 自定义健康检查脚本:
    Keepalived支持用户自定义健康检查脚本(vrrp_script),通过执行这些脚本来检测特定服务或者资源的状态。例如,可以编写一个脚本来ping某个IP地址、检查TCP端口是否打开,或者执行HTTP/HTTPS请求来测试Web服务的响应状态。一旦健康检查脚本返回非成功状态(如非零退出码),Keepalived可以根据配置减小该节点在VRRP组中的优先级,使得VIP(Virtual IP Address)转交给其他健康的节点。

vrrp_script chk_http_port {script "/usr/local/bin/check_http.sh" # 自定义脚本路径interval 2                            # 检查间隔(单位:秒)weight 2                              # 成功时增加的权重值fall 3                                # 连续几次失败认为节点失效rise 2                                # 连续几次成功认为节点恢复
}vrrp_instance VI_1 {...track_script {chk_http_port}...
}

3.2 keepalive的切换策略是怎么样的?

在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在Keepalived配置文件中设置“state”选项为“MASTER”状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的“priority”值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的“weight”值,这两个选项对应的都是一个整数值,其中“weight”值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。一个节点的权重公式如下

优先级 = p r i o r i t y + w e i g h t 优先级 = priority + weight 优先级=priority+weight

切换master节点的原则是: 优先级的值越大的节点,切换为master,其他节点降级为backup节点。

其中weight可以是正值也可以是负值,两者不同时,相关的计算有差异

  • weight值为正数时

    • 如果检测成功,weight保持不变,优先级=priority + weight

    • 如果检测失败,weight=0, 优先级 = priority

    • Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换

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

  • weight值为负数时

    • 如果检测成功,weight=0, 优先级 = priority

    • 如果检测失败,weight保持不变(负值),优先级=priority - abs(weight)

    • Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。

    • Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。

下面列举一个实例来具体说明。

假定有A和B两节点组成的Keepalived集群,在A节点keepalived.conf文件中,设置“priority”值为100,而在B节点keepalived.conf文件中,设置“priority”值为80,并且A、B两个节点都使用了“vrrp_script”模块来监控mysql服务,同时都设置“weight”值为10,那么将会发生如下情况。

在两节点都启动Keepalived服务后,正常情况是A节点将成为集群中的Master节点,而B自动成为Backup节点,此时将A节点的mysql服务关闭,通过查看日志发现,并没有出现B节点接管A节点的日志,B节点仍然处于Backup状态,而A节点依旧是Master状态,切换失败,在这种情况下整个HA集群将失去意义。

再来分析一下刚才实例,由于A、B两个节点设置的“weight”值都为10,因此符合选举策略的第一种,在A节点停止Mysql服务后,A节点的脚本检测将失败,此时A节点的权值将保持为A节点上设置的“priority”值,即为100,而B节点的权值将变为“weight”值与“priority”值之和,也就是90(10+80),这样就出现了A节点权值仍然大于B节点权值的情况,因此不会发生主、备切换。

因此 对于“weight”值的设置很关键: 有一个简单的标准,即“weight”值的绝对值要大于Master和Backup节点“priority”值之差

对于上面A、B两个节点的例子,只要设置“weight”值大于20即可保证集群正常运行和切换。由此可见,对于“weight值的设置,要非常谨慎,如果设置不好,将导致集群角色选举失败,使集群陷于瘫痪状态。

4. 参考文档

暂无

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

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

相关文章

Python列表、元组、字典及集合

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、列表定义方式: 二、元组1、定义方式:2、元组中的物理存储地址不可修改,如果修改则会报错,但是元组中的列表、字典项等却可以…

React-1-jsx基础-事件绑定-样式处理

一.JSX基础-概念和本质 1.1 什么是JSX JSX是JavaScript和XML(HTML)的缩写,表示在JS代码中编写HTML模版结构,它是React中编写UI模版的方式 优势: 1. HTML的声明式模版写法 2. JS的可编程能力 JSX的本质: JSX并不是标…

vivado 手动布线

手动路由 手动路由允许您为网络选择特定的路由资源。这给了你对信号将要采用的路由路径的完全控制。手动路由不调用route_design。路线在路线数据库中直接更新。当您想精确控制网络的延迟时,可能需要使用手动路由。对于例如,假设有一个源同步接口&#…

如何查看JVM使用的是什么垃圾收集器

文章目录 一、背景分析二、查看垃圾收集器三、理解的偏差四、深挖 demo 代码五、总结 一、背景分析 无论讨论对象的内存分配,还是讨论内存的回收策略或是算法,都需要明确指出是基于哪种垃圾收集器进行的讨论。所以,很自然地就想到这个问题&a…

脱敏技术!!!

什么是数据脱敏??? 数据脱敏(Data Masking)是一种数据安全技术,旨在通过预先设定的规则和算法,对原始数据中包含的敏感信息进行变形处理,使得这些信息在非生产环境(例如…

考研数学|汤家凤1800基础部分要做完吗?

我教你一个方法,保证让你高质量的做完1800基础部分,而且还不用把所有题目都做了 我当然不是教你如何投机取巧,投机取巧是考不了高分的,我教你的都是我在实际考研过程中实际运用到的方法! 其实这个方法也是我在二战的时…

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 医院手麻系统源码

C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备 手术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后…

面试题:Java虚拟机JVM的组成

1. 基础概念 JVM是什么 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收机制 JVM由哪些部分组成,运行流程是什么? …

C++从入门到精通——C++输入和输出

C输入和输出 前言一、C打印Hello World二、C输入&输出关于I/O流C输入&输出cout函数cin函数endl函数 三、C输入和输出的说明printf、scanf和cout、cin的区别cout函数和cin函数控制精度和宽度std命名空间的使用惯例 前言 C中的输入和输出主要通过标准库中的iostream类实…

Linux 入门及其基本指令(上)

目录 0 .引言 1. XShell 远程登录 Linux 1.1 云服务器 1.2. XShell 远程登陆 Linux 2. 详解 Linux 基本指令 2.1 ls 指令 2.2 pwd 指令 2.3 cd 指令 2.4 touch 指令 2.5 mkdir指令 2.6 rmdir指令 && rm 指令 0 .引言 如今,Linux 在服务器…

uniapp vue-cli项目配置devServer和outPutDir

上一次说了使用vue-cli创建uni-app项目,然后使用第三方工具开发打包,利用jekins发布等。 这一次我想解决以下问题: 1我想配置devServer供开发环境使用,这样也可以解决开发环境的跨域问题 2以前我的每个版本信息都配置在package…

黑群晖基于docker配置frp内网穿透

前言 我的黑群晖需要设置一下内网穿透来外地访问,虽然zerotier的p2p组网已经很不错了,但是这个毕竟有一定的局限性,比如我是ios的国区id就下载不了zerotier的app,组网不了 1.下载镜像 选择第一个镜像 2.映射文件 配置frpc.ini&a…

C 指向指针的指针

指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。 一个指向指针的指针变量…

常见6种开源协议比较

前言 常见的开源许可协议有6种是比较常见和广泛使用的,每种协议都有其特定的使用场景和约束条件。这6种分别是GPL, LGPL,MIT许可证, Apache许可证,BSD许可证和Mozilla Public License(MPL). 6种开源许可协议…

Redis 开源协议变更背后:开源软件与云计算巨头的竞争博弈

01 背景 在云计算的风潮下,开源软件的生态环境正在经历一场剧变。2024 年 3 月 20 日,这种变化在 Redis 身上得到了集中体现。Redis 商业公司 CEO Rowan Trollope 宣布,Redis 将从 BSD 3-Clause 许可证过渡到双重许可证模式,包括…

【Redis】Redisson实现分布式锁

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。 官网地址 GitHub地址 Redisson入门 1.引…

Nexus3 Docker 私有仓库

Nexus3 Docker 私有仓库 安装并部署 Nexus3 $ docker search nexus3$ docker pull sonatype/nexus3$ mkdir /home/tester/data/docker/nexus3/sonatype-work $ sudo chown -R 200 /home/tester/data/docker/nexus3/sonatype-work$ docker run -d --namenexus3 \ --restartalw…

面试题目--3.19

1.foo()和foo()之间有什么区别? 代表所有的warning忽略 2.什么是csrf攻击?如何防范? csrf,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。 基本原理:用户访问a网站登录并生成了coo…

亲历中国智驾大战,吴新宙加入NVIDIA半年后首秀

‍作者 |张祥威 编辑 |德新 吴新宙近日现身NVIDIA GTC,这是其从小鹏汽车离开加入NVIDIA之后的首次公开亮相。 吴目前担任NVIDIA汽车事业部副总裁,全面负责NVIDIA的车载计算产品线DRIVE平台的产品定义以及工程落地工作。吴新宙最广为人知的经历&#xf…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…