Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装

接上一篇:Centos7、Erlang-21.3、RabbitMQ-3.8.0 单机版安装

一、集群的目的

  1. 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
  2. 通过增加更多的节点来扩展消息通信的吞吐量

二、Cluster集群搭建

2-1、第一步

将各个节点安装完毕参考:Centos7、Erlang-21.3、RabbitMQ-3.8.0 单机版安装

2-2、第二步

修改Linux中的/etc/hosts文件加入,让各个节点都能互相识别对方的存在

192.168.184.138 node-1

192.168.184.139 node-2

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第1张图片

修改完成之后,重启服务器。

2-3、第三步

RabbitMQ集群通信是建立在Erlang通信上的,Erlang通信是通过.erlang.cookie文件通信的,编辑 RabbitMQ的cookie 文件,以确保各个节点的cookie文件使用的是同一个值,cookie文件在$HOME目录下,cookie相当于密钥令牌,集群中的RbbitMQ节点需要通过交换密钥令牌以获得相互认证,如果节点的密钥令牌不一致,那么在配置节点时就会报错,报错如下

rabbitmqctl join_cluster rabbit@node-2

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第2张图片

复制node-1或者node-2的都行,只要保证相同

scp -r /root/.erlang.cookie  [email protected]:/root/

2-4、第四步

配置集群,使用 rabbitmqctl工具配置,启动这两个rabbitmq节点服务

rabbitmq-server -detached

这两个节点时独立的,rabbitmqctl cluster_status,查看各个节点的状态

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第3张图片

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第4张图片

接下来为了将2个节点组成一个集群,需要以node-1节点为基准,将node-2节点

加入 node-1节点的集群中。这2个节点是平等的,如果想调换彼此的加入顺序也可以。 将node-2节点加入node-1节点的集群中,需要如下步骤:

在node-2节点执行

[root@node-2 ~]# rabbitmqctl stop_app

Stopping rabbit application on node rabbit@node-2 ...

[root@node-2 ~]#

[root@node-2 ~]# rabbitmqctl reset

Resetting node rabbit@node-2 ...

[root@node-2 ~]#

[root@node-2 ~]# rabbitmqctl join_cluster rabbit@node-1    //rabbit@rabbitmq01为rabbitmq01集群的名字,在rabbitmq01上查看

Clustering node rabbit@node-2 with rabbit@node-1

[root@node-2 ~]#

[root@node-2 ~]# rabbitmqctl start_app

Starting node rabbit@node-2 ...

 completed with 3 plugins.

[root@node-2 ~]#

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第5张图片

然后使用:rabbitmqctl cluster_status查看状态为:

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第6张图片

Web管理插件可看出成功了

到此rabbitmq集群搭建完成

三、集群节点类型

RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。

Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。

在使用rabbitmqctl cluster_status命令来查看节点类型:显示如图

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第7张图片

目前来看集群中所有的节点都为磁盘节点,我们可以将node-1修改为内存节点,

rabbitmqctl stop_app

rabbitmqctl change_cluster_node_type ram

rabbitmqctl start_app

rabbitmqctl cluster_status

查看集群中node-1节点已经更改为ram类型

Centos7、Erlang-21.3、RabbitMQ-3.8.0 集群版安装_第8张图片

在RabbitMQ集群中,RabbitMQ规定必须要有一个disk节点,其他节点都可以为RAM节点,当节点加入或者离开集群时,它们必须将变更通知到至少一个磁盘节点。如果只有一个disk节点,而且改disk节点下线,那么集群可以继续发送或者接收消息,但是不能执行其他操作,直到该磁盘节点恢复前,你无法更改任何东西,所以说在建立集群的时候,我们确保应该有多个disk节点。

 

解释:

Erlang集群

rabbitmqctl首先会启动erlang节点,然后会从erlang分布式系统尝试连接RabbitMQ,而这时候需要erlang cookie和合适的节点名称,erlang节点通过交换作为秘密令牌的erlang cookie以获得认证,.erlang.cookie中存储的就是此令牌信息,所以集群所以erlang节点的erlang.cookie令牌信息必须一致

由于RabbitMQ的集群依赖erlang的集群,所以需要构建erlang集群,erlang集群之间是通过magic cookie实现的,这个cookie存放在$HOME/.erlang.cookie,随便选取一个节点的cookie复制到另外两个节点使三台保持一致

scp .erlang.cookie root@rabbitmq02:/root

设置好之后即可重启rabbitmq

如果需要将rabbitmq02作为内存节点与rabbitmq01连接起来,则在rabbitmq02上执行以下命令

  1. rabbitmqctl stop_app
  2. rabbitmqctl join_cluster --ram rabbit@rabbitmq01
  3. rabbitmqctl start_app

其中--ram代表是内存节点,如果希望是磁盘节点则不用加--ram,在rabbitmq集群中,至少需要一个磁盘节点

然后可以使用ip:15672即可访问,可以查看到三台节点的信息

集群节点可以是两种类型: 磁盘节点(Disc Node) 或 内存节点(RAM Node).磁盘节点会在RAM和磁盘中复制数据, 通过冗余可以防止节点失效事件,并可从断电这种全局事件中进行恢复. RAM节点只在RAM中复制数据(除了队列的内容外,还依赖于队列是否是持久化的或者内容对于内存来说是否过大) ,并主要用于可伸缩性. RAM节点只有当管理资源(如,增加/删除队列,交换机,或绑定)的时候才具有更高的性能.一个集群必须至少有一个磁盘节点,通常来说还不止一个.

默认情况下,节点是磁盘节点.如果你想要创建内存节点,需要提供--ram 标志

rabbitmq命令详解参考

  1. https://www.cnblogs.com/wuzhiyuan/p/6856985.html
  2. http://www.blogjava.net/qbna350816/archive/2016/07/30/431394.html
  3. http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

如果在加入集群的时候没有指定内存节点(RAM Node),可以使用命令将某个RabbitMQ节点修改为内存节点

修改节点为ram模式

  1. rabbitmqctl stop_app
  2. rabbitmqctl change_cluster_node_type ram
  3. rabbitmqctl start_app
  4. rabbitmqctl cluster_status

退出集群

  1. rabbitmqctl stop_app
  2. rabbitmqctl reset
  3. rabbitmqctl start_app

注意事项

  1. cookie在所有节点上必须完全一样,同步时一定要注意。
  2. Erlang是通过主机名来连接服务的,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
  3. 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。
  4. 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。
  5. RabbitMQ只要求集群中至少有一个磁盘节点,其他节点都可以是内存节点。当节点加入或者离开集群时,它们必须要将变更通知到至少一个磁盘节点。如果只有一个磁盘节点,磁盘节点奔溃后,集群可以继续路由消息(即保持运行),但是直到该节点恢复之前,无法更改任何东西。通常在集群中设置两个磁盘节点
  6. cluster中的node可以被随意的停止和启动,他们并不影响cluster中的其他node的运行,node重启后会自动的和cluster中的其他node进行联系的。当cluster不能工作时,最后一个失效的node必须是重建后第一个开始工作的node,如果这种情况不满足,则所有的node则会为最后一个disk node的恢复等待30秒,如果最后一个失效的node无法重新工作,我们需要通过命令将其从cluster中移除。

你可能感兴趣的:(RabbitMQ)