首页 > 其他分享 >RabbitMQ-集群

RabbitMQ-集群

时间:2025-01-13 22:22:34浏览次数:1  
标签:队列 RabbitMQ -- rabbitmqctl 集群 节点

RabbitMQ集群----主备关系,在运行的时候,如果非主要节点宕机,程序操作 不受影响; 如果主节点宕机了, 程序会中断操作。 而Rabbitmq集群,会马上让没有宕机的节点参选,选出新的主要节点。 程序重试的时候,会进入到新的节点中执行。 历史消息不受影响的。

基于Docker构建RabbitMQ集群

1.启动多个RabbitMQ节点

使用Docker启动3个RabbitMQ节点,目标如下表所示:

2.命令启动

节点1:

docker run -d --hostname my-rabbit1 --name rabbit1 -p 5672:5672 -p 15672:15672 -e
RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

节点2:

docker run -d --hostname my-rabbit2 --name rabbit2 -p 5673:5672 -p 15673:15672 -e
RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 rabbitmq:management

节点3:

docker run -d --hostname my-rabbit3 --name rabbit3 -p 5674:5672 -p 15674:15672 -e
RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 --link rabbit2:my-rabbit2
rabbitmq:management

注意:由于Erlang节点间通过认证Erlang cookie的方式来允许互相通信,所以 RABBITMQ_ERLANG_COOKIE必须设置为相同的。 启动完成之后,使用docker ps命令查看运行情况,确保RabbitMQ都已经启动。

3.加入集群

内存节点和磁盘节点的选择:

每个RabbitMQ节点,要么是内存节点,要么是磁盘节点。内存节点将所有的队列、交换器、绑定、用 户等元数据定义都存储在内存中;而磁盘节点将元数据存储在磁盘中。单节点系统只允许磁盘类型的节 点,否则当节点重启以后,所有的配置信息都会丢失。如果采用集群的方式,可以选择至少配置一个节 点为磁盘节点,其余部分配置为内存节点,,这样可以获得更快的响应。所以本集群中配置节点1位磁 盘节点,节点2和节点3位内存节点。

集群中的第一个节点将初始元数据代入集群中,并且无须被告知加入。而第2个和之后加入的节点将加 入它并获取它的元数据。要加入节点,需要进入Docker容器,重启RabbitMQ。

设置节点1:

docker exec -it rabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

设置节点2:

docker exec -it rabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@my-rabbit1
rabbitmqctl start_app
exit

设置节点3:

docker exec -it rabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@my-rabbit1
rabbitmqctl start_app
exit

节点设置完成之后,在浏览器访问43.142.250.100:15672、43.142.250.100:15673和 43.142.250.100:15674中任意一个,都会看到RabbitMQ集群已经创建成功。

4.配置镜像队列

镜像队列工作原理:在非镜像队列的集群中,消息会路由到指定的队列。当配置为镜像队列之后,消息 除了按照路由规则投递到相应的队列外,还会投递到镜像队列的拷贝。也可以想象在镜像队列中隐藏着 一个fanout交换器,将消息发送到镜像的队列的拷贝。

进入任意一个RabbitMQ节点,执行如下命令:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

可以设置镜像队列,"^"表示匹配所有队列,即所有队列在各个节点上都会有备份。在集群中,只需要 在一个节点上设置镜像队列,设置操作会同步到其他节点。

rabbitmqctl cluster_status

案例代码:

ConnectionFactory factory = new ConnectionFactory();
factory.AutomaticRecoveryEnabled = true;//如果connection挂掉是否重新连接
factory.TopologyRecoveryEnabled = true;//连接恢复后,连接的交换机,队列等是否一同恢复

factory.UserName = UrlConfig.User;//用户名
factory.Password = UrlConfig.Password;//密码 

var amqpTcpEndpointList = new List<AmqpTcpEndpoint>()
{
    new AmqpTcpEndpoint() { HostName="43.142.250.100", Port=5672},
    new AmqpTcpEndpoint() { HostName="43.142.250.100", Port=5673},
    new AmqpTcpEndpoint() { HostName="43.142.250.100", Port=5674},
};
using (var connection = factory.CreateConnection(amqpTcpEndpointList))
{
    using (IModel channel = connection.CreateModel())
    {
        #region 声明路由和队列  
        //支持持久化队列:durable: true
        channel.QueueDeclare(queue: "JoinClusterQueue", durable: true,
            exclusive: false, autoDelete: false, arguments: null);

        //支持持久化交换机durable: true
        channel.ExchangeDeclare(type: ExchangeType.Fanout, exchange: "JoinClusterExChange",
            durable: true, autoDelete: false, arguments: null);
        channel.QueueBind(queue: "JoinClusterQueue", exchange: "JoinClusterExChange",
            routingKey: string.Empty);
        #endregion

        //表达发送的是持久化消息
        var props = channel.CreateBasicProperties();
        props.Persistent = true;

        for (int i = 1; true; i++)
        {
            string msg = $"持久化消息--持久化队列===消息入队确认=={i}";
            byte[] bytes = Encoding.UTF8.GetBytes(msg);
            channel.BasicPublish("JoinClusterExChange", string.Empty, props, bytes);

            Console.WriteLine($"已发送:{msg}");

            Thread.Sleep(200);
        }
    }
}

标签:队列,RabbitMQ,--,rabbitmqctl,集群,节点
From: https://www.cnblogs.com/nullcodeworld/p/18669528

相关文章

  • RabbitMQ-优先级队列及消息配置
    优先级队列C#数据类型queue----先进先出RabbitMQ---队列-----默认也是先进先出~~RabbitMQ设置优先级----可以配置让消费顺序,不按照先进先出的默认规则;给定的优先级---最终体现在消费者;优先级越高,消费的时候,就优先消费。就在前面消费案例:设置{"vip1","hello2","wor......
  • RabbitMQ 高可用方案:原理、构建与运维全解析
    文章目录前言:1集群方案的原理2RabbitMQ高可用集群相关概念2.1设计集群的目的2.2集群配置方式2.3节点类型3集群架构3.1为什么使用集群3.2集群的特点3.3集群异常处理3.4普通集群模式3.5镜像集群模式前言:在实际生产中,RabbitMQ常以集群方案部署。因选用它......
  • CentOS7下Hadoop集群分布式安装详细图文教程
    1、集群规划主机角色DSS20NameNode  DataNode ResourceManager NodeManagerDSS21SecondaryNameNode NameNode     NodeManagerDSS22DataNode     NodeManager1.1、环境准备1.1.1 关闭防火墙#查看防火墙状态firewall-cmd......
  • Kafka 是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时
    Kafka集群是什么?Kafka是一个分布式流式平台,主要用于处理大规模、高吞吐量的消息传递、日志收集和实时数据流。Kafka集群是由多个Kafka服务器(称为Broker)组成的,它们共同工作以实现消息的高可用性、可靠性、可扩展性和容错性。Kafka集群的目的是确保消息的持久化和高效传输,同......
  • Zookeeper 是一个开源的分布式协调服务,用于在分布式系统中提供一致性、可靠性和协调功
    什么是Zookeeper集群?Zookeeper是一个开源的分布式协调服务,用于在分布式系统中提供一致性、可靠性和协调功能。它常常被用于管理配置、同步服务和命名注册等任务。Zookeeper集群是由多个Zookeeper实例(节点)组成的集群,这些节点共同工作,以确保系统的高可用性、容错性和一致性。......
  • ZooKeeper集群&kafka集群安装
    kafka的管理需要借助zookeeper完成,所以要先安装好zookeeper集群。一、zookeeper集群安装1.1集群规划在主机node1、node2和node3三个节点上都部署Zookeeper。1.2解压安装官网下载地址:https://zookeeper.apache.org/这里我安装的版本为3.5.7。在node1服务器解压Zook......
  • MySQL 8.0.27 集群搭建——基于MGR方式的一主两从架构
    数据库:MySQL8.0.27安装包:mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar系统:rhel7.364位 1、准备工作说明:1.1至1.3均需在三台服务器执行.1.1、修改hosts文件--在hosts中设置hostname与IP映射绑定关系.[root@MySQL-827MGR-Master~]#cat<<EOF>>/etc/hosts192.168.133.11......
  • Hive4.0.1集群安装部署(Hadoop版本为3.3.6)(详细教程)
    前置环境​​​Linux环境Zookeeper集群安装(详细教程)-CSDN博客HadoopHA高可用集群3.3.6搭建(详细教程)-CSDN博客MySQL8.0.40离线安装(详细教程)_mysql8.0.40ftp-CSDN博客Hadoop3.3.6官网下载链接地址部署规划服务器节点MetaStoreHiveServer2bigdata01√bigd......
  • [微服务]redis分片集群搭建与优化
    介绍主从模式可以解决高可用、高并发读的问题。但依然有两个问题没有解决:海量数据存储高并发写要解决这两个问题就需要用到分片集群了。分片的意思,就是把数据拆分存储到不同节点,这样整个集群的存储数据量就更大了。Redis分片集群的结构如图:分片集群特征:集群中有多个ma......
  • ubuntu20.04部署k8s集群(基于docker)
    Ubuntu部署k8s集群(基于docker)本文总结一下部署k8s集群踩的坑以及部署流程。相关版本:docker-v27.4.1、cri-dockerd-v0.3.16、kubeadm-v1.28.15注意本人的机器是arm64的,x86已经amd64的可以参考目前仅完成至基础配置阶段(到集群初始化)k8s介绍Kubernetes是一个开源的容器编排......