01-Rabbit-3.1.5 集群部署

1.集群概述
通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。

2.节点类型

RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

3.RabbitMQ可以通过三种方法来部署分布式集群系统,cluster,federation,shovel

1. cluster:不支持跨网段,用于同一个网段内的局域网
可以随意的动态增加或者减少
节点之间需要运行相同版本的RabbitMQ和Erlang

跨集群Erlang版本

集群中所有节点必须运行相同版本的Erlang.

2. federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接                        internet上的中间服务器,用作订阅分发消息或工作队列。

3. shovel:连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网。

4.Erlang Cookie
Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。

5.RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。

普通模式:默认的集群模式,以两个节点(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高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

6.实现机制

镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:

7.集群部署

RabbitMQ 集群安装在 3 个节点上:

1
2
3
rabbitmq-node01:172.16.1.45
rabbitmq-node02:172.16.1.46
rabbitmq-node03:172.16.1.47

HAProxy 安装在 192.168.1.4 上,用于对外提供 RabbitMQ 均衡

8.在每台主机上配置相同的hosts

1
2
3
4
5
6
7
8
9
[root@rabbitmq-node01 ~]# vim /etc/sysconfig/network
172.16.1.45 rabbitmq-node01
[root@rabbitmq-node01 ~]# hostname rabbitmq-node01
[root@rabbitmq-node01 ~]# tail -3 /etc/hosts
172.16.1.45 rabbitmq-node01
172.16.1.46 rabbitmq-node02
172.16.1.47 rabbitmq-node03

10.三个各节点安装启动rabbitmq

1
2
3
4
5
yum install rabbitmq-server
/usr/lib/rabbitmq/bin/rabbitmq-plugins list
/usr/lib/rabbitmq/bin/rabbitmq-plugins  enable rabbitmq_management
/usr/lib/rabbitmq/bin/rabbitmq-plugins list
/etc/init.d/rabbitmq-server start

11.拷贝.cookie时,各节点都必须停止MQ服务

1
2
3
4
/etc/init.d/rabbitmq-server stop
cd /var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@172.16.1.46:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@172.16.1.47:/var/lib/rabbitmq/

12.集群节点02,03操作

1
2
cd /var/lib/rabbitmq/
chown rabbitmq.rabbitmq .erlang.cookie

13.  集群节点01

1
2
3
[root@rabbitmq-node01 rabbitmq]# /etc/init.d/rabbitmq-server start
[root@rabbitmq-node01 rabbitmq]# rabbitmqctl stop
[root@rabbitmq-node01 rabbitmq]# rabbitmq-server -detached

14.节点02,节点03加入到集群,运行-detached模式

1
2
3
4
5
6
7
8
9
10
11
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl stop
[root@rabbitmq-node02 rabbitmq]# rabbitmq-server -detached
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl stop_app
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq-node01
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl start_app
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl stop
[root@rabbitmq-node03 rabbitmq]# rabbitmq-server -detached
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl stop_app
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq-node01
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl start_app

   # disk,ram存储模式更改

1
2
3
4
5
6
7
8
9
10
11
12
13
默认是disk模式,加入集群如需要使用ram,则:
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-node01
1. Disk node类型节点变更为RAM node类型节点
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl stop_app
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl reset
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-node1    在disk node类型节点修改为RAM node类型
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl start_app
1. RAM node类型变更为Disk node类型节点
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl stop_app
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl reset
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbitmq-node1         在RAM node类型节点修改为RAM node类型
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl start_app

15.在任意一节点配置

1
2
3
4
5
6
7
8
9
[root@rabbitmq-node01 rabbitmq]# rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
   1. 设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后需要手动同步队列消息
# rabbitmqctl set_policy ha-all-queue "^ha\." '{"ha-mode":"all"}'
# rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all"}'
2. 设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消息(我们生产环境采用这个方式)
# rabbitmqctl set_policy ha-all-queue "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'
# rabbitmqctl set_policy ha-all-queue "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

16.登陆管理界面查看

 17.增加虚拟机及用户

1
2
3
4
5
6
rabbitmqctl add_vhost pinhui001     # 增加pinhui001虚拟主机
rabbitmqctl list_vhosts             # 列出虚拟主机
rabbitmqctl add_user admin phadmin  # 增加admin,密码phamdin用户
rabbitmqctl list_users          # 列出用户
rabbitmqctl set_permissions -p "pinhui001" admin  ".*" ".*" ".*"    # 设置admin用户对虚拟主机pinhui001所以权限
rabbitmqctl list_queues -p pinhui001    # 查看虚拟主机pinhui001的消息队列

 18.节点正常退出集群,假设要把rabbitmq2退出集群

1
2
3
4
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl stop_app
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl reset
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl start_app
[root@rabbitmq-node02 rabbitmq]# rabbitmqctl cluster_status

19.节点宕机,强制移除节点

1
[root@rabbitmq-node03 rabbitmq]# rabbitmqctl forget_cluster_node rabbit@rabbitmq-node01

 20.rabbit集群重启,最后一个关机的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉

1
2
3
4
5
6
7
8
9
先在一个节点上执行
#rabbitmqctl force_boot
#service rabbitmq-server start
在其他节点上执行
#service rabbitmq-server start
#rabbitmqctl cluster_status
查看cluster状态是否正常(要在所有节点上查询)

 

 

参考文档

http://88250.b3log.org/rabbitmq-clustering-ha

http://zhanghua.1199.blog.163.com/blog/static/4644980720138171451630/

http://www.blogjava.net/qbna350816/archive/2016/06/05/430784.html

http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

http://www.cnblogs.com/DanielChow/p/3373518.html

Leave a Reply

Your email address will not be published. Required fields are marked *