Rabbit安装(单机及集群,阿里云)

前言

虽然我并不是部署人员,但是自己私人测试环境的各类东东还是得自己安装的。

尤其在规模不大的公司,基本安装部署工作都是后端的份内之事。

那么最令人痛苦的,莫过于自己就是安装大佬教程走,但是就是过不去。尤其是初学者,解决问题的能力,还不足,往往就直接卡死了。

其实还有另外一个问题,那就是很多的教程,包括许多视频的教学,大多采用不真实的环境。要么是多台虚拟机实现集群,要么是一台线上服务器走天下。当然作者们也有着诸多考虑,有的是为了学员可以零成本的感受安装,另一方面学员大多都是学习知识,而不是为了实际应用(真的懂得,又不大需要这个东东)。最重要的是,学习阶段,大部分安装都是单机的,可以满足需求了。

但是,我发现在很多的扣扣群,微信群依然存在着那么一批正式环境安装遇到各类问题,苦求无门的朋友。在我回复之后,部分人提议我可以将这部分经验发出来,帮助更多的人。

所以有了这个系列,我会通过真实的阿里服务器集群(三台),搭建各个中间件的集群等。

最后,由于打马赛克太麻烦了。并且我之后可能会开放安装视频,所以有的IP什么的,我并不方便打马赛克。但是希望你们不要做坏事儿哈。

Rabbit安装概述

简介

RabbitMQ是一款消息中间件,其安装分为:

  • 单机安装(只有一台服务器,上面只有一个RabbitMQ的Broker实例)
  • 多主集群转发数据(即RabbitMQ普通模式):
    • 多机多节点安装(每台服务器一个RabbitMQ的Broker实例)
    • 单机多节点安装(只有一台服务器,上面有多个RabbitMQ的Broker实例)
  • 多主集群同步数据(即RabbitMQ镜像模式)

PS:以后有机会,会科普MQ的基本集群种类(如主从,集群,同步数据,转发数据,混合方案等)

RabbitMQ是基于erlang语言,所以在安装RabbitMQ前,需要安装erlang。

应用

可以通过systemctl指令对RabbitMQ进行操作。

rabbitMQ服务器名:rabbitmq-server

所以可以有如下操作:

启动服务:

sudo systemctl start rabbitmq-server

停止服务:

sudo systemctl stop rabbitmq-server

查看状态:

sudo systemctl status rabbitmq-server

自启动设置:

sudo systemctl enable rabbitmq-server

插件应用

RabbitMQ的一大特色,就是支持诸多插件,其中最广为人知的就是Web管理插件。

开启插件

rabbitmq-plugins enable rabbitmq_management

添加用户

RabbitMQ有一个默认的guest(密码也是guest)用户,但是只能通过localhost访问(即本地访问)。所以需要建立一个新的管理员用户,用于远程访问。

rabbitmqctl add_user admin admin

分配操作权限(管理员)

 rabbitmqctl set_user_tags admin administrator

分配资源权限(所有资源)

rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

安装环境

平台:阿里云

ECS实例规格:ecs.t5-lc1m1.small (性能约束实例)

CPU:单核

内存:1G

硬盘:40G

操作系统:CentOS7.6(已经测试CentOS7.3会出现问题)

购买ECS,用于平时测试,学习的话,四点建议:

  • 只需要购买共享型,比较适合平时用得不多,测试也负担不大,偶尔压测。
  • 如果资金允许,直接购买将长时间,比较划算。日后需要也可以提升配置。
  • 阿里云部分地区有优惠(目前有两个地区)
  • 如果想要尝试集群等操作,并且打算购买多个服务器,请一定要在同一个内网内,这样才可以利用内网通信。

如果还有什么需要的,可以询问我。必要的话,我会更新这里。

防火墙

云服务器的防火墙,部分人将其分为两个。一个是云服务器的firewall,另一个是云平台的安全策略。

阿里云的官方CentOS7.6镜像,是不开启firewall。可以通过systemctl status firewalld来进行确认。

而云平台的安全策略是需要在安全组内进行设置的。这个部分网上很多资料,就不在此赘述了。

而RabbitMQ需要开放4396,5672,15672,25672四个端口。

如果需要的话,可以@我或私信我。如果需求较大,我会回来,在此进行补充。

单机安装

下载安装包

首先是下载。

在阿里云的Linux上可以通过以下方式,进行下载。

erlang(CentOS7)

 wget -P /home/download https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.3/erlang-21.2.3-1.el7.centos.x86_64.rpm

RabbitMQ(CentOS7)

wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm`

但是,由于墙的缘故,阿里云的下载速度会非常感人(大约20kb/s)。

所以,建议有梯子的小伙伴,先下载到本地,再进行上传。

没有梯子的,那就没办法了。算了,我分享一下吧。

erlang(CentOS7):提取码:aee8

RabbitMQ(CentOS7):提取码:84lg

安装

安装erlang

sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm

安装socat

sudo yum install -y socat

安装RabbitMQ

sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm

校验

没有校验的安装是不合理的。

此时,我们可以通过系统服务的方式,启动RabbitMQ服务。

见到如下页面就表示安装OK了。

RabbitMQ普通模式(多机多节点安装):

简单说一下内存节点和磁盘节点。RabbitMQ中硬盘节点负责数据落地,负责将元数据落地到硬盘等工作。而内存节点不会进行元数据到硬盘的落地。所以如果一个集群只有内存节点,那么一旦断电,就彻底GG。另外,建议实际生产,配备多个磁盘节点,避免单点故障。

RabbitMQ的Node名

首先,在安装RabbitMQ之前,需要对阿里云服务器的HostName进行变更。

具体看下图:

我的服务器集群,是node0,node1,node2。有需要的可以改一下。

详细的原因,以及替代方案,会在后面提及。

修改hosts文件

通过以下命令

sudo vim /etc/hosts

修改hosts文件:

::1	localhost	localhost.localdomain	localhost6	localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 172.26.40.223 node0 node0
172.26.40.224 node1 node1
172.26.40.225 node2 node2

前两行,一般为系统默认生成,可以不进行修改。

而后三行,就是我们需要进行修改和添加的。

后三行,首先IP地址,一般采用内网(因为内网速度快)。如果由于某些原因,无法使用内网IP,那就只能外网IP了。后两者其实就是RabbitMQ的节点名,此处等同于服务器的HostName,原因后面再说。

然后,通过SCP,将上述文件同步到所有集群服务器。

sudo scp /etc/hosts root@node1:/etc/

sudo scp /etc/hosts root@node2:/etc/

PS:期间,会需要你输入另外两台服务器的对应密码(否则,岂不是谁都可以向你服务器传文件)。

同步erlang的cookie文件

由于RabbitMQ的集群是基于其实现语言erlang自身的分布式实现。所以我们需要通过同步erlang的cookie文件,来帮助RabbitMQ实现集群。就类似于,大家都有相同的erlang.cookie,表示大家是自己人,可以相互通信。

在node0服务器上,执行以下语句:

scp /var/lib/rabbitmq/.erlang.cookie root@node1:/var/lib/rabbitmq/

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/

防火墙

之前已经介绍了。不再赘述。

集群添加

启动RabbitMQ

通过以下命令,启动所有节点的RabbitMQ实例。

sudo systemctl start rabbitmq-server

将node1添加到集群(node0的集群)

停止RabbitMQ应用(与停止实例是不同的)

rabbitmqctl stop_app

重置RabbitMQ设置

rabbitmqctl reset

加入集群

rabbitmqctl join_cluster rabbit@node0 --ram

PS:集群添加节点成功,应该可以看到如下效果:

启动RabbitMQ应用

rabbitmqctl start_app

校验集群

rabbitmqctl cluster_status

PS:当然,也可以直接从Web管理界面,更直观地看到。

PS:其实,单机模式下,各个节点就是集群。不过是由单个磁盘节点组成的单节点集群。

**重复该过程,将其它节点也添入到node0的集群中。

最终可以在Web管理界面,看到如下效果图,表示RabbitMQ多机多节点集群构建成功。

PS:图中Info中有标明,当前node0为disc节点,而node1与node2为RAM节点。

扩展(改变节点类型)

按照上述的方式,构建出来的集群,是一个磁盘节点+多个内存节点。为了提高可用性。往往需要复数个磁盘节点。所以,这里简单介绍一下切换节点类型的方式。

停止RabbitMQ应用

rabbitmqctl stop_app

改变当前RabbitMQ实例在集群中的节点类型

rabbitmqctl change_cluster_node_type disc

PS:集群节点类型切换成功,应该可以看到如下效果:

启动RabbitMQ应用

rabbitmqctl start_app

PS:集群节点类型修改成功,应该可以看到如下Web管理界面:

常见Bug修复

集群节点添加失败

也就是执行以下语句时,出现异常:

rabbitmqctl join_cluster rabbit@node1 --ram

异常截图:

其实,根本原因就是由于RabbitMQ的节点名称造成的。

其中异常信息,已经明确地说了:Hostname mismatch:XXXXXX

就是由于阿里云的默认HostName是随机生成的,而RabbitMQ的节点名,默认采用了服务器的HostName。

解决方案有两个:

  • 如之前提到的,直接修改阿里云服务器的HostName,一劳永逸。
  • 修改RabbitMQ的默认节点名。在/etc/rabbitmq/rabbitmq-env.conf(初始不存在)增加以下内容:
 NODENAME=node1

节点停止应用失败/无法查看节点集群信息

也就是执行以下语句时,出现异常:

rabbitmqctl stop_app

rabbitmqctl cluster_status

异常截图:



其实这是由于erlang.cookie是在RabbitMQ启动后替换,而导致的冲突。

解决办法:

通过以下命令重启服务即可

systemctl restart rabbitmq-server

RabbitMQ普通模式(单机多节点安装)

由于这个不涉及多个真实服务器,所以比较简单。我就不再赘述。

简单引用一下WizMime大佬的过程。

准备工作

准备一台已经安装好RabbitMQ的机器

启动RabbitMQ

修改默认节点名(非必要),在/etc/rabbitmq/rabbitmq-env.conf增加以下内容

NODENAME=rabbit1

RabbitMQ单机多节点时需要改为手动启动,先停止运行中的RabbitMQ服务。

sudo systemctl stop rabbitmq-server

启动第一个节点

rabbitmq-server -detached

启动第二个节点

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

启动第三个节点

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

将第二个节点rabbit2加入到集群中

停止rabbit2的应用
rabbitmqctl -n rabbit2 stop_app

PS:-n表示针对特定节点进行操作

重置 rabbit2 的设置
rabbitmqctl -n rabbit2 reset
rabbit2 节点加入到 rabbit1的集群中
rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram
启动 rabbit2 节点
rabbitmqctl -n rabbit2 start_app

rabbit3类似操作

校验

通过

rabbitmqctl cluster_status

查看集群状态,看到{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}说明节点已启动成功。

PS:同样也可以从Web管理界面查看。

防火墙

注意防火墙相关配置,尤其这次增加了许多端口。

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15673/tcp --permanent

sudo firewall-cmd --zone=public --add-port=5674/tcp --permanent

sudo firewall-cmd --zone=public --add-port=25674/tcp --permanent

sudo firewall-cmd --zone=public --add-port=15674/tcp --permanent

镜像队列模式集群

其实就是依赖之前实现的多主集群转发数据模式,再通过Web管理页面的一些设置即可实现。

所以不存在部署方面的问题。

Rabbit安装(单机及集群,阿里云)的更多相关文章

  1. Greenplum源码编译安装(单机及集群模式)完全攻略

    公司有个项目需要安装greenplum数据库,让我这个gp小白很是受伤,在网上各种搜,结果找到的都是TMD坑货帖子,但是经过4日苦战,总算是把greenplum的安装弄了个明白,单机及集群模式都部署成 ...

  2. Spark Tachyon编译部署(含单机和集群模式安装)

    Tachyon编译部署 编译Tachyon 单机部署Tachyon 集群模式部署Tachyon 1.Tachyon编译部署 Tachyon目前的最新发布版为0.7.1,其官方网址为http://tac ...

  3. 原创 | 手摸手带您学会 Elasticsearch 单机、集群、插件安装(图文教程)

    欢迎关注笔者的公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注即免费无套路附送 100G 海量学习.面试资源哟!! 个人网站: https://www.exception.site/ ...

  4. Ubuntu16.04安装kubernetes1.13集群

    Ubuntu16.04安装kubernetes1.13集群 最新的安装可以使用以下方式:https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/ ...

  5. 使用docker安装部署Spark集群来训练CNN(含Python实例)

    使用docker安装部署Spark集群来训练CNN(含Python实例) http://blog.csdn.net/cyh_24/article/details/49683221 实验室有4台神服务器 ...

  6. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

  7. Redis之高可用、集群、云平台搭建

    原文:Redis之高可用.集群.云平台搭建 文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Clu ...

  8. 安装spark ha集群

    安装spark ha集群 1.默认安装好hadoop+zookeeper 2.安装scala 1.解压安装包 tar zxvf scala-2.11.7.tgz 2.配置环境变量 vim /etc/p ...

  9. helm安装redis+Sentinel集群搭建

    一.redis集群特点 数据 在多个Redis节点之间自动分片 sentinel特点: 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能 ...

随机推荐

  1. vue项目引入自定义.css的样式文件

    ES6的引入方式: .vue文件中 css文件引入 <template></template> <style scoped> @import "../as ...

  2. JSAPI 基于arcgis_js_api3.3的部署

    JSAPI,即ArcGIS API For JavaScript,是arcgis基于JavaScript环境下的开发包.包含Dojo框架. ||Dojo结构如下:=================== ...

  3. TypeError: Cannot read property '_t' of undefined (VUE + ElementUI + i18n)

    在使用vue的ElementUI库,在多语言时报错: TypeError: Cannot read property '_t' of undefined 错误是在点菜单栏时随机抛出的,F12抓不到,只 ...

  4. js 根据指定的多个索引,删除相应的数组元素。splice + sort

    更新于2018-04-19 var productItems = ["a", "b", "c", "d"]; var i ...

  5. BIOS和CMOS概念整理

    一:什么是BIOS  BIOS(Basic Input Output System),基本输入输出系统.是被写死在主板ROM只读芯片中的一组程序,在开机的时候首先要去读取的一个小程序. 它是我们可以将 ...

  6. day 26 面向对象知识网

    1. 成员 - 变量 - 静态字段,类变量 - 方法 - 类方法 - 静态方法 - 实例方法 - 属性2. 对象的嵌套3. 特殊方法 __init__ new call getitem... add ...

  7. F#周报2019年第48期

    新闻 拥抱可空引用类型 介绍Orleans 3.0 视频及幻灯片 组合的力量 关于.NET:探索新的用于.NET的Azure .NET SDK .NET设计审查:GitHub快速审查 FableCon ...

  8. AI手写输入法 - pytorch从入门到入道(二)

    本章承接上一篇的手写数字识别,利用训练好的模型,结合pyqt画板,实现简易手写输入法,为"hello world"例子增添乐趣. pyqt是开发图形界面的框架,可以百度查找相关资料 ...

  9. Java基础IO类之对象流与序列化

    对象流的两个类: ObjectOutputStream:将Java对象的基本数据类型和图形写入OutputStream ObjectInputStream:对以前使用ObjectOutputStrea ...

  10. Chapter 02—Creating a dataset(Part2)

    三. 导入数据 图02-03:Source of data that can be imported into a dataset 11. 从键盘导入数据 (1)可能是最简单的数据导入方式. (2)使 ...