【rabbitmq】rabbitmq集群环境搭建
安装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都是相同的;
注意点:
- 需要保证
.erlang.cookie的默认权限为:400; - 所有用户和组为
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集群环境搭建的更多相关文章
- Kafaka高可用集群环境搭建
zk集群环境搭建:https://www.cnblogs.com/toov5/p/9897868.html 三台主机每台的Java版本1.8 下面kafka集群的搭建: 3台虚拟机均进行以下操作: ...
- Hadoop+Spark:集群环境搭建
环境准备: 在虚拟机下,大家三台Linux ubuntu 14.04 server x64 系统(下载地址:http://releases.ubuntu.com/14.04.2/ubuntu-14.0 ...
- 项目进阶 之 集群环境搭建(三)多管理节点MySQL集群
上次的博文项目进阶 之 集群环境搭建(二)MySQL集群中,我们搭建了一个基础的MySQL集群,这篇博客咱们继续讲解MySQL集群的相关内容,同时针对上一篇遗留的问题提出一个解决方案. 1.单管理节点 ...
- 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, ...
- hadoop集群环境搭建之zookeeper集群的安装部署
关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...
- hadoop集群环境搭建之安装配置hadoop集群
在安装hadoop集群之前,需要先进行zookeeper的安装,请参照hadoop集群环境搭建之zookeeper集群的安装部署 1 将hadoop安装包解压到 /itcast/ (如果没有这个目录 ...
- hadoop集群环境搭建准备工作
一定要注意hadoop和linux系统的位数一定要相同,就是说如果hadoop是32位的,linux系统也一定要安装32位的. 准备工作: 1 首先在VMware中建立6台虚拟机(配置默认即可).这是 ...
- Ningx集群环境搭建
Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...
- hadoop2集群环境搭建
在查询了很多资料以后,发现国内外没有一篇关于hadoop2集群环境搭建的详细步骤的文章. 所以,我想把我知道的分享给大家,方便大家交流. 以下是本文的大纲: 1. 在windows7 下面安装虚拟机2 ...
- [转]ZooKeeper 集群环境搭建 (本机3个节点)
ZooKeeper 集群环境搭建 (本机3个节点) 是一个简单的分布式同步数据库(或者是小文件系统) ------------------------------------------------- ...
随机推荐
- 【原创】Arduino制作Badusb实践
1.U盘构造 U盘由芯片控制器和闪存两部分组成. 芯片控制器负责与PC的通讯和识别,闪存用来做数据存储: 闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互:固件无 ...
- html之跳转锚
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ubuntu + Nginx 配置全站https访问
最近跟室友要一起搞一个个人公众号,提前想把生态想清楚了,所以准备部署一个网站 正好公司有Microsoft Visual Studio Professional订阅,每个月有50刀免费额度,对于Azu ...
- DatePickerAndroid用法
一.代码/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import ...
- if ,while ,for 的掌握
a)python的缩进和冒号 对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次. 缩进的空 ...
- java-15习题
通过键盘分别输入年份.月份.日把它存储到日期时间对象中,然后计算1000天以后的日期并输出. import java.util.Calendar; import java.util.Scanner; ...
- node.js一行一行的获取txt文件内容
node.js一行一行获取text文件代码: const readline = require('readline');//Readline是Node.js里实现标准输入输出的封装好的模块,通过这个模 ...
- 走过的easyui的坑--datagrid的reload在IE下未刷新
至于为什么要进easyui这个坑,就不多说了. 我现在使用的是1.5这个版本,在用它做一个后台管理系统,项目做到一半,才想起记录这些坑. 1.对于datagrid在reload.load在IE下未刷新 ...
- ROS * 了解学习urdf的内容格式及编写
<?xml version="1.0" ?> 声明文件使用xml描述 <robot name="robot_name">定义这是一个机器 ...
- 寒假作业 pta编程总结3
实验代码: 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X).捕 ...