Ubuntu16.04下,rabbimq集群搭建

时间:2022-09-18 07:53:38

  rabbitmq作为企业级的消息队列,功能很齐全,既可以作为单一的部署模式,又可以做集群的部署模式

  单一部署就不说了,就是在一台服务器上部署rabbitmq消息队列,可以参考我的博客:Ubuntu16.04下,erlang安装和rabbitmq安装步骤去安装部署

  集群部署有好几种方式,具体使用哪一种,要根据自己的需求而定,这里主要介绍一下普通集群和镜像集群

  普通模式

  普通模式是集群的默认模式,集群中各个节点拥有相同的队列结构,但是队列的消息实体已保存在其中一个节点,当消费者consumer连接集群中的某个节点时,会通过集群内部通信,将消息传到当前节点,再防御给消费者consumer,举个例子:

  假设集群中有两个节点(A和B),当生产者producer将消息发布在A上,且消息实体保存在A上时,但是A和B有相同的队列结构,当消费者consumer连接到B时,B会临时的从A拉去消息,然后再返回给消费者。

  普通集群模式的部署,我们准备了三台测试服务器,IP分别是192.168.209.133,192.168.209.134,192.168.209.135,它们的hostname分别是test1,test2,test3,

  然后分别安装rabbitmq,可以参考我的博客:Ubuntu16.04下,erlang安装和rabbitmq安装步骤去安装部署,当然,如果是虚拟机安装部署,可以安装一台,然后使用虚拟机克隆两台,然后他改下hostname

  安装好rabbitmq之后,我们需要改下hosts文件,在/etc/hosts中添加  

  192.168.209.133 test1
  192.168.209.134 test2
  192.168.209.135 test3

  可以ping一下,看能不能ping通

  这里说一下,rabbitmq的集群是依赖于erlang实现的,erlang是一种分步式开发的语言,可以通过通过magic cookie认证节点来对rabbitmq进行集群设置,而这个cookie存放在rabbitmq的安装目录的.erlang.cookie文件中,所以,我们要确保各个节点中的.erlang.cookie文件中的cookie是相同的,为此,我们可以将test1中的.erlang.cookie复制到test2和test3中,覆盖test2和test3原来的.erlang.cookie(如果有就覆盖),因为我这里三台linux主机中rabbitmq的安装目录都是/opt/rabbitmq_server-3.8.1,所以我们查看test1的/opt/rabbitmq_server-3.8.1下是否存在.erlang.cookie文件,如果没有,那么将用户根目录下的.erlang.cookie文件拷贝到/opt/rabbitmq_server-3.8.1,然后在使用scp命令分别拷贝到test2,test3中去:

  Ubuntu16.04下,rabbimq集群搭建

   现在test1上的rabbitmq的根目录有.erlang.cookie,再将其分别拷贝到test2和test3中的去就可以了,这里使用scp命令拷贝  

  注意,这里将拷贝过去的文件名命名为.erlang.cookie,可能会与test2和test3上原本就存在的.erlang.cookie文件冲突,建议将test2和test3中用户主目录下的.erlang.cookie删除或者重命名为其他名字

  #在test1上执行,拷贝到test2中去
  sudo scp /opt/rabbitmq_server-3.8.1/.erlang.cookie feng@test2:.erlang.cookie
  #在test1上执行,拷贝到test3中去
  sudo scp /opt/rabbitmq_server-3.8.1/.erlang.cookie feng@test3:.erlang.cookie
  #注意,这里将拷贝过去的文件名命名为.erlang.cookie,可能会与test2和test3上原本就存在的.erlang.cookie文件冲突,拷贝过程中可能会输入两次密码

  然后将test2和test3上用户主目录下的.erlang.cookie文件拷贝到rabbitmq根目录下,也就是/opt/rabbitmq_server-3.8.1目录。

  最后,为了避免不必要的错误,将三台主机中的rabbitmq全部重启一下,比如test1:  

  #查找rabbitmq相关进程
  ps -ef | grep rabbitmq
  #杀掉,可以使用-9强制杀掉
  sudo kill 5760 5761 5917
  #启动rabbitmq,命令后加个&表示在后台启动
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmq-server &

  Ubuntu16.04下,rabbimq集群搭建

  这里有3个rabbitmq的进程,将它们全部杀掉,然后启动(启动命令后面加上一个&符号,让它在后台启动,而不至于导致当前shell卡住)

   然后在test2上执行:  

  # 停止应用
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl stop_app
  #将test2作为内存节点添加到test1中去,--ram参数就是表示是内存节点,如果不带这个参数,就是磁盘节点,看个人需求
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl join_cluster rabbit@test1 --ram
  # 启动应用
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl start_app

  然后在test3上执行:

  # 停止应用
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl stop_app
  #将test3作为内存节点添加到test1中去,--ram参数就是表示是内存节点,如果不带这个参数,就是磁盘节点,看个人需求
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl join_cluster rabbit@test3 --ram
  # 启动应用
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl start_app

  如果上面命令执行报错:Error: unable TO perform an operation ON node 'rabbit@test3'. Please see diagnostics information AND suggestions below.

  可以参考:https://www.cnblogs.com/shanfeng1000/p/12108627.html

  完事之后,可以在test1上查看节点信息:  

  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl cluster_status

  Ubuntu16.04下,rabbimq集群搭建

  然后可以在浏览器打开:http://192.168.209.133:15672(http://192.168.209.134:15672和http://192.168.209.135:15672也可以,是一样的)

  使用账号登录进入就可以看到我们添加的test2和test3节点了

  如果没有账号,我们可以在test1上添加一个:  

  #添加用户,语法:rabbitmqctl add_user 账号 密码
sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl add_user admin 123456
#授权,语法:rabbitmqctl set_user_tags 账号 administrator
sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl set_user_tags admin administrator
#权限主要有
#超级管理员(administrator)、监控者(monitoring)、策略制定者(policymaker)、普通管理者(management)

  Ubuntu16.04下,rabbimq集群搭建

  镜像模式

  上面说了,普通模式中,虽然集群中各个节点有相同的数据结构,但是数据实体只保存在其中一个节点,当其他节点需要是,需要临时拉取,那么这样就会有一个问题,当保存数据实体的节点出故障时,其他节点就无法获取到实体,必须等该节点恢复后再能拉取消息实体消费。镜像模式中把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案,消息实体会在节点之间同步,这样算是解决了上述问题,但是这也降低了系统性能,增加了内存和磁盘的消耗,所以,实际需求要按具体情况看,在性能与高可用性之间取得一个平衡。

  镜像模式基于普通模式,或者说,镜像模式=普通模式+策略,这个可以在web管理端完成,也可以使用命令完成,这里就简单的在web管理端介绍了。

  首先,我们创建一个队列:  

  Ubuntu16.04下,rabbimq集群搭建

  注意,添加可能会提示没权限,我们可以在Admin中去添加:

  Ubuntu16.04下,rabbimq集群搭建

  在Admin中选择用户  

  Ubuntu16.04下,rabbimq集群搭建

  直接点击Set Permission和Set Topic Permission就可以 了  

  Ubuntu16.04下,rabbimq集群搭建

  队列创建后,得到结果如下    

  Ubuntu16.04下,rabbimq集群搭建

  注意了,此时这个queue1是在test2上的,但是test1和test3有相同的queue1队列机构,当test2故障时,queue1中的消息就拉取不到了

     接着,我们可以添加一个策略:   

  Ubuntu16.04下,rabbimq集群搭建

  添加策略后,等几秒钟,我们可以看到,队列queue应用了policy1策略,同时test1和test3对test2中的队列queue1进行了同步:  

  Ubuntu16.04下,rabbimq集群搭建

  如果需要数据同步,显示的是这样子的  

  Ubuntu16.04下,rabbimq集群搭建

  这里说test1和test3数据未同步,那么当test2出问题了,消息就丢了,为避免丢失,可以在任一台主机上执行同步:  

  # 同步队列queue1
  sudo /opt/rabbitmq_server-3.8.1/sbin/rabbitmqctl sync_queue queue1

  这样,哪怕test2挂了,消息仍然可以被消费

  到这里,镜像模式就算完成了,对于queue1队列,就是一种镜像队列,对于发布到queue1上的消息,都会消息实体同步到其他节点

Ubuntu16.04下,rabbimq集群搭建的更多相关文章

  1. Linux下zookeeper集群搭建

    Linux下zookeeper集群搭建 部署前准备 下载zookeeper的安装包 http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper ...

  2. Linux环境下Hadoop集群搭建

    Linux环境下Hadoop集群搭建 前言: 最近来到了武汉大学,在这里开始了我的研究生生涯.昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识 ...

  3. [Kubernetes]CentOS7下Etcd集群搭建

    Etcd简要介绍 Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息 Etcd构建自身高可用集群主要有三种形式: ①静态发现: 预先已知 Etcd 集 ...

  4. windows下Nacos集群搭建与nginx集成

    前言: nacos集群至少需要三个(一般为奇数个)nacos实 例,其前面顶nginx,外界入口从nginx入 一.windows下Nacos集群搭建 将Nacos的解压包复制分成3份,分别是: na ...

  5. centos7下Etcd3集群搭建

    一.环境介绍 etcd主要功能是分布式的存储键值,优点不多说了,分布是集群,自动选举等等,自行百度,主要说下配置方法,折腾了几天,终于优点眉目了,记录下操作方法,本文参考了如下链接 https://w ...

  6. Linux(Centos7)下redis5集群搭建和使用

    1.简要说明 2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂 ...

  7. Linux下kafka集群搭建过程记录

    环境准备 zookeeper集群环境kafka是依赖于zookeeper注册中心的一款分布式消息对列,所以需要有zookeeper单机或者集群环境. 三台服务器: 172.16.18.198 k8s- ...

  8. Linux下kafka集群搭建

    环境准备 zookeeper集群环境 kafka是依赖于zookeeper注册中心的一款分布式消息对列,所以需要有zookeeper单机或者集群环境. 三台服务器: 172.16.18.198 k8s ...

  9. Centos7下Etcd集群搭建

    一.简介 "A highly-available key value store for shared configuration and service discovery." ...

随机推荐

  1. C++中的抽象类及纯虚函数的实现与否

    1.含有纯虚函数的叫抽象类 2.抽象类(一般是基类)中的纯虚函数无论函数体实现与否,都没有关系,系统会自动忽略 3.继承自抽象类的子类,必须要实现父类的纯虚函数才可以实例化对象 4.抽象类不允许实例化 ...

  2. Android开发JDBC连接mysql数据库导入驱动方法

    在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...

  3. [C# 网络编程系列]专题五:TCP编程

    转自:http://www.cnblogs.com/zhili/archive/2012/08/25/2656840.html 前言 前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来 ...

  4. ARM920T系统总线时序分析

    一.系统总线时序图 二.分析 第一个时钟周期开始,系统地址总线给出需要访问的存储空间地址. 经过Tacs时间后,片选信号也相应给出,并且锁存当前地址线上地址信息. 再经过Tcso时间后,处理器给出当前 ...

  5. Multipatch对象

    Multipatch对象是 TriangleStrip 和TriangleFan, Trangle,Ring对象的集合 TriangleStrip TriangleFan Trangle

  6. myFocus焦点图插件

    注意 1.焦点图初始化ID和图片最外层ID保持一致 2.图片列表外面必须包裹一个div,且id必须为pic http://demo.jb51.net/js/myfocus/tutorials.html ...

  7. QT皮肤框架-TQUI

    本皮肤框架的相关文档,请在附件中下载,包括测试程序源码,帮助文档.相关文档可到我的百度网盘中下载,或者在本贴附件中下载. 百度网盘地址:TQUI-V1.0项目说明及测试程序源码 项目更新说明:---- ...

  8. 数组length属性的一些特性

    ~~·数组的length属性是可读写的 var colors = ["blue","red","green"];colors.length ...

  9. mongoDB入门必读(概念与实战并重)

    一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是 ...

  10. 【进阶3-5期】深度解析 new 原理及模拟实现(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/24 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的 ...