(三)RabbitMQ集群(Ⅰ)

原创 2018年04月16日 11:17:16
RabbitMQ集群(Ⅰ)

安装RabbitMQ:https://blog.csdn.net/ycj_xiyang/article/details/79926586

RabbitMQ集群(Ⅱ):https://blog.csdn.net/YCJ_xiyang/article/details/79958507

什么是集群?什么是分布式?

    分布式:一个业务分拆多个子业务,部署在不同的服务器上
    集群:同一个业务,部署在多个服务器上 

RabbitMQ基于erlang语言开发,而erlang是一门分布式语言开发,适用于集群开发;rabbitmq自身也提供了多种集群方案:http://www.rabbitmq.com/ha.html 

  1.集群管理:没有明显的主从,主要的是disk和ram节点的区别
  2.做集群的需求:不支持跨网段(erlang限制)
  3.集群类型:普通集群、镜像集群
    普通集群:结构同步,消息实体只存在一个节点中,但consumer在非消息节点获取是,节点间存在消息拉取,易产生性能瓶颈。
    镜像集群:集群中一个master,负责调度,处理消息实体,其他节点保存一份数据到本地;性能主要靠master承载。
  4.持久化,分两部分:
    Rabbitmq服务器配置持久化:默认的就是持久化(disc类型);
    代码持久化:默认情况下,代码创建的消息队列和存放在队列里的消息都是非持久化的,需要在建立队列时指定。

启动节点

    一共三种启动方式

        一般启动:service rabbitmq-server satrt

[root@192 rabbitmq]# service rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.

        前台启动:rabbitmq-server

[root@192 rabbitmq]# rabbitmq-server

              RabbitMQ 3.5.6. Copyright (C) 2007-2015 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@localhost.log
  ######  ##        /var/log/rabbitmq/rabbit@localhost-sasl.log
  ##########
              Starting broker... completed with 0 plugins.

                         如果当前的窗口终结,则这个服务会退出

        后台启动:rabbitmq-server -detached

[root@192 rabbitmq]# rabbitmq-server  -detached  
Warning: PID file not written; -detached was passed.
[root@192 rabbitmq]# echo $?
0
[root@192 rabbitmq]# 

同步Erlang cookie

    集群中node必须使用相同的cookie才能相互通讯

        cookie的位置一般在 /var/lib/rabbitmq/.erlang.cookie(内容任意)

查看集群的状态

    rabbitmqctl cluster_status    

[root@h101 ~]# rabbitmqctl  cluster_status
Cluster status of node rabbit@h101 ...
[{nodes,[{disc,[rabbit@h101]}]},
 {running_nodes,[rabbit@h101]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h101 ~]# 
[root@h102 ~]# rabbitmqctl  cluster_status
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h102]}]},
 {running_nodes,[rabbit@h102]},
 {cluster_name,<<"rabbit@h102.temp">>},
 {partitions,[]}]
[root@h102 ~]# 

创建集群

    集群中node是平等的,新node可以选择任意一个节点加入

    加入集群分三步(更多的节点加入也是一样的方法)

        首先关闭本地应用 rabbitmqctl stop_app

[root@h101 ~]# rabbitmqctl  stop_app 
Stopping node rabbit@h101 ...

        加入集群 rabbitmqctl join_cluster 节点名

[root@h102 ~]# rabbitmqctl join_cluster  rabbit@h101
Clustering node rabbit@h102 with rabbit@h101 ...
[root@h102 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]}]
[root@h101 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@h101 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h101]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h101 ~]# 

        启动应用 rabbitmqctl start_app

[root@h102 ~]# rabbitmqctl  start_app
Starting node rabbit@h102 ...
[root@h102 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h101,rabbit@h102]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h102 ~]# 
[root@h101 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@h101 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h102,rabbit@h101]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h101 ~]# 

重启集群node

    加入集群的节点可以任意关停、下线或宕机

关闭h101

[root@h101 ~]# rabbitmqctl  stop 
Stopping and halting node rabbit@h101 ...
[root@h101 ~]# 

h101上的日志

=INFO REPORT==== 23-Mar-2018::22:19:33 ===
Stopping RabbitMQ

=INFO REPORT==== 23-Mar-2018::22:19:33 ===
stopped TCP Listener on [::]:5672

=INFO REPORT==== 23-Mar-2018::22:19:33 ===
Stopped RabbitMQ application

=INFO REPORT==== 23-Mar-2018::22:19:33 ===
Halting Erlang VM
h102上的日志
=INFO REPORT==== 23-Mar-2018::22:19:33 ===
rabbit on node rabbit@h101 down

=INFO REPORT==== 23-Mar-2018::22:19:33 ===
Keep rabbit@h101 listeners: the node is already back

=INFO REPORT==== 23-Mar-2018::22:19:34 ===
node rabbit@h101 down: connection_closed

h102上的集群状态

[root@h102 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h102]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h102 ~]# 

启动h101

[root@h101 ~]# /etc/init.d/rabbitmq-server start 
Starting rabbitmq-server: SUCCESS
rabbitmq-server.
[root@h101 ~]#

h102上的日志

=INFO REPORT==== 23-Mar-2018::22:26:04 ===
node rabbit@h101 up

=INFO REPORT==== 23-Mar-2018::22:26:05 ===
rabbit on node rabbit@h101 up

h102上的集群状态

[root@h102 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h101,rabbit@h102]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h102 ~]# 

h101上的集群状态

[root@h101 ~]#  rabbitmqctl cluster_status 
Cluster status of node rabbit@h101 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h102,rabbit@h101]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h101 ~]# 

拆分集群

    本地退出

        移除某个node分三步

            停止本地应用 rabbitmqctl stop_app

[root@h102 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h101,rabbit@h102]}]},
 {running_nodes,[rabbit@h101,rabbit@h102]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h102 ~]# rabbitmqctl stop_app 
Stopping node rabbit@h102 ...

            重启node rabbitmqctl reset

[root@h102 ~]# rabbitmqctl reset
Resetting node rabbit@h102 ...

            启动应用 rabbitmqctl start_app

[root@h102 ~]# rabbitmqctl start_app
Starting node rabbit@h102 ...
[root@h102 ~]# rabbitmqctl cluster_status 
Cluster status of node rabbit@h102 ...
[{nodes,[{disc,[rabbit@h102]}]},
 {running_nodes,[rabbit@h102]},
 {cluster_name,<<"rabbit@h102.temp">>},
 {partitions,[]}]
[root@h102 ~]# 

    远程剔除

            无法响应的node,一段时间里无法交互,可以从集群中剔除

                首先停掉本地应用 rabbitmqctl stop_app

[root@h101 ~]# rabbitmqctl stop_app
Stopping node rabbit@h101 ...
[root@h101 ~]# 

                在另一个服务上进行剔除 rabbitmqctl forget_cluster_node 无法响应的节点名

[root@h102 ~]# rabbitmqctl forget_cluster_node rabbit@h101
Removing node rabbit@h101 from cluster ...
[root@h102 ~]# 

               此时在另一个服务上无法响应的节点已经剔除,但是无法响应的节点还认为自己是集群的一部分,一旦它的应用恢复,它会尝试与集群联络,从而报错

[root@h101 ~]# rabbitmqctl start_app
Starting node rabbit@h101 ...


BOOT FAILED
===========

Error description:
   {error,{inconsistent_cluster,"Node rabbit@h101 thinks it's clustered with node rabbit@h102, but rabbit@h102 disagrees"}}

Log files (may contain more information):
   /var/log/rabbitmq/rabbit@h101.log
   /var/log/rabbitmq/rabbit@h101-sasl.log

Stack trace:
   [{rabbit_mnesia,check_cluster_consistency,0},
    {rabbit,'-start/0-fun-0-',0},
    {rabbit,start_it,1},
    {rpc,'-handle_call_call/6-fun-0-',5}]

Error: {error,{inconsistent_cluster,"Node rabbit@h101 thinks it's clustered with node rabbit@h102, but rabbit@h102 disagrees"}}
[root@h101 ~]#

     解决的办法是  一旦有机会连上无法响应的节点,就对它进行重置

[root@h101 ~]# rabbitmqctl reset
Resetting node rabbit@h101 ...
[root@h101 ~]# rabbitmqctl start_app 
Starting node rabbit@h101 ...
[root@h101 ~]# rabbitmqctl cluster_status  
Cluster status of node rabbit@h101 ...
[{nodes,[{disc,[rabbit@h101]}]},
 {running_nodes,[rabbit@h101]},
 {cluster_name,<<"rabbit@h101.temp">>},
 {partitions,[]}]
[root@h101 ~]# 

                  

                 

rabbimq集群关闭 启动 重置

rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl cluster rabbit@platform-api2 rabbitmqc...
  • joeyon
  • joeyon
  • 2015-01-02 10:17:08
  • 1902

rabbitmq 集群功能讲解

看了很多关于rabbitmq集群的文章,感觉官网写的太抽像,并且个别地方如果不是elrong开发人员根本就了解不到,通过各地方收集,大致了解rabbitmq集群的二种方式: 普通模式:默认的集群模式...
  • u010029983
  • u010029983
  • 2015-04-28 16:09:23
  • 3015

工作心得(三)——初识RabbitMQ,RabbitMQ的安装和集群配置

最近被公司派去研究新技术,RabbitMQ队列服务,用来替换公司正在使用的Redis队列,至于为什么准备使用RabbitMQ而要弃用redis,这里我就不细说了,网上自己去查查资料吧,萝卜白菜各有所爱...
  • Tomoyolq
  • Tomoyolq
  • 2016-11-09 16:31:00
  • 1197

RabbitMQ集群搭建与测试

由于项目工作的要求,需要用到RabbitMQ的集群相关的功能,所以就花时间去了解,测试了一下,暂时只是完成了第一步集群的搭建使用,以及集群的负载均衡管理,中间也绕过一些弯路,幸好这个东西玩过的人还是比...
  • autumnfrog
  • autumnfrog
  • 2016-04-15 15:49:49
  • 5359

深度解析RabbitMQ集群

摘要:OpenStack已经在很多大型企业里支撑起核心生产业务,这都源于OpenStack中的核心技术与架构,超大规模高可用OpenStack平台核心技术深入解析系列文章,主要介绍了EasyStack...
  • hu2010shuai
  • hu2010shuai
  • 2016-10-27 15:38:26
  • 2105

RabbitMQ学习之集群部署

我们先搭建一个普通集群模式,在这个模式基础上再配置镜像模式实现高可用,Rabbit集群前增加一个反向代理,生产者、消费者通过反向代理访问RabbitMQ集群。 架构图如下:...
  • tianwei7518
  • tianwei7518
  • 2014-11-09 01:01:30
  • 2726

RabbitMQ分布式集群架构

8 ##RabbitMQ分布式集群架构 9 10 ###(一) 功能和原理 11 设计集群的目的 12 - 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 13 ...
  • WoogeYu
  • WoogeYu
  • 2016-04-13 18:07:01
  • 39785

windows上运行rabbitmq集群

概述在windows 10上实现运行rabbitmq cluster,含三个节点,并能同时启用rabbitmq_management插件,实现web管理。rabbitmq版本为:rabbitmq-se...
  • evilant
  • evilant
  • 2017-08-03 09:57:25
  • 416

RabbitMQ 集群之镜像同步

转载地址:http://www.cnblogs.com/LiangSW/p/6242280.html mirrored 在上个博文中讲到了如果做集群,那么集群是成功了,但是queue是...
  • CsethCRM
  • CsethCRM
  • 2017-06-26 13:03:00
  • 941

RabbitMQ 高可用:在 Windows 搭建镜像集群

RabbitMQ 高可用:在 Windows 搭建镜像集群
  • kk185800961
  • kk185800961
  • 2017-02-17 21:47:13
  • 1433
收藏助手
不良信息举报
您举报文章:(三)RabbitMQ集群(Ⅰ)
举报原因:
原因补充:

(最多只允许输入30个字)