本篇接上面这篇安装文章的步骤,来搭建rabbitmq集群:


环境:两台服务器作为两个节点,把node-003加入node-002

192.168.95.129  node-002

192.168.95.130  node-003

一、集群搭建

1. 配置环境host,两个节点的host都需要包含每个节点的信息,信息要一致。下面是在node-002中的操作。node-003中也需要做相同一样的操作(把hostname改为 node-003,多个节点同理)

a.  [root@node-002 sbin]# vi /etc/hosts
192.168.95.129 node-002
 192.168.95.130 node-003b.   保存a后:
[root@node-002 sbin]# vi /etc/hostname
node-002
c.  保存b
[root@node-002 sbin]# vi /etc/sysconfig/network
NETWORKING=yes
 HOSTNAME=node-002d.  保存c
[root@node-002 sbin]# service network restart
e. 重启服务器使host修改生效, 查询hostname是否已修改
[root@node-002 sbin]# reboot
[root@node-002 sbin]# hostname
 node-002

2.  因为rabbitmq集群是基于erlang同步的,所以先配置使各个节点 中 .erlang.cookie文件一致。

[root@node-002 sbin]# find / -name .erlang.cookie
 /root/.erlang.cookie[root@node-002 sbin]# scp /root/.erlang.cookie root@node-003:/root
3.  [root@node-002 sbin]# cd /opt/rabbitmq_server-3.7.7/sbin
[root@node-002 sbin]# ./rabbitmq-server -detached
[root@node-002 sbin]# ps aux|grep rabbitmq

4. 切换到node-003服务器,  确定下两台服务器互相能否ping通,ping node-002

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_java-rabbitmq

[root@node-003 sbin]# cd /opt/rabbitmq_server-3.7.7/sbin
[root@node-003 sbin]# ./rabbitmq-server -detached
 [root@node-003 sbin]# ps aux|grep rabbitmq
 [root@node-003 sbin]# ./rabbitmqctl stop_app//默认是磁盘节点,如果是内存节点的话,需要加--ram参数【./rabbitmqctl join_cluster --ram rabbit@node-002】
[root@node-003 sbin]# ./rabbitmqctl join_cluster rabbit@node-002

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_优先级_02

[root@node-003 ~]# rabbitmqctl start_app
[root@node-003 sbin]# ./rabbitmqctl cluster_status

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_rabbitmq命令查看镜像队列的状态_03

5.  因为两台服务器host已经改掉了,已经部署localhost了,所以需要加上对应的用户,先前的username用户已经登录不上

控制台了。添加一个admin用户如下:【node-003也可以直接用这个用户访问】

[root@node-002 sbin]#  ./rabbitmqctl -n rabbit@node-002 add_user admin 123456
 Adding user "admin" ...
 [root@node-002 sbin]# ./rabbitmqctl -n rabbit@node-002 set_user_tags admin administrator
 Setting tags for user "admin" to [administrator] ...
 [root@node-002 sbin]#  ./rabbitmqctl -n rabbit@node-002 set_permissions -p / admin '.*' '.*' '.*'
 Setting permissions for user "admin" in vhost "/" ...
 [root@node-002 sbin]# ./rabbitmq-plugins enable rabbitmq_management

6.  通过 http://192.168.95.129:15672   ,输入 admin  123456 即可登录。

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_分布式_04

二、 集群模式,rabbitmq集群有2种模式(上面的就是普通模式),详细如下:

普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

镜像模式: 把需要的队列做成镜像队列,存在与多个节点属于RabbitMQ的HA方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

二、 镜像模式

首先镜像模式要依赖policy模块,这个模块是做什么用的呢?

policy中文来说是政策,策略的意思,那么他就是要设置,那些Exchanges或者queue的数据需要复制,同步,如何复制同步?对就是做这些的。

1. 直接用管控台添加策略如下:

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_java-rabbitmq_05

参数解释:

name: 为策略名称  ,我命名为  winy-ha

Pattern: 为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue,这里我设置为匹配全部

Apply to:使用对象

Priority:配置了多个策略时候的优先级,值越大,优先级越高。(单个策略配置意义不大)

注意:没有指定优先级的消息会将优先级以0对待。 对于超过优先级队列所定最大优先级的消息,优先级以最大优先级对待

Definition: 为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)

2. 测试一下上面策略是否生效

控制台queue tab页面添加一个测试用的queue  ,  install-test-queue

rabbitmq命令查看镜像队列的状态 rabbitmq镜像集群_rabbitmq命令查看镜像队列的状态_06

三、负载均衡  HAProxy