rabbitmq基础4——单机多节点集群、多机集群部署、基础功能测试

news2024/11/17 12:27:24

文章目录

  • 一、一机多实例集群
    • 1.1 三机启动
    • 1.2 立主纳从
    • 1.3 查看集群状态
    • 1.4 web监控
    • 1.5 测试
      • 1.5.1 数据同步
      • 1.5.2 一从死,主仍战
      • 1.5.3 从复活,死亡期间数据同步
      • 1.5.4 主死,从活但不可用
  • 二、多机集群
    • 2.1 确定主机名
    • 2.2 三机部署rabbitmq
    • 2.3 设主纳从
    • 2.4 开启web插件
    • 2.5 新建用户,赋权限
    • 2.6 web监控
    • 2.7 测试
      • 2.7.1 正常关闭时,最后关闭的节点需要第一个启动
      • 2.7.2 异常断电

一、一机多实例集群

一机多实例,顾名思义就是在一台机器上面部署多个rabbitmq服务组成集群。RabbitMQ的单机多节点配置大多用于实验性论证,安全性和高可用性太低。

  • 需要注意,每个rabbitmq节点名称、内部端口、插件端口等信息不能冲突。

1.1 三机启动

参照前面章节,先部署erlang环境、安装rabbitmq服务,再开始做以下步骤。

1.启动第一个节点,第一个节点名称为rabbitmq_1,监听端口为5672,web页面的端口默认为15672,节点内部通信的端口为25672就不需要使用指定参数多此一举了。

[root@node1 ~]# RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbitmq_1 rabbitmq-server start

在这里插入图片描述
2. 查看第一个节点进程
在这里插入图片描述
3. 启动第二个节点,第二个节点名称为rabbitmq_2,监听端口为5673,web页面的端口默认为15673,节点内部通信的端口为25673。

[root@node1 rabbitmq_2]# RABBITMQ_NODE_PORT=5673  RABBITMQ_DIST_PORT=25673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbitmq_2   rabbitmq-server start

在这里插入图片描述
4. 查看第二个节点进程。
在这里插入图片描述
5. 启动第三个节点,第三个节点名称为rabbitmq_3,监听端口为5674,web页面的端口默认为15674,节点内部通信的端口为25674。

[root@node1 ~]# RABBITMQ_NODE_PORT=5674  RABBITMQ_DIST_PORT=25674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbitmq_3   rabbitmq-server start

在这里插入图片描述

6 查看第三个节点进程。

在这里插入图片描述

1.2 立主纳从

假设把rabbitmq_1当作主节点,rabbitmq_2和rabbitmq_3当作从节点。

1.设置rabbitmq_1为主节点

#停止rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 stop_app

#将rabbitmq_1重置还原到最初状态,包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据、配置的用户、vhost 等,以及删除所有的持久化消息。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 reset

#启动rabbitmq_1节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 start_app

在这里插入图片描述
2. 将rabbitmq_2、rabbitmq_3加入到主节点。

#停止rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 stop_app

#将rabbitmq_2节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 join_cluster rabbitmq_1@node1

#启动rabbitmq_2节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 start_app

#停止rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 stop_app

#将rabbitmq_3节点加入到主节点(rabbitmq_1),“node1”为服务器主机名。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 join_cluster rabbitmq_1@node1

#启动rabbitmq_3节点应用服务。
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 start_app

在这里插入图片描述

1.3 查看集群状态

[root@node1 ~]# rabbitmqctl cluster_status -n rabbitmq_1

在这里插入图片描述

1.4 web监控

  1. 开启web插件
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
  1. 此时用15672、15673、15674三个端口都可以访问到web界面。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.新建用户,设置密码,指定角色,添加权限。

#给主节点添加baimu用户,密码为citms。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 add_user baimu citms

#将主节点的baimu用户设置成administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_user_tags baimu administrator

#给主节点的baimu用户添加权限。可配置、可写、可读。
[root@node1 ~]# rabbitmqctl -n rabbitmq_1 set_permissions -p / baimu ".*" ".*" ".*"


同时也给其他两个从节点添加用户,授权,不然15673和15674页面登陆不了。
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_2 set_permissions -p / baimu ".*" ".*" ".*"
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 add_user baimu citms
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_user_tags baimu administrator
[root@node1 ~]# rabbitmqctl -n rabbitmq_3 set_permissions -p / baimu ".*" ".*" ".*"

在这里插入图片描述
4. 使用创建的用户密码分别登录IP:15672、IP:15673、IP:15674。

在这里插入图片描述

1.5 测试

1.5.1 数据同步

  1. 主节点创建一个交换器和队列,并绑定,发送消息“武汉”。

在这里插入图片描述
在这里插入图片描述
2. 从节点查看消息“武汉”,主从消息同步。

在这里插入图片描述

1.5.2 一从死,主仍战

其中一个从节点宕机后,不影响主节点的写入,也不营销那个其余存活的从节点数据同步。

  1. 将rabbitmq_2从节点停掉。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 stop_app

在这里插入图片描述

  1. IP:15673访问不了,但是主节点依然可以写入,rabbitmq_3从节点依然可以消息同步。

在这里插入图片描述
在这里插入图片描述

1.5.3 从复活,死亡期间数据同步

  1. 将rabbitmq_2从节点启动。
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_2 start_app
Starting node rabbitmq_2@node1 ...
  1. IP:15673恢复访问,死掉期间主节点写入的“beijing”数据依然可以读出来。

在这里插入图片描述

1.5.4 主死,从活但不可用

  1. 停止rabbitmq_1主节点
[root@node1 mnesia]# rabbitmqctl -n rabbitmq_1 stop_app
Stopping rabbit application on node rabbitmq_1@node1 ...
  1. rabbitmq_2等从节点已让可以访问,但是无法数据写入。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、多机集群

2.1 确定主机名

准备三台服务器,并修改主机名,最好是能一眼看出哪个节点的。
如图:

  • 192.168.130.129为第一个节点,主机名为node1;
  • 192.168.130.130为第二个节点,主机名为node2;
  • 192.168.130.131为第三个节点,主机名为node3。

在这里插入图片描述

  1. 编辑各节点的/etc/hosts文件,在其上添加IP 地址与节点名称的映射信息。
[root@node1 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3

[root@node2 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3


[root@node3 ~]# tail -3 /etc/hosts
192.168.130.129 node1
192.168.130.130 node2
192.168.130.131 node3

在这里插入图片描述

2.2 三机部署rabbitmq

第一步,分别在三台机器上部署rabbitmq服务,怎么来部署可以参考第二章节,这里我就提前部署好了。各节点的erlang和rabbitmq版本需一致。可以设置rabbitmq-enc.conf变量文件来定义我们想要的信息。

  • 第一个节点信息。

在这里插入图片描述

  • 第二个节点信息。

在这里插入图片描述

  • 第三个节点信息

在这里插入图片描述

  • 各节点启动正常,可以直接后台运行:rabbitmq-server -detached。

在这里插入图片描述

第二步,把所有节点的rabbitmq停掉,将node1节点的cookie文件内容复制替换node2、node3节点上的cookie文件,以确保各个节点的 cookie 文件使用的是同一个值。

  • cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookie ,或者在$HOME/.erlang.cookie。
  • 二进制安装的rabbitmq服务,.erlang.cookie文件在/root/目录下面,是个隐藏文件。
  • cookie文件权限必须是400,不然启动时会报错。
  • 第一个节点

在这里插入图片描述

  • 第二个节点

在这里插入图片描述

  • 第三个节点

在这里插入图片描述

第三步,三节点的.erlang.cookie文件内容替换统一后,依次启动各节点rabbitmq服务,必须保证每个节点的rabbitmq服务运行正常。

  • 如果遇到启动异常,应该是在第一步先启动了未停止好,导致有端口占用,可以用 lsof -i:25672命令查看进程,将其杀掉,再重新启动就可以了。
  • 问题:
    在这里插入图片描述
  • 解决:
    在这里插入图片描述
  1. 查看各节点运行状态。
  • 第一个节点运行正常

在这里插入图片描述

  • 第二个节点运行正常

在这里插入图片描述

  • 第三个节点运行正常

在这里插入图片描述
2. 查看各节点集群信息

  • node1节点。

在这里插入图片描述

  • node2节点

在这里插入图片描述

  • node3节点

在这里插入图片描述

2.3 设主纳从

这里把node1名为主节点,node2和node3为从节点,操作步骤和前面差不多。

1.主节点不用做任何操作,分别在node2和node3机器上进行加入集群操作,先把node2节点加进来。

# 把node2节点加入到node1节点,组成以node1为主、node2为从的集群。
[root@node2 ~]# rabbitmqctl stop_app
[root@node2 ~]# rabbitmqctl reset
[root@node2 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node2 ~]# rabbitmqctl start_app


在这里插入图片描述
2. 分别在node1和node2上查看集群状态,此时node1和node2已经组成集群。

在这里插入图片描述
3. 将node3加入node1。

# 把node3节点加入到node1节点,组成以node1为主、node3为从的集群。
[root@node3 ~]# rabbitmqctl stop_app
[root@node3 ~]# rabbitmqctl reset
[root@node3 ~]# rabbitmqctl join_cluster rabbitmq_1@node1
[root@node3 ~]# rabbitmqctl start_app

在这里插入图片描述
4.分别在node1和node3上查看集群状态,此时node1、node2、node3已经组成集群。

在这里插入图片描述

2.4 开启web插件

每个节点上都需要开启。

[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management

[root@node2 ~]# rabbitmq-plugins enable rabbitmq_management

[root@node3 ~]# rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

2.5 新建用户,赋权限

只需要在主节点执行就可以了。

#创建一个qingjun用户,密码为citms。
[root@node1 ~]# rabbitmqctl add_user qingjun citms

#给qingjun用户设为administrator角色,拥有最高权限。
[root@node1 ~]# rabbitmqctl set_user_tags qingjun administrator

#给qingjun用户授权,可操作、可写、可读。
[root@node1 ~]# rabbitmqctl set_permissions -p / qingjun ".*" ".*" ".*"

在这里插入图片描述

2.6 web监控

通过web页面可以只管看到集群状态。

在这里插入图片描述

2.7 测试

2.7.1 正常关闭时,最后关闭的节点需要第一个启动

  • 如果关闭了集群中的所有节点,则需要确保在启动的时候最后关闭的那个节点是第一个启动的。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的节点启动。
  • 比如,现在依次关闭node1、node2、node3节点,node3节点是最后关闭的,那么启动的时候需要先启动node3节点。若先启动node1或者node2,会一致等待node3节点启动,等待多久有个机制,后面再讲,咱们先来测试下效果。

1.依次关闭node1、node2、node3节点。

[root@node1 rabbitmq]# rabbitmqctl stop
Stopping and halting node rabbitmq_1@node1 ...

[root@node2 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_2@node2 ...

[root@node3 ~]# rabbitmqctl stop
Stopping and halting node rabbitmq_3@node3 ...

2.此时先启动node1,node1日志显示一直在启动中,这个时候就是在等待node3节点启动。

在这里插入图片描述
3.此时启动node3节点,node1会过一段时间更新日志,显示服务启动成功。此时node2节点还是死掉状态,所以监控node2节点是红色。

在这里插入图片描述
在这里插入图片描述
4.最后我们启动node2节点,集群恢复。
在这里插入图片描述

在这里插入图片描述

2.7.2 异常断电

  • 如果集群中的所有节点由于某些非正常因素,比如断电而关闭,那么集群中的节点都会认为还有其他节点在它后面关闭,此时需要调用 rabbitmgctl force_boot 命令来启动一个节点,之后集群才能正常启动。
  • 我这里是在虚拟机运行正常的情况下突然关掉电脑来模拟此种情况。

1.电脑关机前,所有节点运行正常。

在这里插入图片描述
2.电脑突然关闭后,所有节点全部停止运行,监控页面不能访问。此时随便启动一个节点显示一直启动中。

在这里插入图片描述

在这里插入图片描述
3.此时执行命令,再次启动node1,就会启动成功,监控页面可以访问。

在这里插入图片描述
在这里插入图片描述
4.此时再去正常启动第二个节点就会启动成功,无论是node2,还是node3。我这里启动的是node2,192.168.130.130:15672监控页面可以访问。

在这里插入图片描述
在这里插入图片描述
5.最后再把第三个节点正常启动起来,恢复集群。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

白话说Java虚拟机原理系列【第二章】:Class字节码文件详解

前导说明: 本文基于《深入理解Java虚拟机》第二版和个人理解完成, 以大白话的形式期望能用大家都看懂的描述讲清楚虚拟机内幕, 后续会增加基于《深入理解Java虚拟机》第三版内容,并进行二个版本的对比。 Class字节码文件的数据结构…

ChatGPT 帮我跑了一个完整的 DevOps 流水线,离了个大谱...

大家好,我是米开朗基杨。上篇文章给大家介绍了👉如何将 N 个 ChatGPT 账号接入微信,今天就来给大家演示一下如何利用 ChatGPT 帮我工作,让自己有更多的时间摸鱼!上篇文章还没看的赶紧去看👇我将 9 个 ChatG…

SpringBoot2核心技术(核心功能)- 05、Web开发【5.3 请求参数处理】

5.3、请求参数处理 0、请求映射 1、rest使用与原理 xxxMapping;Rest风格支持(使用HTTP请求方式动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1…

Google 释出开源软件漏洞扫描工具 OSV-Scanner​

开源开发人员可在项目使用 OSV-Scanner,透过比对依赖项目和 OSV 漏洞资料库,找出项目的依赖项目中所存在的漏洞。Google 推出免费工具 OSV-Scanner(https://github.com/google/osv-scanner),供开源开发人员可以更简单地…

docker网络模式 与 搭建nginx

目录 1. docker网络模式 2. 连接容器的三种方法 3. Docker Networking 3.1 创建网络 3.2 查看宿主机中创建的网络 3.3 删除网络 3.3 如何使用网络 4.搭建Nginx 1.准备工作 1.1 拉取镜像 1.2 在宿主机中创建挂载目录 2.准备2个tomcat 容器集群 3.准备 Nginx配置 3.…

ffmpeg 命令的简单使用

ffmpeg命令是在windows端使用的,使用前,需要先下载对应的 exe文件 1.准备环境 访问FFmpeg官网的下载地址(https://www.gyan.dev/ffmpeg/builds/)下载对应的压缩包,解压后即可使用 2.使用 ffmpeg.exe的使用 • 功能 …

利用Clion编译器完成C++的头文件与源文件的映射

1、前言 嘿嘿,众所周知,本人是一名Java后端人员,那么为什么开始搞C/C了咧? 因为Java是在C/C的基础上开发的语言,而且性能也是业界公认的除了机器语言外最好的编程语言,所以我就想啊,如果将Java…

记一次返工

记一次返工 作者:Grey 原文地址: 博客园:记一次返工 CSDN:记一次返工 本文搬运自自己的博客园博客,发布于 2018-05-12 说明 本周我经历了参加工作以来,最大的一次返工,这一周都是茶饭不思…

安全灵活,华为云桌面成为数字化办公最佳搭档

目前云上数字化办公已经是大势所趋,但是如何快速高效地为用户提供便捷高效的工作和生活体验,依然需要大量的技术投入来实现。而华为云桌面就是云上办公的门户与平台,它可以将各种业务系统在云端进行集中管理与调度,通过统一的接口…

二、collection接口

文章目录Collection接口和常用方法(以ArrayList为例)基本使用方法遍历元素方式1(iterator)遍历元素方式2(增强for)练习Collection接口和常用方法(以ArrayList为例) 以ArrayList,其他集合同理使用 基本使用方法 注:集合添加基本数据类型会自动装箱成对…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.2 run第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run 我们在调试代码时通常会使用go run命令。 该命令会编译执行Go语言源码,不会在当前目录生成可执行文件&#x…

【LeetCode每日一题:1799. N 次操作后的最大分数和~~~记忆化搜索+动态规划+状态压缩+最大公约数】

题目描述 给你 nums ,它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时(操作编号从 1 开始),你需要: 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y 从 nums 中…

07. 渗透测试之针对网站的信息收集

07. 渗透测试之针对网站的信息收集 01 信息收集简介 什么是信息收集 信息收集(Information Gathering)是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步,也是关键的一步。信息收集工作的好坏,会影响整个渗透…

全国各城市疫情达峰进度条感染高峰时间表最新

防疫政策放开之后,多位专家就研判,未来一个多月内全国疫情将达到感染高峰。而近日,一张全国各地疫情进度和最终高峰的预计时间表流传,对各城市首轮感染高峰期进行了预测。那么,全国各城市疫情达峰进度条如何了&#xf…

怎么高效的开发一款成功的产品?Working Backwards

过去的几天一直在回顾整个产品团队过去一年所做的工作,有的工作有亮点,有的工作可以说是乏善可陈。对于不好的,发现其中的一个核心原因就是没有坚持“以终为始”的原则。现将我2021年10月写的一篇公司内部博客再次分享给团队,也分…

Simple Yet Effective Graph Contrastive Learning for Recommendation

1. 摘要 图神经网络(GNN)是一种强大的基于图的推荐系统学习方法。最近,结合对比学习的gnn在处理高度稀疏数据时,在数据增强方案的推荐方面表现出了优异的性能。尽管它们取得了成功,但大多数现有的图对比学习方法要么在用户-项目交互图上执行随…

JAVA零基础小白学习教程之day08_接口多态

day08-JAVAOOP 课程目标 1. 【理解】什么是接口 2. 【掌握】接口的定义格式 3. 【掌握】接口的使用 4. 【理解】接口的成员特点 5. 【理解】类和接口 抽象类和接口之间的关系 6. 【掌握】单继承多实现 7. 【理解】接口之间的多继承 8. 【掌握】接口的案例 9. 【理解】什么是…

一个程序员的新冠防护最佳实践

至今未阳,做了几次抗原检测都是阴性,所以把个人的防护经验给广大程序员朋友分享一下,尤其家里有小孩老人的可以参考一下。 我一天的防护操作 1、午餐 吃午饭时,走楼梯不去挤电梯,而且是在其他人吃完饭后&#xff0c…

Unreal Engine中调试常用方法

目录 常用调试方法 AddOnScreenDebugMessage UE_LOG:在控制台看调试信息 在蓝图中直接调用PrintString 自定义日志分类 声明 定义 简化日志输出的宏 日志格式化输出 常用调试方法 在虚幻引擎中常用的打印日志方法有三种,分别是:UE_…

C++运算符重载,匿名对象

目录 1、加号运算符重载 1.1 通过自己写成员函数,实现两个对象相加属性后返回新的对象 1.2通过成员函数实现加法运算符重载 1.3通过全局函数实现加法运算符重载,运算符重载也可以发生函数重载 1.4总结--对于内置的数据类型的表达式运算符是不可以改变…