rabbitmq集群

原文地址:https://www.cnblogs.com/lion.net/p/5725474.html

rabbitmq集群介绍

rabbitmq有3种模式,但集群模式是2种。详细如下:

单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。
普通模式:默认模式,以两个节点(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方案。
该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。
该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
所以在对可靠性要求较高的场合中适用。

安装环境

192.168.0.31 node1
192.168.0.32 node2
192.168.0.33 node3

安装rabbitmq

3个节点都安装rabbitmq

安装请参考:http://www.cnblogs.com/hanxiaohui/p/8822443.html

设置 Erlang Cookie

RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。
当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。
如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie . rabbitmq-server -detached #首先启动Node1上的rabbitmq
. 在家目录下产生.erlang.cookie 文件,权限400
. 复制.erlang.cookie 文件到node2,node3
.最后分别在确认三台机器上的.erlang.cookie的值是一致的. #cat .erlang.cookie 内容要一致

使用detached参数,在后台启动Rabbit Node

3个节点都需要操作

rabbitmqctl stop  #关闭
rabbitmq-server -detached #启动 node1:
lion@node1:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}] node2:
lion@node2:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
{running_nodes,[rabbit@node2]},
{cluster_name,<<"rabbit@node2">>},
{partitions,[]},
{alarms,[{rabbit@node2,[]}]}] node3:
lion@node3:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3]}]},
{running_nodes,[rabbit@node3]},
{cluster_name,<<"rabbit@node3">>},
{partitions,[]},
{alarms,[{rabbit@node3,[]}]}]

将node1、node2、node3组成集群

因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。
要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。
如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。 node2:
lion@node2:~$ rabbitmqctl stop_app
Stopping node rabbit@node2 ...
lion@node2:~$ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1 ...
lion@node2:~$ rabbitmqctl start_app
Starting node rabbit@node2 ... node3:
lion@node3:~$ rabbitmqctl stop_app
Stopping node rabbit@node3 ...
lion@node3:~$ rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node3 with rabbit@node1 ...
lion@node3:~$ rabbitmqctl start_app
Starting node rabbit@node3 ... 此时 node2 与 node3 也会自动建立连接。 如果要使用内存节点,则可以使用以下命令:
lion@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1 集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
lion@node1:~$ rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
{running_nodes,[rabbit@node1]},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{rabbit@node1,[]}]}]

修改节点存储类型

集群中必须存活一个磁盘节点
./rabbitmqctl stop_app
./rabbitmqctl change_cluster_node_type {ram|disk}
./rabbitmqctl start_app

将xxx节点踢除集群

./rabbitmqctl forget_cluster_node rabbit@xxx

RabbitMQ镜像功能

使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为

lion@node2:~$ rabbitmqctl set_policy -p test ha-allqueue "^" '{"ha-mode":"all"}'   
#这行命令,在vhost名称为test创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。 例如下面的命令,^message 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"。
lion@node2:~$ rabbitmqctl set_policy -p test ha-allqueue "^message" '{"ha-mode":"all"}' 更多set_policy说明:http://www.rabbitmq.com/man/rabbitmqctl.1.man.html

安装软件负载均衡器HAProxy

通过软件负载均衡器haproxy实现分发(通过7562端口)
https://www.cnblogs.com/lion.net/p/5725474.html

rabbitmq集群验证


#随意一台操作 #添加用户test 密码为test
rabbitmqctl add_user test test
#设置test用户为administrator
rabbitmqctl set_user_tags test administrator #添加vhost 名为test
rabbitmqctl add_vhost test
#设置test用户对 test vhost的所有权限 -p 后的第一个test为vhost名 第二个test为用户名
rabbitmqctl set_permissions -p test test '.*' '.*' '.*'
#添加镜像策略(同步消息到其它节点,消息持久化)
rabbitmqctl set_policy -p test ha-allqueue "^" '{"ha-mode":"all"}'
#在vhost test中添加一个队列,名为test   durable=true【rabbitmq重启队列还在,即对队列做持久化】
rabbitmqadmin --vhost=test --username=test --password=test declare queue name=test durable=true #往队列里添加一条消息
rabbitmqadmin --vhost=test --username=test --password=test publish routing_key=test payload="this is a testing" #查看队列情况
rabbitmqadmin --vhost=test --username=test --password=test list queues #从test queue消费一条信息
rabbitmqadmin --vhost=test --username=test --password=test get queue=test requeue=true #requeue=true 这条消息消费后还在,反之如果为false消费后消息就不在了。 )
停掉rabbitmq1,在另外两台查看队列情况,可以看到test队列还是存在,获取队列的消息也是可以获取到的。
再重新开启rabbitmq1 可以看到test队列还是存在,获取队列的消息也是可以获取到的.

rabbitmq集群-2的更多相关文章

  1. 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接

    我们知道rabbitmq是一个专业的MQ产品,而且它也是一个严格遵守AMQP协议的玩意,但是要想骚,一定需要拿出高可用的东西出来,这不本篇就跟大家说 一下cluster的概念,rabbitmq是erl ...

  2. RabbitMq 集群搭建

        实验环境: 操作系统为 Centos 7.2 IP hostName 192.168.190.132 node132 192.168.190.139 node139 192.168.190.1 ...

  3. RabbitMQ 集群+负载均衡

    负载均衡 集群的配置已经搭建好了,代码也成功跑通,成功做到了高可用,但是我们的程序连接节点并不会管哪个服务器在忙.哪个服务器空闲,完全看心情想连谁就连谁.而且代码中要把每个ip的节点都手动的写出来 , ...

  4. RabbitMq 集群配置

    1. RabbitMQ 所需的附属安装包 1.1  openGL安装 执行命令: [root@localhost local]# yum install mesa-libGL-devel mesa-l ...

  5. RabbitMQ集群、镜像部署配置

    1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.Act ...

  6. Rabbitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  7. RabbitMQ 集群与高可用配置

    集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送 ...

  8. (转)RabbitMQ 集群与高可用配置

    集群概述 环境 配置步骤 集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务 ...

  9. CentOS7安装RabbitMQ集群

    实验环境 RabbitMQ 集群 server1.example.com    IP: 10.10.10.11    Node: diskserver2.example.com    IP: 10.1 ...

  10. 私有云Rabbitmq 集群部署

    默认openstack使用rabbitmq做信息队列,如果想要是云高可用,那么需要对每个涉及的组件都进行高可用配置,本文介绍如何使用rabbitmq 做高可用 高可用方法 通过 Erlang 的分布式 ...

随机推荐

  1. Oracle or Question Solve(二)

    数据库常用语句和函数 ----update update()函数主要注意的是后面的where限制条件--例子:update tab_a a set a.v1 = (select b.v1 from t ...

  2. 在使用KVO遇到的一个问题

    在项目开发中定义了一个单例对象RHUserData的对象,RHOLUserInfo类是单例对象的一个property属性,RHOLUserInfo里面有个userId的属性,在其他类里面进行设置KVO ...

  3. windows防火墙批量开放端口

    windows自带的防火墙没有增加端口范围的功能,这让一些常见的配置变得非常麻烦(比如FTP被动模式下,就需要在防火墙上开启端口范围),经过查询资料,使用以下cmd批处理内容,即可增加端口范围: ec ...

  4. Ubuntu里wine使用fcitx输入法

    将启动变为脚本,添加 export XMODIFIERS="@im=fcitx"export GTK_IM_MODULE="fcitx"export QT_IM ...

  5. 记.net3.5离线安装问题

    dism.exe /online /enable-feature /featurename:netfx3 /Source: X:\sourse\sxs pause 相关文件要相同版本的ISO中提取,否 ...

  6. C#链接mysql出现 One of the identified items was in an invalid format

    这个问题在tolist查询结果的时候就会出现但是count就不会出现,后来才发现是数据生成工具生成出来的ID有问题导致的,只要保证iD不重复并且按照指定的类型建立ID就可以了

  7. socket 接收和发送缓冲区

    问题产生: 在进行客户端向服务端发送数据时,每次发送一定数量数据后发送端就等不到send函数的返回,导致程序一直卡死在send函数. 通过抓包发现:发送端发送过快而接收端处理速度过慢,导致快速发送一定 ...

  8. 记录MNIST实现与理解

    之前半个月的时间几乎都在看理论书籍,最近两天开始撸代码,一个跟Hello World同级别的教程例子就出来了,那就是MNIST.实现代码应该很多地方都有: #!/usr/bin/env python ...

  9. fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程

    系统之家 发布时间:18-05-3117:56 很多Win7用户在复制较大的文件时,系统会弹出窗口提示“对于目标文件系统,文件XXX过大”,出现这种情况的原因是FAT32的文件系统不支持复制大于4g的 ...

  10. upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】

    GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...