安装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. 【原创】Proxmark3系列教程1——PM3用法

    1 PM3介绍 proxmark3是一款开源的RFID安全研究平台黑色按钮从图中我们可以看到左上方有一颗黑色按钮,这个按钮就是Proxmark3的功能键,主要用于启动嗅探模式以及停止进程功能,其中内置 ...

  2. linux查找指定目录文件大小

    #遍历查询 /users/yyqh01/ 目录下的文件目录大小,按M打印大小 for i in $(echo /users/yyqh01/*/) ; do [ "$i" != &q ...

  3. session的部分理解

    定义 Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session ...

  4. 常用vi编辑器命令

    对于VI的命令行,不需要特意的去记忆,写下来,让要用到的时候能找到就行 游标控制 h 游标向左移 j 游标向下移 k 游标向上移 l (or spacebar) 游标向右移 w 向前移动一个单词 b ...

  5. LeetCode第一次刷题

    感觉自身编程水平还是差很多,所以刷刷题 LeetCode貌似是一个用的人比较多的题库,下面是第一题 给数组和目标和求需要元素的下标 public class Solution { public int ...

  6. [LeetCode&Python] Problem 415. Add Strings

    Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...

  7. office2013 Word 缺少校对工具,按提示下载、安装了文件还是不成功的解决方案

    找到你的office安装源iso镜像加载 ——点开镜像双击setup.exe ——选择添加或删除功能 ——下一步——其他的不要动,展开office共享功能项 ——找到校对工具点出下拉项(点朝下的黑色箭 ...

  8. Golang基本语法

    (1) 全局变量与局部变量 首先,得了解go代码块,也就是"{}",代码块外面访问不到代码块里面的变量. 在go语言里,变量民首写字母为大写则是全局变量,首写字母小写则是局部变量. ...

  9. 陈斌python语言基础与应用00

    软件改变生活:购物.餐饮.商旅出行.资料查找... Everybody in this country should learn how to program a computer...because ...

  10. flume实现kafka到hdfs测试用例

    kafka 到hdfs at1.sources =st1 at1.channels = ct1 at1.sinks = kt1 # For each one of the sources, the t ...