RabbitMq的集群原理
rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。
RabbitMq的集群分为两种
普通模式
以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。
镜像模式
将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
集群部署
本方案中是在多台机器之间部署rabbitmq的cluster,要求如下:这几个节点需要再同一个局域网内;这几个节点需要有相同的erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。
这里一般 .erlang.cookie 一般存在于如果是 rpm安装的RabbitMq的话则存在于 /var/lib/rabbitmq 如果是 tar解压的话 其存在于${home}/下边,如果找不到的话直接使用
find -name .erlang.cookie去找
注意一定要先关闭所有机器的防火墙 !!!
安装的环境 Linux centos6.5 32位 JDK1.7
1、对.erlang.cookie 进行赋予权限400以上 chmod 600 路径/.erlang.cookie
2、关闭每台物理机的 防火墙
3、以其中一台机器上的.erlang.cookie 为源文件 复制到 每一台虚拟机的相同目录下
以我的为例
scp /root/.erlang.cookie root@192.168.137.12:/root/
安装报错
bash: scp: command not found
解决:
yum install openssh-clients
启动所有的节点
4、复制.erlang.cookie 到每一个 rabbitMqServer
scp /root/.erlang.cookie root@192.168.137.12:/root/
scp /root/.erlang.cookie root@192.168.137.13:/root/
5、添加节点到集群中
重新启动节点
./rabbitmqctl stop
./rabbitmq-server -detached
6、查看集群的状态
.在sbin目录下执行
./rabbitmqctl cluster_status
7、加入节点到集群中去
./rabbitmqctl stop_app
进入到rabbitmq 的sbin目录下执行如下命令
./rabbitmqctl join_cluster 集群名称@主机名
./ rabbitmqctl start_app
8、设置镜像
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。
./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
镜像队列的详解
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级
例如,对队列名称以“queue_”开头的所有队列进行镜像,并在集群的两个节点上完成进行,policy的设置命令为:
rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'