当前位置: 首页 > news >正文

RabbitMQ-运维

文章目录

  • 前言
  • 运维-集群介绍
    • 多机多节点
    • 单机多节点
  • 多机多节点
    • 下载
    • 配置hosts⽂件
    • 配置Erlang Cookie
    • 启动节点
    • 构建集群
    • 查看集群状态
  • 单机多节点
    • 安装
    • 启动两个节点
    • 再启动两个节点
    • 验证RabbitMQ启动成功
    • 搭建集群
    • 把rabbit2, rabbit3添加到集群
  • 宕机演示
  • 仲裁队列介绍
    • raft算法协议
  • raft基本概念
    • 选主
    • 任期
  • raft选取过程
    • 消息复制
  • 仲裁队列使用与演示
  • HAProxy安装
    • 安装
    • 修改haproxy.cfg
    • 查看HAProxy
  • HAProxy使用
  • 总结


前言

运维-集群介绍

多机多节点

RabbitMQ集群对延迟⾮常敏感, 所以搭建RabbitMQ集群时, 多个节点应当在同⼀个局域⽹内

单机多节点

只有⼀个虚拟机, 我们启动N个节点, ⽤端⼝号来区分

单机多节点的⽅式, 也称为"伪集群"

多机多节点

下载

准备三台服务器,而且都在一个局域网内

然后三台机器分别安装Rabbitmq,版本最好保持一致

配置hosts⽂件

然后开始配置集群,配置hosts⽂件

在这里插入图片描述
这个就是节点名称

配置每个节点的hosts⽂件, 让各个节点都能互相识别对⽅

vim /etc/hosts

格式为: IP 主机名称
⽐如我的集群配置如下:

10.0.0.232 iZ2vc7a1n9gvhfp589oav8Z
10.0.0.233 iZ2vc7a1n9gvhfp589oav6Z
10.0.0.234 iZ2vc7a1n9gvhfp589oav7Z

这个ip是内网ip
输入
ifconfig
在这里插入图片描述
这个就是内网ip

more /etc/hostname

这个是查主机名称

为什么用内网ip
因为在同一个局域网
然后开始修改host

vim /etc/hosts

在这里插入图片描述
然后就是每台机器都是这样改

配置Erlang Cookie

RabbitMQ 节点和 CLI ⼯具(如rabbitmqctl) 使⽤Cookie来进⾏⾝份验证, 确认它们之间是否被允许相
互通信. 为了使两个节点可以通信, 它们必须具有相同的共享密钥, 称为 Erlang Cookie . Cookie是
⼀个字符串, 通常存储在本地⽂件中. 每个集群节点必须具有相同的Cookie.
Cookie ⽂件的位置:
RabbitMQ启动时, erlang 虚拟机会⾃动创建该⽂件, 通常位
于 /var/lib/rabbitmq/.erlang.cookie 和 $HOME/.erlang.cookie

先停⽌所有节点的服务

systemctl stop rabbitmq-server

在配置 Erlang Cookie

只需将⼀个节点上的 .erlang.cookie ⽂件分别拷⻉到另外两个节点上就可以
⽐如把node3节点的⽂件, 分别拷⻉到node1和node2对应的机器上
在node3上进⾏如下操作

拷⻉node3节点的⽂件到node1
scp /var/lib/rabbitmq/.erlang.cookie root@iZ2vc7a1n9gvhfp589oav8Z:/var/lib/rabbitmq/
然后是输入node1的密码就可以了
在这里插入图片描述

拷⻉node3节点的⽂件到node2
scp /var/lib/rabbitmq/.erlang.cookie root@iZ2vc7a1n9gvhfp589oav6Z:/var/lib/rabbitmq/

然后是输入node2的密码就可以了

说白了就是同步erlang.cookie

启动节点

以后端的⽅式启动三台RabbitMQ, 启动命令
rabbitmq-server -detached

构建集群

为了将集群中的三个节点连接起来, 需要告诉另外两个节点加⼊另⼀个节点, ⽐如node1和node2加⼊
node3节点.
加⼊node3之前, 必须重置两个新加⼊的成员, 也就是node1和node2
分别在要加⼊的两个机器上, 执⾏下⾯的操作命令:

#1. 关闭RabbitMQ服务
rabbitmqctl stop_app
#2. 重置当前节点
rabbitmqctl reset
#3.加⼊节点 后⾯跟的是node3节点
rabbitmqctl join_cluster rabbit@iZ2vc7a1n9gvhfp589oav7Z
#4. 启动服务
rabbitmqctl start_app

rabbit@iZ2vc7a1n9gvhfp589oav7Z是节点名称

查看集群状态

rabbitmqctl cluster_status

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就可以都看到所有节点了

cluster搭建起来后, 如果在管理界⾯中, Nodes部分看到"Node statistics not available", 说明在该节点
上web管理插件还未启⽤
在这里插入图片描述
解决办法:
启动 rabbitmq_management 插件即可
在显⽰提⽰信息的节点上运⾏ rabbitmq-plugins enable rabbitmq_management

单机多节点

安装

启动两个节点

rabbitmqctl status #查看RabbitMQ状态

端⼝号介绍:
• 25672这是Erlang分布式节点通信的默认端⼝, Erlang是RabbitMQ的底层通信协议.
• 15672这是 Web管理界⾯的默认端⼝, 通过这个端⼝可以访问RabbitMQ的Web管理控制台, ⽤于
查看和管理消息队列.
• 5672这是 AMQP (Advanced Message Queuing Protocol) 协议的默认端⼝, ⽤于客⼾端与
RabbitMQ服务器之间的通信.

再启动两个节点

在这里插入图片描述

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detachedRABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

验证RabbitMQ启动成功

在云服务器开通 15673, 15674端⼝号
在这里插入图片描述
然后就是分别测试这些端口

搭建集群

停⽌服务并重置
停⽌⽬的是为了重置

rabbitmqctl -n rabbit2 stop_app
rabbitmqctl -n rabbit2 reset
rabbitmqctl -n rabbit3 stop_app
rabbitmqctl -n rabbit3 reset

把rabbit2, rabbit3添加到集群

在这里插入图片描述
rabbit@hcss-ecs-6fa6

rabbitmqctl -n rabbit2 join_cluster rabbit@hcss-ecs-2618rabbitmqctl -n rabbit3 join_cluster rabbit@hcss-ecs-2618

在这里插入图片描述
这个报警就忽略掉

rabbit@hcss-ecs-2618是节点名称,可以在管理界面看,也可以用命令rabbitmqctl status来查看
这样就加入成功了
在这里插入图片描述
加入成功,但是没有运行成功

重启

rabbitmqctl -n rabbit2 start_app
rabbitmqctl -n rabbit3 start_app

在这里插入图片描述

查看集群状态
rabbitmqctl cluster_status -n rabbit

在这里插入图片描述

宕机演示

在这里插入图片描述
我们添加队列,选择主节点

在这里插入图片描述
弄好集群之后,账号都是共用的

而且虚拟机也是同步共用的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述队列也是会同步的

在这里插入图片描述

这里可以发送消息
然后所有节点都有这个消息的
说明数据都是同步的

如果一个机器宕机呢
在这里插入图片描述
我们直接关闭Rabbit节点

rabbitmqctl -n rabbit stop_app

在这里插入图片描述

集群少了一个机器了

在这里插入图片描述
消息也丢失了
因为这个消息就是在这个节点上的,这个节点关了,消息就丢失了,虽然消息同步

仲裁队列介绍

每个队列都有自己的主节点
每个队列的消息就是放在自己对应的主节点上的,但是也会在从节点上显示
主节点宕机了,对应队列也完了
因为队列是没有复制的,所以主节点没了,数据就没了

RabbitMQ 的仲裁队列是⼀种基于 Raft ⼀致性算法实现的持久化、复制的 FIFO 队列. 仲裁队列提供队列复制的能⼒, 保障数据的⾼可⽤和安全性. 使⽤仲裁队列可以在 RabbitMQ 节点间进⾏队列数据的复制, 从⽽达到在⼀个节点宕机时, 队列仍然可以提供服务的效果.
仲裁队列官网

仲裁队列是RabbitMQ 3.8版本最重要的改动. 他是镜像队列的替代⽅案. 在 RabbitMQ 3.8 版本问世之前, 镜像队列是实现数据⾼可⽤的唯⼀⼿段, 但是它有⼀些设计上的缺陷, 这也是 RabbitMQ 提供仲裁队列的原因. 经典镜像队列已被弃⽤,并计划在将来版本中移除, 如果当前使⽤经典镜像队列的
RabbitMQ 安装需要迁移, 可以参考官⽅提供的迁移指南
官网

raft算法协议

论文介绍
Raft 是⼀种⽤于管理和维护分布式系统⼀致性的协议, 它是⼀种共识算法, 旨在实现⾼可⽤性和数据的持久性**. Raft 通过在节点间复制数据来保证分布式系统中的⼀致性,即使在节点故障的情况下也能保证数据不会丢失.**
在分布式系统中, 为了消除单点提⾼系统可⽤性, 通常会使⽤副本来进⾏容错, 但这会带来另⼀个问题,即如何保证多个副本之间的⼀致性?副本就是从节点
共识算法(Consensus Algorithm)就是做这个事情的, 它允许多个分布式节点就某个值或⼀系列值达成⼀致性协议. 即使在⼀些节点发⽣故障, ⽹络分区或其他问题的情况下, 共识算法也能保证系统的⼀致性和数据的可靠性.
常⻅的共识算法有: Paxos, Raft, Zab等
• Paxos: ⼀种经典的共识算法, ⽤于解决分布式系统中的⼀致性问题.
• Raft:⼀种较新的共识算法, Paxos 不易实现, raft是对Paxos算法的简化和改进, 旨在易于理解和实
现.
• Zab:ZooKeeper 使⽤的共识算法, 基于 Paxos 算法., ⼤部分和Raft相同, 主要区别是对于Leader的
任期, Raft叫做term, Zab叫做epoch, 状态复制的过程中, raft的⼼跳从Leader向Follower发送, ⽽
ZAB则相反.
• Gossip: Gossip算法每个节点都是对等的, 即没有⻆⾊之分. Gossip算法中的每个节点都会将数据改
动告诉其他节点(类似传⼋卦)

raft基本概念

Raft 使⽤ Quorum 机制来实现共识和容错, 我们将对 Raft 集群的操作必须得到⼤多数(> N/2)节点的同意才能提交.
节点指的是分布式系统中的⼀个独⽴成员
当我们向 Raft 集群发起⼀系列读写操作时, 集群内部究竟发⽣了什么呢? 我们先来简单了解⼀下.
Raft 集群必须存在⼀个主节点(Leader), 客⼾端向集群发起的所有操作都必须经由主节点处理. 所以
Raft 核⼼算法中的第⼀部分就是选主(Leader election). 没有主节点集群就⽆法⼯作, 先选出⼀个主节
点, 再考虑其它事情

主节点会负责接收客⼾端发过来的操作请求, 将操作包装为⽇志同步给其它节点, 在保证⼤部分节点都同步了本次操作后, 就可以安全地给客⼾端回应响应了. 这⼀部分⼯作在 Raft 核⼼算法中叫⽇志复制(Log replication).
因为主节点的责任⾮常⼤, 所以只有符合条件的节点才可以当选主节点.
为了保证集群对外展现的⼀致性, 主节点在处理操作⽇志时, 也⼀定要谨慎, 这部分在Raft核⼼算法中叫 安全性(Safety).Raft算法将⼀致性问题分解为三个⼦问题: Leader选举, ⽇志复制和安全性.
下⾯我们详细介绍下Raft的选主过程.

在这里插入图片描述

选主

选主(Leader election)就是在集群中抉择出⼀个主节点来负责⼀些特定的⼯作. 在执⾏了选主过程后, 集群中每个节点都会识别出⼀个特定的, 唯⼀的节点作为 leader.
节点⻆⾊
在 Raft 算法中,每个节点都处于以下三种⻆⾊之⼀
• Leader(领导者): 负责处理所有客⼾请求,并将这些请求作为⽇志项复制到所有 Follower. Leader
定期向所有 Follower 发送⼼跳消息, 以维持其领导者地位, 防⽌ Follower 进⼊选举过程.
• Follower(跟随者): 接收来⾃ Leader 的⽇志条⽬, 并在本地应⽤这些条⽬. 跟随者不直接处理客⼾请
求.
• Candidate(候选者): 当跟随者在⼀段时间内没有收到来⾃ Leader 的⼼跳消息时,它会变得不确定
Leader 是否仍然可⽤. 在这种情况下, 跟随者会转变⻆⾊成为 Candidate, 并开始尝试通过投票过程
成为新的 Leader

在正常情况下, 集群中只有⼀个 Leader, 剩下的节点都是 follower, 下图展⽰了这些状态和它们之间的转换关系

可以看出所有节点在启动时, 都是follow状态, 在⼀段时间内如果没有收到来⾃leader的⼼跳, 从
follower切换到candidate, 发起选举. 如果收到多数派(majority)的投票(含⾃⼰的⼀票) 则切换到
leader状态. Leader⼀般会⼀直⼯作直到它发⽣异常为⽌

任期

Raft 将时间划分成任意⻓度的任期(term). 每⼀段任期从⼀次选举开始, 在这个时候会有⼀个或者多个candidate 尝试去成为 leader. 在成功完成⼀次leaderelection之后,⼀个leader就会⼀直节管理集群直到任期结束. 在某些情况下, ⼀次选举⽆法选出 leader, 这个时候这个任期会以没有 leader ⽽结束(如下图t3). 同时⼀个新的任期(包含⼀次新的选举) 会很快重新开始

Term 更像是⼀个逻辑时钟(logic clock)的作⽤, 有了它,就可以发现哪些节点的状态已经过期. 每⼀个节点都保存⼀个 current term, 在通信时带上这个 term的值.
每⼀个节点都存储着⼀个当前任期号(current term number). 该任期号会随着时间单调递增. 节点之间通信的时候会交换当前任期号, 如果⼀个节点的当前任期号⽐其他节点⼩, 那么它就将⾃⼰的任期号更新为较⼤的那个值. 如果⼀个 candidate 或者 leader 发现⾃⼰的任期号过期了, 它就会⽴刻回到
follower 状态. 如果⼀个节点接收了⼀个带着过期的任期号的请求, 那么它会拒绝这次请求.
Raft 算法中服务器节点之间采⽤ RPC 进⾏通信, 主要有两类 RPC 请求:
• RequestVote RPCs: 请求投票, 由 candidate 在选举过程中发出
• AppendEntries RPCs: 追加条⽬, 由 leader 发出, ⽤来做⽇志复制和提供⼼跳机制

raft选取过程

Raft 采⽤⼀种⼼跳机制来触发 leader 选举, 当服务器启动的时候, 都是follow状态. 如果follower在
election timeout内没有收到来⾃leader的⼼跳(可能没有选出leader, 也可能leader挂了, 或者leader与
follower之间⽹络故障), 则会主动发起选举

在这里插入图片描述

步骤如下:

  1. 率先超时的节点, ⾃增当前任期号然后切换为 candidate 状态, 并投⾃⼰⼀票
  2. 以并⾏的⽅式发送⼀个 RequestVote RPCs 给集群中的其他服务器节点(企图得到它们的投票)
  3. 等待其他节点的回复

在这里插入图片描述

在这个过程中, 可能出现三种结果
a. 赢得选举, 成为Leader(包括⾃⼰的⼀票)
b. 其他节点赢得了选举, 它⾃⾏切换到follower
c. ⼀段时间内没有收到majority投票, 保持candidate状态, 重新发出选举

投票要求:
• 每⼀个服务器节点会按照 先来先服务原则(first-come-first-served)只投给⼀个 candidate.
• 候选⼈知道的信息不能⽐⾃⼰的少

接下来对这三种情况进⾏说明:
第⼀种情况: 赢得了选举之后, 新的leader会⽴刻给所有节点发消息, ⼴⽽告之, 避免其余节点触发新的选举

在这里插入图片描述
第⼆种情况: ⽐如有三个节点A B C, A B同时发起选举, ⽽A的选举消息先到达C, C给A投了⼀票, 当B的消息到达C时, 已经不能满⾜上⾯提到的第⼀个约束, 即C不会给B投票, 这时候A就胜出了. A胜出之后, 会给B,C发⼼跳消息, 节点B发现节点A的term不低于⾃⼰的term, 知道有已经有Leader了, 于是把⾃⼰转换成follower.

第三种情况: 没有任何节点获得majority投票. ⽐如所有的 follower 同时变成 candidate, 然后它们都将
票投给⾃⼰, 那这样就没有 candidate 能得到超过半数的投票了. 当这种情况发⽣的时候, 每个
candidate 都会进⾏⼀次超时响应, 然后通过⾃增任期号来开启⼀轮新的选举, 并启动另⼀轮的
RequestVote RPCs. 如果没有额外的措施, 这种⽆结果的投票可能会⽆限重复下去

为了解决上述问题,Raft 采⽤ 随机选举超时时间(randomized election timeouts) 来确保很少产⽣
⽆结果的投票,并且就算发⽣了也能很快地解决。为了防⽌选票⼀开始就被⽠分,选举超时时间是从⼀个固定的区间(⽐如,150-300ms)中随机选择。这样可以把服务器分散开来以确保在⼤多数情况下会只有⼀个服务器率先结束超时,那么这个时候,它就可以赢得选举并在其他服务器结束超时之前发送⼼跳

Raft 动画演⽰在线地址

消息复制

每个仲裁队列都有多个副本, 它包含⼀个主和多个从副本. replication factor 为 5的仲裁队列将会有 1个主副本和 4 个从副本. 每个副本都在不同的 RabbitMQ 节点上
客⼾端(⽣产者和消费者)只会与主副本进⾏交互, 主副本再将这些命令复制到从副本. 当主副本所在的节点下线, 其中⼀个从副本会被选举成为主副本, 继续提供服务.

在这里插入图片描述

消息复制和主副本选举的操作, 需要超过半数的副本同意. 当⽣产者发送⼀条消息, 需要超过半数的队列副本都将消息写⼊磁盘以后才会向⽣产者进⾏确认, 这意味着少部分⽐较慢的副本不会影响整个队列的性能.

仲裁队列使用与演示

@Bean("quorumQueue")
public Queue quorumQueue() {return QueueBuilder.durable("quorum.queue").quorum().build();
}

在这里插入图片描述
这个类型也是仲裁队列的意思
创建时选择Type为Quorum, 指定主副本

在这里插入图片描述
这里端口号随便写一个,记得开通

在这里插入图片描述

然后是发送消息

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

声明就是多了一个quorm而已

+2的意思就是有两个副本
在这里插入图片描述

leader是rabbit3,这个是因为我们配置的优先是rabbit3

在这里插入图片描述

还显示了在线成员

在这里插入图片描述
这个创建仲裁队列,node就是选择主节点,记得在有权限的虚拟机上操作

在这里插入图片描述

可以看到这个队列的主节点就是rabbit2了

在这里插入图片描述
然后发送消息都是会同步的,而且主节点宕机了也不会有事

在这里插入图片描述
我们把rabbit3停了
在这里插入图片描述
可以看出,选主了,主节点变成rabbiti了

然后重启rabbit3
在这里插入图片描述
但是rabbit不是主节点了现在

可以看到, 仲裁队列后⾯有⼀个 + 2 字样, 代表这个队列有2个镜像节点.
仲裁队列默认的镜像数为5, 即⼀个主节点, 4个从副本节点.
如果集群中节点数量少于 5, ⽐如我们搭建了3个节点的集群, 那么创建的仲裁队列就是 1 主 2 从.
如果集群中的节点数⼤于 5 个的话, 那么就只会在 5 个节点中创建出 1主 4 从

意思就是七个节点也是1主 4 从

HAProxy安装

在这里插入图片描述
我们这个项目的缺点就是5674宕机了,就运行不了了

怎么办呢
虽然集群没有问题,但是程序有问题了
有两个问题
1.如果我们访问的是node1, 但是node1挂了, 咱们的程序也会出现问题, 所以最好是有⼀个统⼀的⼊
⼝, ⼀个节点故障时, 流量可以及时转移到其他节点.
2. 如果所有的客⼾端都与node1建议连接, 那么node1的⽹络负载必然会⼤⼤增加, ⽽其他节点⼜由于
没有那么多的负载⽽造成硬件资源的浪费

这时候要负载均衡了

引⼊负载均衡之后, 各个客⼾端的连接可以通过负载均衡分摊到集群的各个节点之中, 从⽽避免前⾯的问题.

这⾥主要讨论的是如何有效地对RabbitMQ集群使⽤软件负载均衡技术,⽬前主流的⽅式有在客⼾端内
部实现负载均衡,或者使⽤HAProxy、LVS等负载均衡有软件来实现. 咱们这⾥讲⼀下使⽤HAProxy来实现负载均衡.

负载均衡不是平均分配
接下来我们来安装HAProxy, 实现负载均衡.
HAProxy(High Availability Proxy)是⼀个开源的负载均衡器和TCP/HTTP应⽤程序的代理服务器, 它被设计⽤来提供⾼可⽤性, 负载均衡和代理功能. HAProxy主要⽤于分发⽹络流量到多个后端服务器, 以提⾼⽹络的可靠性和性能

安装

#更新软件包
sudo apt-get update
#查找haproxy
sudo apt list|grep haproxy
#安装haproxy
sudo apt-get install haproxy

验证安装

#查看服务状态
sudo systemctl status haproxy
#查看版本
haproxy -v 
#如果要设置HAProxy服务开机⾃启,可以使⽤:
sudo systemctl enable haproxy

在这里插入图片描述

修改haproxy.cfg

就是怎么分发

vim /etc/haproxy/haproxy.cfg
# haproxy web 管理界面
listen statsbind *:8100       mode httpstats enablestats realm Haproxy\ Statistics    stats uri /stats auth admin:admin
# 配置负载均衡
listen rabbitmqbind *:5670mode tcpbalance roundrobinserver  rabbitmq1 127.0.0.1:5672  check inter 5000 rise 2 fall 3server  rabbitmq2 127.0.0.1:5673  check inter 5000 rise 2 fall 3server  rabbitmq3 127.0.0.1:5674  check inter 5000 rise 2 fall 3
# haproxy web 管理界⾯---》浏览器要访问的
listen stats #设置⼀个监听器, 统计HAProxy的统计信息bind *:8100 #指定了监听器绑定到的IP地址和端⼝mode http #监听器的⼯作模式为HTTPstats enable #启⽤统计⻚⾯stats realm Haproxy\ Statisticsstats uri /stats auth admin:admin #haproxy登录账号和密码
# 配置负载均衡
listen rabbitmq #设置监听器bind *:5670 #监听器绑定到的IP地址和端⼝, 也就是集群前端IP, 供producer和consumer来进⾏选择,由于5672端⼝已经默认使⽤, 这⾥选择5670端⼝mode tcp #由于RabbitMQ使⽤AMQP协议,它是⼀个基于TCP的协议,所以这⾥使⽤TCP模
式balance roundrobin #指定负载均衡策略为轮询#负载均衡中的集群节点配置,这⾥选择的rabbit节点server rabbitmq1 127.0.0.1:5672 check inter 5000 rise 2 fall 3server rabbitmq2 127.0.0.1:5673 check inter 5000 rise 2 fall 3server rabbitmq3 127.0.0.1:5674 check inter 5000 rise 2 fall 3

rabbitmq3是给haproxy 用的,不是节点名称
还有bind *:8100的8100和 bind *:5670的5670可以换的
check inter 5000 rise 2 fall 3是健康检查,就是每隔五秒钟检查一次,检查五次,但是不会放弃这个节点的

还需要开通8100和5670端口号

然后复制到vim /etc/haproxy/haproxy.cfg这个里面
拼接进去

重启haproxy

sudo systemctl restart haproxy

查看HAProxy

http://124.71.229.73:8100/
在这里插入图片描述

rabbit3就是一个停掉的状态
在这里插入图片描述
在这里插入图片描述
这样就变好了

HAProxy使用

在这里插入图片描述
这里改成5670就可以了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置的5670是HAProxy的一个端口号
在这里插入图片描述
发现成功发送了
现在把rabbit节点停掉
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继续发送消息
在这里插入图片描述
发现还是可以发送的
说明有一个节点宕机不影响HAProxy的使用,不影响集群的使用,不影响程序的使用
如何HAProxy挂了呢
那么所有都访问不了了
因为配置的端口就是HAProxy的-

如果HAProxy主机突然宕机或者⽹卡失效,那么虽然RabbitMQ集群没有任何故障, 但是对于外界的客
⼾端来说所有的连接都会被断开,结果将是灾难性的. 确保负载均衡服务的可靠性同样显得⼗分重要.
通常情况下, 会使⽤Keepalived 等⾼可⽤解决⽅案对haproxy做主备, 在HAProxy主节点故障时⾃动
将流量转移到备⽤节点

总结

相关文章:

RabbitMQ-运维

文章目录 前言运维-集群介绍多机多节点单机多节点 多机多节点下载配置hosts⽂件配置Erlang Cookie启动节点构建集群查看集群状态 单机多节点安装启动两个节点再启动两个节点验证RabbitMQ启动成功搭建集群把rabbit2, rabbit3添加到集群 宕机演示仲裁队列介绍raft算法协议 raft基…...

101 alpha——8 学习

alpha (-1 * rank(((sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)),这里我们操作符都明白,现在来看金融意义 金融意义 里层是这个 (sum(open, 5) * sum(returns, 5)) - delay((sum(open, 5) * sum(returns, 5)), 10 这里是两个相减…...

YOLOv1模型架构、损失值、NMS极大值抑制

文章目录 前言一、YOLO系列v11、核心思想2、流程解析 二、损失函数1、位置误差2、置信度误差3、类别概率损失 三、NMS(非极大值抑制)总结YOLOv1的优缺点 前言 YOLOv1(You Only Look Once: Unified, Real-Time Object Detection)由…...

webpack代理天地图瓦片

1.安装 npm install http-proxy-middleware --save-dev2.webpack代理 const { createProxyMiddleware } require(http-proxy-middleware);module.exports {devServer: {port: 8080, // 改为你需要的端口https: false, // 如果你启用了 https,这里要对应before(a…...

RabbitMQ-高级特性1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消息确认机制介绍手动确认方法代码前言代码编写消息确认机制的演示自动确认automanual 持久化介绍交换机持久化队列持久化消息持久化 持久化代码持久化代码演示…...

Git_idea界面进行分支合并到主分支详细操作

最近闲着也是闲着,再来讲一下Git合并分支的操作吧。基本上咱们干开发的都会用到git吧,比如我们在大数据开发中,有一个主分支master,还有其他的诸多分支dev1.1.0,dev1.2.0......等。 以我近期开发的代码来讲,在开发分支开发完毕后&…...

MOS关断时波形下降沿振荡怎么解决

问题阐述: 一个直流电机控制电路,部分原理图如下: 波形如下: 原因分析: L:线路寄生电感(如PCB走线、MOS管引脚电感)。 C:MOS管输出电容(Coss)、…...

【Day 23】HarmonyOS开发实战:从AR应用到元宇宙交互

一、空间感知开发实战 1. 环境语义建模(NEXT增强) // 构建3D空间语义地图 spatialMapper.createMap({mode: SEMANTIC, // 语义分割模式objectTypes: [WALL, FLOOR, TABLE, DOOR ],onUpdate: (mesh) > {this.arScene.updateMesh(mesh) // 实时更新3D…...

ZYNQ笔记(十九):VDMA VGA 输出分辨率可调

版本:Vivado2020.2(Vitis) 任务:以 VDAM IP 为核心实现 VGA 彩条图像显示,同时支持输出分辨率可调。 (PS 端写入彩条数据到 DDR 通过 VDMA 读取出来输出给 VGA 进行显示) 目录 一、介绍 二、硬…...

江西同为科技有限公司受邀参展2025长江流域跨博会

江西同为科技有限公司是一家专注于电力保护设备研发与生产的高新技术企业,深耕于电气联接与保护领域,同时产品远销海外,在国内国际市场与客户保持长期稳定的合作。江西同为在跨境电子商务领域运营多年,有着深厚、丰富的行业经验&a…...

2025 SD省集总结

文章目录 DAY1时间安排题解T1. 花卉港湾T2. 礎石花冠T3.磷磷开花 DAY2时间安排题解T1. MEX 求和T2.最大异或和T3.前缀最值 DAY3时间安排题解T1.重建: 地下铁道T2.走过安眠地的花丛T3.昔在、今在、永在的题目 DAY4时间安排题解T1.崩坏世界的歌姬T2.色彩褪去之后T3.每个人的结局 …...

代码随想论图论part06冗余连接

图论part06 冗余连接 代码随想录 冗余边就是已经边已经在并查集里了,从图的角度来说构成了环(冗余连接2要用到这个概念) 代码其他部分为:并查集初始化,查根,判断是否在集合里,加入集合 冗余…...

SCADA|KIO程序导出变量错误处理办法

哈喽,你好啊,我是雷工! 最近在用KingSCADA3.52版本的软件做程序时,在导出变量进行批量操作时遇到问题,现将解决办法记录如下。 以下为解决过程。 01 问题描述 在导出KIO变量时,选择*.xls格式和*.xlsx时均会报错: 报如下错误: Unknown error 0x800A0E7A ADODB Connectio…...

AUTOSAR图解==>AUTOSAR_SWS_V2XBasicTransport

AUTOSAR V2X 基础传输协议 (V2XBasicTransport) 详解 AUTOSAR经典平台中V2X通信基础传输层的规范解析 目录 1. 引言与功能概述 1.1 架构概述1.2 功能概述 2. V2XBtp模块架构 2.1 AUTOSAR架构中的V2XBtp位置2.2 主要组件与职责 3. V2XBtp模块接口 3.1 接口结构3.2 数据类型和依…...

从代码学习深度学习 - 区域卷积神经网络(R-CNN)系列 PyTorch版

文章目录 前言R-CNNFast R-CNN兴趣区域汇聚层 (RoI Pooling)代码示例:兴趣区域汇聚层 (RoI Pooling) 的计算方法Faster R-CNNMask R-CNN双线性插值 (Bilinear Interpolation) 与兴趣区域对齐 (RoI Align)兴趣区域对齐层的输入输出全卷积网络 (FCN) 的作用掩码输出形状总结前言…...

RT-THREAD RTC组件中Alarm功能驱动完善

使用Rt-Thread的目的为了更快的搭载工程,使用Rt-Thread丰富的组件和第三方包资源,解耦硬件,在更换芯片时可以移植应用层代码。你是要RTT的目的什么呢? 文章项目背景 以STM32L475RCT6为例 RTC使用的为LSE外部低速32 .756k Hz 的…...

VSCode如何解决打开html页面中文乱码的问题

VSCode如何解决打开html页面中文乱码的问题 (1)打开扩展商店: (2)点击左侧菜单栏的扩展图标(或使用快捷键CtrlShiftX)。 (3)搜索并安装插件: …...

Java学习手册:单体架构到微服务演进

一、单体架构概述 单体架构是一种传统的软件架构风格,所有的功能模块都构建在一个统一的部署单元中。这种架构的优点是简单直接,便于开发、测试和部署。然而,随着应用规模的增长和需求的复杂化,单体架构的弊端逐渐显现&#xff0…...

android动态调试

在 Android 应用逆向工程中,动态调试 Smali 代码是分析应用运行时行为的重要手段。以下是详细的步骤和注意事项: 1. 准备工作 工具准备: Apktool:反编译 APK 生成 Smali 代码。Android Studio/IntelliJ IDEA:安装 smal…...

Google的A2A和MCP什么关系

作者:蛙哥 原文:https://zhuanlan.zhihu.com/p/1893738350252385035 Agent2Agent和MCP在功能上各有侧重,A2A专注于Agent之间的协作,MCP关注于Agent与外部数据源的集成。因此,MCP并不完全覆盖 A2A 的能力场景&#xff0…...

计算几何图形算法经典问题整理

几何算法经典问题 文章目录 几何算法经典问题一、几何基础问题1. 判断两条线段是否相交2. 判断点是否在多边形内3. 凸包计算4. 判断一个有序点集的方向(顺时针 or 逆时针)5. 求多边形面积和重心 二、 高阶图形问题6. 最小外接矩形(Minimum Bo…...

系分论文《论多云架构治理的分析和应用》

系统分析师论文范文系列 【摘要】 2022年3月,我所在公司承接了某金融机构“混合云资源管理与优化平台”的设计与实施项目。我作为系统分析师,主导了多云架构的规划与治理工作。该项目旨在构建一个兼容多家公有云及私有云资源的统一管理平台,解…...

(三)毛子整洁架构(Infrastructure层/DapperHelper/乐观锁)

文章目录 项目地址一、Infrastructure Layer1.1 创建Application层需要的服务1. Clock服务2. Email 服务3. 注册服务 1.2 数据库服务1. 表配置Configurations2. Respository实现3. 数据库链接Factory实现4. Dapper的DataOnly服务实现5. 所有数据库服务注册 1.3 基于RowVersion的…...

Femap许可使用数据分析

在当今竞争激烈的市场环境中,企业对资源使用效率和成本控制的关注日益增加。Femap作为一款业界领先的有限元分析软件,其许可使用数据分析功能为企业提供了深入洞察和智能决策的支持。本文将详细介绍Femap许可使用数据分析工具的特点、优势以及如何应用这…...

进入虚拟机单用户模式(Linux系统故障排查)

故障概述 虚拟机备份或者克隆后,无法通过编辑虚拟机IP,且忘记虚拟机密码,无法通过登录控制台修改虚拟机网络配置: 解决步骤 重启虚拟机并进入单用户模式修改网络配配置、设置密码等、大致两个步骤: 1、重启虚拟机 2、进…...

Python 数据分析与可视化:开启数据洞察之旅(5/10)

一、Python 数据分析与可视化简介 在当今数字化时代,数据就像一座蕴藏无限价值的宝藏,等待着我们去挖掘和探索。而 Python,作为数据科学领域的明星语言,凭借其丰富的库和强大的功能,成为了开启这座宝藏的关键钥匙&…...

7、三维机械设计、装配与运动仿真组件 - /设计与仿真组件/3d-mechanical-designer

76个工业组件库示例汇总 三维机械设计、装配与运动仿真通用组件 这是一个基于Three.js开发的三维机械设计、装配与运动仿真通用组件,可以实现工业机器人关节结构设计与运动仿真功能。 功能特点 直观的三维设计界面:提供基于WebGL的3D设计空间&#x…...

传统数据展示 vs 可视化:谁更打动人心?

数据,每天都在我们身边流动:从你手机里的健康步数,到企业财报中的营收增长,再到国家发布的经济指标。但问题是——你怎么“看”这些数据? 过去,我们习惯用表格、文字和报告来展示数据,这种方式…...

CSdiy java 07

1 || 运用逻辑运算符 在 Java 代码里,|| 是逻辑或(Logical OR)运算符,它的作用是对两个布尔表达式进行逻辑或运算。下面结合具体的代码片段来详细说明: 一、|| 的基本含义 在 Java 中,|| 运算符遵循以下…...

从零打造企业级Android木马:数据窃取与远程控制实战

简介 木马病毒已从简单的恶意软件演变为复杂的攻击工具,尤其在2025年企业级攻击中,木马病毒正成为黑客组织的主要武器之一。 本文将深入探讨如何制作具备数据窃取和远程控制功能的Android木马,从基础原理到企业级防御绕过技术,同时提供详细的代码实现,帮助开发者理解木马…...

金仓数据库永久增量备份技术原理与操作

先用一张图说明一下常见的备份方式 为什么需要永久增量备份 传统的数据库备份方案通常是间隔7天对数据库做一次全量备份(完整备份),每天会基于全量备份做一次增量备份,如此循环,这种备份方案在全备数据量过大场景下…...

为特定领域微调嵌入模型:打造专属的自然语言处理利器

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...

SQLite 转换为 MySQL 数据库

一、导出 SQLite 数据库 1. 使用 SQLite 命令行工具 • 打开终端(在 Linux 或 macOS 上)或命令提示符(在 Windows 上)。 • 输入sqlite3 your_database_name.db(将 your_database_name.db 替换为你的 SQLite 数据库…...

cnas软件检测实验室质量管理体系文件思维导图,快速理清全部文件

软件检测实验室在申请CNAS资质时,需要根据认可文件的要求,建立实验室质量管理体系,明晰地展示组织架构、合理地安排人员岗位职责和能力要求、全面地覆盖认可文件要求的质量要素。这是一项非常庞大的工作,涉及到的文件类型非常多&a…...

31【干货】Arcgis属性表常用查询表达式实战大全

GIS数据属性表的查询在工作中常常用到,本文对常见的基本运算符进行详细介绍,并以实例的形式,针对SQL查询常用的语句进行实例分类解析,大家可以结合项目需求,自行更改对应的语句,提高工作效率。特别注意文末…...

uniapp 不同路由之间的区别

在UniApp中,路由跳转是实现页面导航的核心功能,常见的路由跳转方式包括navigateTo、redirectTo、reLaunch、switchTab和navigateBack。这些方法在跳转行为和适用场景上有所不同。 一、路由跳转的类型与区别 1. uni.navigateTo(OBJECT) 特点&#xff1…...

前台--Android开发

在 Android 开发中,“前台(Foreground)” 是一个非常重要的概念,它用于描述当前用户正在与之交互的组件或应用状态。理解“前台”的含义有助于更好地管理资源、生命周期和用户体验。 ✅ 一、什么是前台? 简单定义&…...

python: update() 函数的用法和例子

Python 中 update() 函数的用法和例子 在 Python 中,update() 函数通常用于字典(dictionary)对象,以更新其键值对。该函数会将另一个字典或可迭代对象中的元素添加到当前字典中,如果键已经存在,则覆盖对应…...

动态规划-62.不同路径-力扣(LeetCode)

一、题目解析 机器人只能向下或向左,要从Start位置到Finish位置。 二、算法原理 1.状态表示 我们要求到Finish位置一共有多少种方法,记Finish为[i,j],此时dp[i,j]表示:到[i,j]位置时,一共有多少种方法,满…...

排序算法总结

在讲解排序算法之前,我们需要先了解一下排序 所谓排序,就是将数据按照我们的想法将其按照一定规律组合在一起 稳定性:一组数据中的数据是否在排序前后都保持的一定的前后顺序关系,比如在排序前a[3]2 a[5]2,这时他们有着…...

kafka学习笔记(四、生产者、消费者(客户端)深入研究(三)——事务详解及代码实例)

1.事务简介 Kafka事务是Apache Kafka在流处理场景中实现Exactly-Once语义的核心机制。它允许生产者在跨多个分区和主题的操作中,以原子性(Atomicity)的方式提交或回滚消息,确保数据处理的最终一致性。例如,在流处理中…...

【Git】查看tag

文章目录 1. 查看当前提交是否有tag2. 查看最近的tag3. 查看所有tag 有时候需要基于某个tag拉分支,记录下怎么查看tag。 1. 查看当前提交是否有tag git tag --points-at HEAD该命令可直接检查当前提交(HEAD)是否关联了任何tag。 若当前提交…...

开源数字人框架 AWESOME - DIGITAL - HUMAN:技术革新与行业标杆价值剖析

一、项目核心价值:解锁数字人技术新境界 1. 技术普及:降低准入门槛,推动行业民主化 AWESOME - DIGITAL - HUMAN 项目犹如一场技术春雨,为数字人领域带来了普惠甘霖。它集成了 ASR、LLM、TTS 等关键能力,并提供模块化扩展接口,将原本复杂高深的数字人开发流程,转化为一…...

Android系统架构模式分析

本文系统梳理Android系统架构模式的演进路径与设计哲学,希望能够借此探索未来系统的发展方向。有想法的同学可以留言讨论。 1 Android层次化架构体系 1.1 整体分层架构 Android系统采用五层垂直架构,各层之间通过严格接口定义实现解耦: 应用…...

【MYSQL错误连接太多】

com.mysql.cj.exceptions.CJException: null, message from server: "Host 192.168.0.200 is blocked because of many connection errors; unblock with mysqladmin flush-hosts"方法一:通过配置文件永久更改 找到你的 MySQL 配置文件(通常…...

C23 与 MISRA C:2025:嵌入式 C 语言的进化之路

引言 在 Rust、Go 等现代语言蓬勃发展的今天,C 语言依然以 27.7% 的 TIOBE 指数(2024 年 6 月数据)稳居编程语言前三甲。其核心竞争力不仅在于高效的底层控制能力,更在于持续进化的标准体系。2024 年发布的 C23(ISO/I…...

HunyuanCustom, 腾讯混元开源的多模态定制视频生成框架

HunyuanCustom是一款由腾讯混元团队开发的多模态驱动定制视频生成框架,能够支持图像、音频、视频和文本等多种输入方式。该框架专注于生成高质量的视频,能够实现特定主体和场景的精准呈现。 HunyuanCustom是什么 HunyuanCustom是腾讯混元团队推出的一种…...

el-menu 折叠后小箭头不会消失

官方示例 <template><el-radio-group v-model"isCollapse" style"margin-bottom: 20px"><el-radio-button :value"false">expand</el-radio-button><el-radio-button :value"true">collapse</el-ra…...

Spring Boot中的拦截器!

每次用户请求到达Spring Boot服务端&#xff0c;你是否需要重复写日志、权限检查或请求格式化代码&#xff1f;这些繁琐的“前置后置”工作让人头疼&#xff01;好在&#xff0c;Spring Boot拦截器如同一道智能关卡&#xff0c;统一处理请求的横切逻辑&#xff0c;让代码优雅又…...

Docker宿主机IP获取

1.Linux: ip addr show docker0 2. macOS/Windows 环境&#xff08;Docker Desktop&#xff09; 在Docker Desktop中&#xff0c;宿主机&#xff08;你的物理机&#xff09;通过host.docker.internal主机名暴露给容器&#xff0c;无需手动查找IP。 方法1&#xff1a;在容器…...