单节点部署

rabbitmq单节点部署比较简单,可以使用apt-get等工具快速安装部署。

wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
echo 'deb http://www.rabbitmq.com/debian/ {distriubtion} main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list
sudo apt-get update
sudo apt-get install rabbitmq-server

如上,添加仓库等认证key,更新本地仓库后安装即可。其中{distriubtion}需根据不同的系统版本指定。

使用apt-get等工具安装比较快速,会一次性安装erlang等依赖。也可以手动安装erlang后,再安装rabbitmq,这种方式也无多大成本,下载rabbitmq的tar.gz包

后解压即可。

rabbitmq安装后,以下为几个比较重要的目录,根据不同的系统和安装方式,目录路径会有所差别:

  • {rabbitHome}/etc: 配置文件目录,rabbitmq.config文件定义rabbitmq配置
  • {rabbitHome}/sbin:rabbitmq可执行文件目录,如:rabbitmq-server、rabbitmqctl、rabbitmq-plugins
  • {rabbitHome}/plugins: rabbitmq内置的插件(.ez)放在此目录,开启相应的插件即可使用。
  • {rabbitHome}/var/log:日志目录

下载后使用 rabbitmq-server [- detached] 即可启动rabbitmq服务。



后台首先会启动一个erlang虚拟机机,然后在此虚拟机中启动rabbitmq服务。

集群部署

rabbitmq提供了多种集群部署的方式:

  • 静态配置:在rabbit.conf文件中静态配置集群节点
  • rabbitmqctl: 使用rabbitmqctl工具手动组装集群
  • 服务发现:基于etcd、consul、k8s等动态配置集群

这里主要介绍使用rabbitmqctl组集群等方式,这种方式在小规模下灵活高效。

假设局域网中有node1,node2,node3三个节点,配置rabbitmq集群需要以下几步:

  1. 复制erlang cookie

    如上所述,rabbitmq运行在erlang虚拟机中,erlang节点需要根据erlang cookie通信,为此需要保证三个节点上的cookie一致。cookie默认位于/var/lib/rabbitmq/.erlang.cookie

    目录下,从一个节点上复制拷贝到其他节点即可。

    root@node1:~# cat /var/lib/rabbitmq/.erlang.cookie
    JZQIKYDOSOKMADVDSPUO root@node2:~# echo JZQIKYDOSOKMADVDSPUO > /var/lib/rabbitmq/.erlang.cookie
    root@node3:~# echo JZQIKYDOSOKMADVDSPUO > /var/lib/rabbitmq/.erlang.cookie
  2. 分别启动节点

    root@node1:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed. root@node2:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed. root@node3:~# rabbitmq-server -detached
    Warning: PID file not written; -detached was passed.

    在三个节点上分别启动rabbit,此时三个rabbitmq各自独立。可以使用rabbitmqctl cluster_status命令分别在三个节点上查看集群状态。

    root@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,[]}]}]
  3. 加入集群

    以node1为基础,将node2和node3加入集群。

    root@node2:~# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@node2
    root@node2:~# rabbitmqctl reset
    Resetting node rabbit@node2
    root@node2:~# rabbitmqctl join_cluster rabbit@node1
    Clustering node rabbit@node2 with rabbit@node1
    root@node2:~# rabbitmqctl start_app
    Starting node rabbit@node2
    root@node2:~#

    首先rabbitmqctl stop_app会停止rabbitmq服务,然后rabbitmqctl reset会重置集群状态,接着将node2加入node1所在集群,最后在启动node2上

    到rabbitmq服务。node3上执行同样到操作。

    完成后,三个节点已经组成集群,再次使用rabbitmqctl cluster_status命令任意节点上查看集群状态:

    root@node3:~# rabbitmqctl cluster_status
    Cluster status of node rabbit@node3
    [{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
    {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
    {cluster_name,<<"rabbit@node1">>},
    {partitions,[]},
    {alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
    root@node3:~#

到此集群即组建完毕,组建过程并不复杂。

后续如果需要动态将单个节点脱离集群,也很容易:

root@node3:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@node3
root@node3:~# rabbitmqctl reset
Resetting node rabbit@node3
root@node3:~# rabbitmqctl start_app
Starting node rabbit@node3
root@node3:~#

关闭节点上到rabbitmq服务,重置该节点集群状态,重启rabbitmq服务即可。

集群节点类型

上面在使用rabbitmqctl cluster_status查看集群状态时,会发现node列表中的disc,这是表明节点类型的。

在集群中,存在两种节点:

  • disc 磁盘节点,元数据存储到磁盘
  • ram 内存节点,元数据存储到磁盘

磁盘节点将队列、交换器、绑定关系等源数据存储到磁盘中,而内存节点将这些数据存储在内存中。

上面组建集群时,节点默认为disc类型,也可以在将节点加入集群时指定为ram类型:

root@node2:~# rabbitmqctl join_cluster rabbit@node1 --ram

对于集群中已有等节点,也可以改变其节点类型:

root@node2:~# rabbitmqctl change_cluster_node_typef {disc,ram}

当创建一个队列、交换器、绑定等时,需要服务端各个节点将源数据写入后才会响应客户端,这意味这磁盘节点会具有较慢的响应。在频繁创建队列、交换器等创建中,

磁盘节点会拖慢集群响应速度。不过实际中,频繁创建元数据等场景并不多见,所以可以一般将集群中节点全部设置成磁盘节点。在rpc等频繁创建元数据等场景下,

可以考虑使用内存节点。

在一个集群中,应该保证至少有一个磁盘节点,这样才能保证集群重启后元数据等恢复。

RabbitMQ(6) 集群部署的更多相关文章

  1. RabbitMQ学习之集群部署

    我们先搭建一个普通集群模式,在这个模式基础上再配置镜像模式实现高可用,Rabbit集群前增加一个反向代理,生产者.消费者通过反向代理访问RabbitMQ集群. 架构图如下: 设计架构可以如下:在一个集 ...

  2. rabbitMQ集群部署以及集群之间同步

    MQ集群部署 期待的部署架构 其中,一个机房有两台机器部署MQ,并组成集群,有一个机房的MQ集群作为中心集群,其他机房的MQ集群将消息同步到中心MQ集群中. 安装erlang,略.. 安装rabbit ...

  3. RabbitMQ消息队列(十)-高可用集群部署实战

    前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. RabbitMQ集群基本概念 Rabbit模式大概分为以下三种 ...

  4. Centos6.9下RabbitMQ集群部署记录

    之前简单介绍了CentOS下单机部署RabbltMQ环境的操作记录,下面详细说下RabbitMQ集群知识,RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言, ...

  5. rabbitmq集群部署及配置

    消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步.本篇将以rabbitmq+HA方式进行部署. 一.原理介绍 rabbitmq是依据erlang的分 ...

  6. Centos 7 RabbitMQ + Haproxy 集群高可用部署

    一.   功能和原理介绍 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionSc ...

  7. 160328、rabbitMQ集群部署示例

    环境:Centos 6.5 x86_64MQ网址:http://www.rabbitmq.com/SERVER101\SERVER102 SERVER103 一.单节点安装 #yum install ...

  8. (转)RabbitMQ学习之集群部署

    http://blog.csdn.net/zhu_tianwei/article/details/40931971 我们先搭建一个普通集群模式,在这个模式基础上再配置镜像模式实现高可用,Rabbit集 ...

  9. (十)RabbitMQ消息队列-高可用集群部署实战

    原文:(十)RabbitMQ消息队列-高可用集群部署实战 前几章讲到RabbitMQ单主机模式的搭建和使用,我们在实际生产环境中出于对性能还有可用性的考虑会采用集群的模式来部署RabbitMQ. Ra ...

随机推荐

  1. pyinstaller 打包生成的exe文件,在其他电脑上报错

    解决方法: 1.第一种情况,在打包的时候不要加参数-w,看一下执行exe文件后出现的报错再看下一步的行动 2.应该是需要装一个VC 2015 x64(下载地址:https://www.microsof ...

  2. 【Beginning Python】抽象(未完)

    [懒惰即是美德] 抽象意味着良好的可读性:说明你在努力做什么,而不是给出你正在如何做的细节. [抽象和结构] 程序应该是非常抽象的,就像“下载网页.计算频率.打印每个单词的频率”一样易懂.翻译成程序就 ...

  3. 【Python】装饰器 & 偏函数

    [装饰器] 1.最简单的Decorator. def author(f): def addName(): print('My name is xkfx.\n') f() return addName ...

  4. JQuery的click、bind、delegate、off、unbind

    .click与.bind .click和.bind都是给每个元素绑定事件,对于只绑定一个click事件,.bind事件的简写就是.click那种方式. 这两种方式都会出现两个问题: 第一个问题,如果要 ...

  5. 20145303刘俊谦 《Java程序设计》第2周学习总结

    20145303刘俊谦 <Java程序设计>第2周学习总结 教材学习内容总结 1.对于标识符的一些名称规范(觉得挺重要而且容易混淆!定义就不写了,列一些例子): 包名: xxxyyyzzz ...

  6. 20145327 《Java程序设计》第六周学习总结

    20145327 <Java程序设计>第六周学习总结 教材学习内容总结 父类中的方法: 流(Stream)是对「输入输出」的抽象,而「输入输出」是相对程序而言的. 标准输入输出: Syst ...

  7. xml简单介绍及libmxml编程

    今天我们来简单介绍一下,关于xml的一些内容,包括自己编写一些程序进行生成和解析. 首先我们我们还是从xml的演化历史来了解一下它吧. 历史演化 GML: 在20世纪60年代为了促进数据交换和操作,通 ...

  8. Http中Get和Post的区别(转载)

    在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的.Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可 ...

  9. Hive查询Join

    Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.key==b.key); 现有两张表:sales 列出了人名及其所购商品的 ...

  10. Spring中RestTemplate进行Http调用

    Spring中的RestTemplate类源自spring-web,http调用中设置超时时间.设置连接池管理等非常重要,保证了系统的可用性,避免了长时间连接不上或者等待数据返回,拖垮系统. 现贴出工 ...