安装rabbitmq-server

总共有3台虚拟机,都安装有rabbitmq服务,安装过程可参考:

【rabbitmq】Centos7 下安装rabbitmq

创建用户和vhost

说明: 此步骤不是必须的,文章后面的用户和vhost可能与此步骤创建的不一致,此处仅仅是创建的示例。

rabbitmqctl add_vhost /my_vhost

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator #管理员权限 # rabbitmqctl set_permissions [-p vhost] [user] [permission ⇒ (modify) (write) (read)]
rabbitmqctl set_permissions -p /my_vhost admin ".*" ".*" ".*" rabbitmqctl list_permissions -p /my_vhost

机器列表

机器 ip /etc/hostname /etc/hostname 说明
node1 192.168.35.135 rmq-node1 rmq-node1 作为首节点
node2 192.168.35.136 rmq-node2 rmq-node2 加入node1集群
node3 192.168.35.137 rmq-node3 rmq-node3 加入node1集群

注意:修改/etc/hostname为上述表格中的值

# node1执行
[root@rmq-node1 ~]# rabbitmqctl status
Status of node 'rabbit@rmq-node1'
... # node2执行
[root@rmq-node2 ~]# rabbitmqctl status
Status of node 'rabbit@rmq-node2'
... # node3执行
[root@rmq-node3 ~]# rabbitmqctl status
Status of node 'rabbit@rmq-node3'
...

搭建集群环境

保证magic cookie相同

rabbitmq使用erlang编写,erlang天然具有分布式特性,为了是各erlang节点能够互相通信,需要保证 magic cookie相同;

将node1中的cookie复制到node2和node3

# node2和 node3上分别执行
scp root@192.168.35.135:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie

现在3个node上的.erlang.cookie都是相同的;

注意点

  1. 需要保证.erlang.cookie的默认权限为:400;
  2. 所有用户和组为 rabbitmq
chmod 400 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

修改hosts文件

# 3个节点都要修改 hosts文件
vi /etc/hosts # 添加
192.168.35.135 rmq-node1
192.168.35.136 rmq-node2
192.168.35.137 rmq-node3

在每个节点上,都保证能ping通

ping rmq-node1
ping rmq-node2
ping rmq-node3

将node2节点和node3节点加入集群

node2和node3加入集群前,node1的状态

[root@rmq-node1 ~]# rabbitmqctl  cluster_status
Cluster status of node 'rabbit@rmq-node1'
[{nodes,[{disc,['rabbit@rmq-node1']}]}, //此时只有一个节点
{running_nodes,['rabbit@rmq-node1']},
{cluster_name,<<"rabbit@rmq-node1">>},
{partitions,[]},
{alarms,[{'rabbit@rmq-node1',[]}]}]

说明:上面的rabbit@rmq-node1就是后面node2和node3要加入的首节点信息

node2作为disk节点

未加入之前

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

加入集群

# stop application and reset
rabbitmqctl stop_app
rabbitmqctl reset #join in cluster (specify only hostname, not with FQDN)
rabbitmqctl join_cluster rabbit@rmq-node1 # start application
rabbitmqctl start_app # show status
rabbitmqctl cluster_status

查看状态:

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

node3作为ram节点

未加入之前

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

加入集群

# stop application and reset
rabbitmqctl stop_app
rabbitmqctl reset #join in cluster (specify only hostname, not with FQDN)
rabbitmqctl join_cluster rabbit@rmq-node1 --ram # start application
rabbitmqctl start_app # show status
rabbitmqctl cluster_status

加入集群后的状态

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

登录界面查看集群状态

http://192.168.35.135:15672/#/


相关概念

epmd

erlang port monitor deamon: 负责集群中节点ip和port的监控;

集群间node的发现都是通过该后台程序来完成的;

Mnesia

这是erlang的分布式数据库,用于存储queue、exchange、binding等信息;


网络分区(network partitions)

可参考: https://www.cnblogs.com/ssslinppp/p/9470962.html


其他运维操作

日志文件

/var/log/rabbitmq/xxxx.log

将某个node从集群中删除

rabbitmqctl forget_cluster_node rabbit@node-1  //这个属于硬删除

将node1节点删除后,若是重新加入该集群,可能报错,如:

inconsistent_cluster,"Node 'rabbit@node-1' thinks it's clustered with node 'rabbit@node-3', but 'rabbit@node-3' disagrees"}}

原因:

从node-1的启动报错来看,像是集群信息残留;

在node-2上操作将node-1移除集群,node-1的rabbitmq服务已经down掉了,所以数据库无法同步更新,记载的仍是旧的集群信息(数据库记录里自身节点仍属于集群)

而node-2和node-3的数据库记录已经更新(数据库信息里面集群不包含node-1节点了)

解决方式

删除node-1的数据库记录

rm -rf /var/lib/rabbitmq/mnesia/*

出现的错误

1. 启动失败:rabbitmq-server.service: control process exited, code=exited status=75

journalctl -xe

# 错误信息如下
Aug 08 19:25:44 localhost.localdomain systemd[1]: rabbitmq-server.service: control process exited, code=exited status=75
Aug 08 19:25:44 localhost.localdomain systemd[1]: Failed to start RabbitMQ broker.
-- Subject: Unit rabbitmq-server.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit rabbitmq-server.service has failed.
--
-- The result is failed.
Aug 08 19:25:44 localhost.localdomain systemd[1]: Unit rabbitmq-server.service entered failed state.
Aug 08 19:25:44 localhost.localdomain systemd[1]: rabbitmq-server.service failed.
Aug 08 19:25:44 localhost.localdomain polkitd[902]: Unregistered Authentication Agent for unix-process:3504:33878 (system bus name :1.17, object path /org/freedesktop/PolicyKit1/Aut
[root@localhost mnesia]# journalctl -xe

解决方式:

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
rm -rf /var/lib/rabbitmq/mnesia/*

【rabbitmq】rabbitmq集群环境搭建的更多相关文章

  1. Kafaka高可用集群环境搭建

    zk集群环境搭建:https://www.cnblogs.com/toov5/p/9897868.html 三台主机每台的Java版本1.8 下面kafka集群的搭建:  3台虚拟机均进行以下操作:  ...

  2. Hadoop+Spark:集群环境搭建

    环境准备: 在虚拟机下,大家三台Linux ubuntu 14.04 server x64 系统(下载地址:http://releases.ubuntu.com/14.04.2/ubuntu-14.0 ...

  3. 项目进阶 之 集群环境搭建(三)多管理节点MySQL集群

    上次的博文项目进阶 之 集群环境搭建(二)MySQL集群中,我们搭建了一个基础的MySQL集群,这篇博客咱们继续讲解MySQL集群的相关内容,同时针对上一篇遗留的问题提出一个解决方案. 1.单管理节点 ...

  4. Spark 1.6.1分布式集群环境搭建

    一.软件准备 scala-2.11.8.tgz spark-1.6.1-bin-hadoop2.6.tgz 二.Scala 安装 1.master 机器 (1)下载 scala-2.11.8.tgz, ...

  5. hadoop集群环境搭建之zookeeper集群的安装部署

    关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...

  6. hadoop集群环境搭建之安装配置hadoop集群

    在安装hadoop集群之前,需要先进行zookeeper的安装,请参照hadoop集群环境搭建之zookeeper集群的安装部署 1 将hadoop安装包解压到 /itcast/  (如果没有这个目录 ...

  7. hadoop集群环境搭建准备工作

    一定要注意hadoop和linux系统的位数一定要相同,就是说如果hadoop是32位的,linux系统也一定要安装32位的. 准备工作: 1 首先在VMware中建立6台虚拟机(配置默认即可).这是 ...

  8. Ningx集群环境搭建

    Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...

  9. hadoop2集群环境搭建

    在查询了很多资料以后,发现国内外没有一篇关于hadoop2集群环境搭建的详细步骤的文章. 所以,我想把我知道的分享给大家,方便大家交流. 以下是本文的大纲: 1. 在windows7 下面安装虚拟机2 ...

  10. [转]ZooKeeper 集群环境搭建 (本机3个节点)

    ZooKeeper 集群环境搭建 (本机3个节点) 是一个简单的分布式同步数据库(或者是小文件系统) ------------------------------------------------- ...

随机推荐

  1. java多态——基础

    多态 定义: 一个接口,多种实现,就是多种状态     价值: 特点:多态存在的特点,就是必须要有继承.覆盖.父类变量调用子类对象 场景: 首先检查父类中是否有该方法,如果没有,则编译错误:如果有,则 ...

  2. VS2017 nlog源码查看报错

    最近下载nlog的源码学习,打开解决方案以后无法编译. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sd ...

  3. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  4. 深度学习(pytorch)-1.基于简单神经网络的图片自动分类

    这是pytorch官方的一个例子 官方教程地址:http://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-b ...

  5. SQL 姓名,联系方式-脱敏

    SELECT ORDER_PROJECT.project_type AS attribute, ORDER_PROJECT.order_num, ,), "*") AS pv, C ...

  6. 实现鼠标悬停,div勾画div边框的动画

    鼠标悬浮,边框div边框的动画样式,效果图如下: 首先定义div及其样式: <style> .show { width:300px; height:200px; border:1px so ...

  7. Linux系统安装与初用

    1.结合实验尝试,并查阅资料,总结在实验准备中提出的7个问题. (1).Linux的发行版本.内核版本:二者区别与联系. 核心版本主要是Linux的内核,发行版本是各个公司推出的版本,他们与核心版本是 ...

  8. zuul源码(2)

    路由 路由是网关的核心功能,既然在spring的框架下,那就要按Spring的规矩来. 路由规则类:org.springframework.cloud.netflix.zuul.filters.Rou ...

  9. 台达VFD-B变频器调试

    一.变频器上电调试 变频器安装完成后,断开变频器的输出,在没通电前先使用数字表的二极管档对变频器的输入输出进行测量,确保无短路情况,然后接通变频器工作电源,(注意变频器标定的工作电源电压与外部输入电压 ...

  10. EmptyBeanUtil

    package com.rscode.credits.util; import java.util.List; /** * * 判断实体是否为空 * @author tn * */ public cl ...