Windows 下搭建RabbitMQ集群

时间:2021-08-02 05:46:09

RabbitMQWindows集群操作

1、下载Erlang程序,可以在这个地方找到最新的Erlang/OTP

2、安装rabbitmq-server-windows程序,下载。

3、分别在每个集群机器上面配置hosts文件,里面是机器的IP地址和机器的名称

例如:192.168.1.26 rabbitmqwin1

192.168.1.40 rabbitmqwin2

4、集群时需要保证erlang的cookie各个机器一致,否则无法通信。

任意选择一台集群中的机器,进入到C:\Windows目录下,找到.erlang.cookie文件,复制该文件并替换其他各个机器,再把该文件复制到每台集群机器的目录:C:\Users\Administrator  下。保证所有机器下面的这两个目录下的cookie文件内容一致。

5、命令行方式

将各节点的rabbitmq服务开启: rabbitmq-service start 

选择其中一个节点将其停止: rabbitmqctl stop_app

将步骤2中的机器加入集群: rabbitmqctl join_cluster (--ram) rabbit@hostname

(ram 为内存节点, 默认情况下为disc磁盘节点) 注意此时的node在windows机器下面是大写的。

开启rabbitmq服务: rabbitmqctl start_app

查看集群状况: rabbitmqctl cluster_status

*以上是单个节点加入集群的方式,只要一个节点加入到集群中的任何一个节点,该节点就算是加入到了集群中.


6、自动化集群

2  关闭所有节点的服务: rabbitmqctl stop_app, rabbitmqctl reset, rabbitmqctl stop

2  在各节点机器下C:\Users\Administrator\AppData\Roaming\RabbitMQ 创建rabbitmq.config文件, 内容为

[{rabbit, [{cluster_nodes, {[‘rabbit@hostname‘, ‘rabbit@hostname‘], disc}}]}].

该配置方式和命令行一样,可以一次将所有节点都写在配置中,也可以只写集群中的一个节点,disc也可改为ram

2  启动所有节点: rabbitmq-server –detached

2  查看集群状况: rabbitmqctl cluster_status

在镜像状况下查看队列的Mater-Slave关系

rabbitmqctl -n [nodename] list_queues name pid slave_pids

在镜像状况下查看队列的Mater-Slave关系及队列的同步状况

rabbitmqctl -n [nodename] list_queues name pid slave_pids synchronised_slave_pids

更多命令请看:


Windows下的rabbitmq的开启与停止也可以在计算机服务中进行手动的开启和停止的。尽量不要用自带的服务,可以使其停止。


erlang profiler tool:

C:\Program Files\erl5.10.1\lib\observer-1.3\priv\bin

命令:etop  perf -node rabbit@RABBITMQWIN2 -tracing off



队列镜像


镜像的意义:

因为集群只是将各个node的元数据复制到各个node,但是每个node的queue及其内容不会复制过去,所以当发生某个node down了,那么这个节点的队列内容就丢失了,而镜像则是将queue中的内容复制到设定的其他node中。

Mirrio Queue Behavior

2.1    一个队列镜像会在各个node中建立master-slave队列,一旦master中的队列接   收到了消息,则该消息会同步到slave的队列中,并且保证顺序一致。

2.2    如果镜像队列的slave node挂了,那么client不会有什么影响或收到通知

2.3    如果镜像队列的master node挂了,那么其中一个slave会自动接替为master,并会发生如下变化:

2.3.1          最老的那个slave会被提升为master,因为它最有可能包含最多的master消息,如果之前没有同步,则master中的部分消息会丢失.

2.3.2          Slave node会认为之前所有的consumers突然断线,结果就是它会将所有已发出但是还没收到确认的消息重新发送出去,可能consumers已经接收过了,但是对于new master来说,它别无选择。

2.3.3          如果consumer client支持Consumer Cancellation Notifications扩展,那么将会接收一个通知,表明他们订阅的镜像队列已经突然取消了。这时应该re-consume new master的镜像队列,需要重新和存活下来的集群node建立连接。

2.3.4          对于re-comsume 来说,有可能会接收到之前接收过的消息

2.4    Publish client 仍然会接收到confirm消息即便是master(或任何slave)在消息发布后和confirm消息在发送过程中fail了。

2.5    镜像队列支持Confirm和Transactions,当镜像队列中所有的节点的队列都得到应用之后,confirm或transactions才会被认为成功。

未同步的Slaves

一个新的node加入到cluster后,该node中的队列是空的,不包含任何已有的队列中的内容,当前,没有对已有内容的同步协议。只能从加入之后开始同步接收到的消息。当之前已有的消息都被取走以后,那么该队列才会被认为是和master中的相关队列同步了。所以建议在配置镜像之前就先将各个node加入到cluster,这样就能确保所有Node中的镜像队列都是已同步的。

可以通过以下命令查看已同步的slaves:

Rabbitmqctl list_queues name slave_pids synchronised_slave_pids

开始和停止node