RabbitMQ集群

一主一从或一主多从都为集群

测试模式采用一主一从模式

测试主机两台win7虚拟机

首先都安装RabbitMQ和Erlang,以及都加用户并授权用户

具体安装步骤参考之前的文章:https://www.cnblogs.com/CodeHack-V/p/14507502.html

HOSTS由于被隐藏 所以HOSTS直接下的工具(HostsEditor)进行编辑的

主RabbitMQ服务器 主机名:A IP:192.168.3.182

主机名

网卡配置

 从RabbitMQ服务器 主机名:B IP:192.168.3.183

主机名

 网卡配置

 测试情况下 两台虚拟机都关闭防火墙,生产环境不建议这么干

两台HOSTS都编辑为

192.168.3.182 A 

192.168.3.183 B

指定IP对应的主机名

A的HOSTS

B的HOSTS

 测试是否能互相通信

在A主机Ping B

在B主机Ping A

 RabbitMQ集群依靠Erlang集群通信 而Erlang依靠.erlang.cookie的通信

集群里面的RabbitMQ主机.erlang.cookie都要一致,才能配置集群

在Windows下 .erlang.cookie有两份,也要保持一致,如果是Linux以具体数据为准

C:\Windows\System32\config\systemprofile

C:\Users\用户下

 在我们这里A为主RabbitMQ,B为从RabbitMQ,所以我们把A主机的.erlang.cookie替换到B主机的两个文件,然后B主机重启防止.erlang.cookie占用旧.erlang.cookie,导致cookie不一致而报错

启动B主机上的RabbitMQ

 关闭A主机主节点

 在A主机RabbitMQ节点添加B主机RabbitMQ节点

启动A主机RabbitMQ节点

 分别登陆A主机 B主机查看节点情况

A主机

 

B主机

 

 可以看到节点已经添加上了,并且A主RabbitMQ节点为内存模式 B从RabbitMQ节点为硬盘模式

RAM为内存模式 disc为硬盘模式

整个集群中 最少需要一个硬盘模式的节点储存数据

那么我们借助上一篇文章的源码稍加改动测试集群

RabbitMQSend生产者Program.cs源码原样不变 还是发送测试的100条消息

RabbitMQReceive消费者Program.cs稍加改动 改为命令行参数动态消费指定RabbitMQ服务器的消息队列

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;

namespace RabbitMQReceive
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectionFactory factory = new ConnectionFactory();
            factory.HostName = args[0];//RabbitMQ主机
            factory.UserName = "admin";//用户名
            factory.Password = "admin";//密码
            using (IConnection Connection = factory.CreateConnection())//连接服务器
            {
                using (IModel Model = Connection.CreateModel())//创建通道
                {
                    Model.QueueDeclare("Test", false, false, false, null);//连接名称为Test的消息队列
                    EventingBasicConsumer consumer = new EventingBasicConsumer(Model);//消费者
                    Model.BasicConsume("Test", true, consumer);//消费消息
                    consumer.Received += (model, Message) =>//委托消费者接收事件
                    {
                        //model为通道 Message为消费者消息
                        byte[] Body = Message.Body.ToArray();//消息正文
                        string NewMessage = Encoding.UTF8.GetString(Body);
                        Console.WriteLine($"Receive:{NewMessage}");
                    };
                    Console.ReadLine();
                }
            }
        }
    }
}

然后运行消费者消费主RabbitMQ节点队列

 此时生产者还没发送消息,那么我们现在发送消息

可以看到消费者依旧通过主节点消费完所有消息

 那我们现在改为消费从节点

 之前生产者发送的消息已经被消费主节点的时候消费完了,此时依旧没消息队列

那我们在发送一百个测试消息队列

这里我们发现 通过从节点 也能消费主节点的消息队列

 那我们在转为主节点消费看看 里面的消息是否还在

证明主节点已经没有消息可以消费了,也就是说,生产者发送给主节点的消息队列,消费者通过消费主节点或者从节点都可以消费主节点里面的消息队列,而且消息队列不会重复消费

现在我们生产者给从节点发送消息队列看看

 

 

 在看看能不能通过主节点消费从节点的消息队列

 依旧能够消费

测试生产者在从节点发送消息队列,然后两个消费者分别消费两个节点

 

 生产者给从节点发送测试消息队列

 此时RabbitMQ集群把从节点的消息队列平均分发给了两个消费者

测试生产者给主节点发送消息队列,然后用两个消费者实例同时消费两个节点

 

 然后消费者继续发送100条测试消息队列

 可以看到 RabbitMQ集群依旧自动把消息队列平均分配给了两个消费者 而且消息也不重复消费

这样达到了整个集群的负载均衡的效果,我这里测试用的,一主一从,根据业务需要,还可以配置一主多从的集群

posted @ 2021-03-10 19:56  昊天888  阅读(262)  评论(0)    收藏  举报