RabbitMQ(含集群)简介以及在centos7上的安装使用

目录

一,RabbitMQ介绍

1,RabbitMQ

2,RabbitMQ与常见的消息中间件的简单对比

二,RabbitMQ在Linux系统上的安装(CentOS7)

1,环境准备:CentOS7.x+/Erlang

2,安装

(1)安装OpenSSL环境

(2)安装Erlang(如果是下载的rpm包须此步骤,直接yum或wget安装跳过!)

(3)安装socat插件

(4)安装RabbitMQ

(5)安装RabbitMQ管理界面

(6)添加配置文件,解决只能localhost访问的问题

(7)授权账号和密码

三,RabbitMQ的练习(基础知识,死信,延迟队列)及Springboot整合。

四,RabbitMQ集群搭建

1,搭建集群的作用

2,RabbitMQ集群的三种模式

 3,集群搭建

 4,配置RabbitMQ节点

4.4.1,配置节点1

4.4.2,配置节点2

4.4.3,配置节点3

4.4.4,通过命令依次进入各个集群并设置相应的密码,权限

4.4.5,在RabbitMQ1上设置镜像队列

4.4.6,测试集群

4.4.7,在idea中用springboot整合RabbitMQ集群测试。

五、卸载

1、卸载rabbitmq相关文件

2、卸载erlang


一,RabbitMQ介绍

1,RabbitMQ

它是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。

RabbitMQ的官方

RabbitMQ(含集群)简介以及在centos7上的安装使用_第1张图片

  • 概念:
    • Brocker:消息队列服务器实体。
    • Exchange:消息交换机,指定消息按什么规则,路由到哪个队列。
    • Queue:消息队列,每个消息都会被投入到一个或者多个队列里。
    • Binding:绑定,它的作用是把exchange和queue按照路由规则binding起来。
    • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
    • Vhost:虚拟主机,一个broker里可以开设多个vhost,用作不用用户的权限分离。
    • Producer:消息生产者,就是投递消息的程序。
    • Consumer:消息消费者,就是接受消息的程序。
    • Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
  • 消息队列的使用过程大概如下:
    • 消息接收
      • 客户端连接到消息队列服务器,打开一个channel。
      • 客户端声明一个exchange,并设置相关属性。
      • 客户端声明一个queue,并设置相关属性。
      • 客户端使用routing key,在exchange和queue之间建立好绑定关系。
    • 消息发布
      • 客户端投递消息到exchange。
      • exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
  • AMQP 里主要要说两个组件:
    • Exchange 和 Queue
    • 绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker
    • 这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型。
  • Exchange通常分为四种:
    • fanout:该类型路由规则非常简单,会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,相当于广播功能
    • direct:该类型路由规则会将消息路由到binding key与routing key完全匹配的Queue中
    • topic:与direct类型相似,只是规则没有那么严格,可以模糊匹配和多条件匹配
    • headers:该类型不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配

2,RabbitMQ与常见的消息中间件的简单对比

ActiveMQ RabbitMQ Kafka RocketMQ
发布订阅 支持 支持 支持 支持
轮询发布 支持 支持 支持 /
公平分发 / 支持 支持 /
重发 支持 支持 / 支持
消息拉取 / 支持 支持

支持

二,RabbitMQ在Linux系统上的安装(CentOS7)

1,环境准备:CentOS7.x+/Erlang

由于RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,首先需要安装Erlang。

通过官方文档中的版本查看可以看到目前最新的Erlang版本是25,也是官方最推荐的。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第2张图片

可以看到,对于Erlang23,已经在7月31已经停止了对RabbitMQ3.9.15以上的版本的支持了。因此我们优先考虑最新版本。对于安装在Linux系统上我们可以直接去github上面的下载地址上下载他们的rpm包。但是进入首页发现25,24.x已经不持支CentOS7了。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第3张图片

因此我们只能退而求其次,选择23.x的Erlang版本进行下载。安装过git的朋友可以直接在GitHub上对Erlang文件进行拉取。也可以在下面的介绍中从包云上下载。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第4张图片

 在上面找到历史对应发布的Erlang版本,可以通过wget或者yum进行安装。RabbitMQ(含集群)简介以及在centos7上的安装使用_第5张图片

RabbitMQ(含集群)简介以及在centos7上的安装使用_第6张图片

 RabbitMQ(含集群)简介以及在centos7上的安装使用_第7张图片

通过相同的方法,对照版本对比,下载RabbitMQ的rpm包。

[root@VM-12-4-centos rabbitMQ]# ls
erlang-23.3.4.11-1.el7.x86_64.rpm
rabbitmq-server-3.9.14-1.el7.noarch.rpm

2,安装

(1)安装OpenSSL环境

yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz

(2)安装Erlang(如果是下载的rpm包须此步骤,直接yum或wget安装跳过!)

[root@VM-12-4-centos rabbitMQ]# rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm
warning: erlang-23.3.4.11-1.el7.x86_64.rpm: Header V4 RSgnature, key ID 6026dfca: NOKEY
Preparing...                          ######################## [100%]

 检查Erlang是否安装成功。

[root@VM-12-4-centos rabbitMQ]# erl -verl -v
Erlang/OTP 23 [erts-11.2.2.7] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [hipe]
Eshell V11.2.2.7  (abort with ^G)
1> 

当出现版本信息时则证明安装成功。通过两次ctrl+c退出。 

(3)安装socat插件

#命令

[root@VM-12-4-centos rabbitMQ]#yum install -y socat

(4)安装RabbitMQ

[root@VM-12-4-centos rabbitMQ]# rpm -ivh rabbitmq-server-3.9.14-1.el7.noarch.rpm
警告:rabbitmq-server-3.9.14-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 6026dfca: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:rabbitmq-server-3.9.14-1.el7     ################################# [100%]

 安装完成后启动RabbitMQ服务,并对相应状态进行查看。

# 启动rabbitmq命令: systemctl start rabbitmq-server

# 查看启动状态命令: systemctl status rabbitmq-server

# 停止rabbitmq命令: systemctl stop rabbitmq-server

如果出现Active(running)则证明启动成功!

(5)安装RabbitMQ管理界面

由于默认情况下,rabbitmq是没有安装web端的客户端插件,需要安装才可以生效

[root@VM-12-4-centos rabbitMQ]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@VM-12-4-centos:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@VM-12-4-centos...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

set 3 plugins.
Offline change; changes will take effect at broker restart.

安装完毕后,需要在对应的服务器安全组中开放15672,5672端口

# 开放5672端口命令 /sbin/iptables -I INPUT -p tcp --dport 5672 -j ACCEPT

# 开放15672端口命令 /sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT

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

(6)添加配置文件,解决只能localhost访问的问题

# 进入【/etc/rabbitmq】文件夹下
cd /etc/rabbitmq

# 编辑【rabbitmq.config】文件
vim rabbitmq.config

 在rabbitmq.config文件中写入下面的命令,不要忘了后面的点.

[{rabbit,[{loopback_users,[]}]}].

如果是轻量级应用服务器或者其他在防火墙上开放这个端口即可! 最后重启服务便可以在自己的web浏览器上看到客户端的RabbitMQ界面。默认账号密码为guest,guest。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第8张图片

(7)授权账号和密码

7.1:新增账户

rabbitmqctl add_user username password

7.2:设置用户分配操作权限

 rabbitmqctl set_user_tags username administrator

用户级别详解:

  • administrator可以登录控制台,查看所有信息,可以对RabbitMQ进行管理
  • monitoring监控者 登陆控制台,查看所有信息
  • policymaker策略制定者 登录控制台,制定策略
  • management普通管理员 登陆控制台

7.3:为用户添加资源

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

部分操作列表如下

  1. rabbitmqctl add_user username password
  2. rabbitmqctl set_user_tags username administrator
  3. rabbitmqctl change_password username newpassword 修改密码
  4. rabbitmqctl delete_user username 删除用户
  5. rabbitmqctl list_users  查看用户清单
  6. rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*" 为用户设置administrator角色

三,RabbitMQ的练习(基础知识,死信,延迟队列)及Springboot整合。

详情在我的GitHub自行下载查看,里面包含笔者的学习rabbitmq的学习过程代码笔记等。

四,RabbitMQ集群搭建

1,搭建集群的作用

 如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候)。可以将所有message都设置为持久化,并且使用持久化的queue,但是这样仍然无法避免由于缓存导致的问题:因为message在发送之后和被写入磁盘并执行fsync之间存在一个虽然短暂但是会产生问题的时间窗。通过publisher的confirm机制能够确保客户端知道哪些message已经存入磁盘,尽管如此,一般不希望遇到因单点故障导致服务不可用。

但是,如果搭建集群后,RabbitMQ集群是由多个broker节点构成的,那么从服务的整体可用性上来讲,该集群对于单点失效是有弹性的,但是同时也需要注意:尽管exchange和binding能够在单点失效问题上幸免于难,但是queue和其上持有的message却不行,这是因为queue及其内容仅仅存储于单个节点之上,所以一个节点的失效表现为其对应的queue不可用。

由于RabbitMQ本身是基于Erlang编写Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现)。因此,RabbitMQ天然支持集群。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。一台机器挂了后,RabbitMQ能够正常生产,消费消息。

2,RabbitMQ集群的三种模式

4.2.1,单机模式:

一般用于本机测试,不会用于生产环境,不详述

4.2.2,普通集群模式:

多台机器上启动多个rabbitmq实例每个机器启动一个。但是创建的queue,只会放在一个rabbtimq实例上,但是每个实例都同步queue的元数据(存放含queue数据的真正实例位置)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第9张图片

 这种方式并没有做到分布式,只是普通集群。虽然达到了消息的高可用,但是它没办法保证可靠性。

缺点:

  • 可用性没有达到保证,一台机器挂了就是挂了,无法恢复,只能手动恢复
  • 可能会在RabbitMQ集群内部产生大量数据传输

4.2.3,镜像队列

 这种模式才是rabbitmq的高可用模式,跟普通集群模式不一样的是,当我们创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。

RabbitMQ(含集群)简介以及在centos7上的安装使用_第10张图片

图中每个节点有一个queue,生产者生产完毕数据后投递到指定交换机的队列,交换机的队列进行消息同步。每个节点queue都有一个完整的rabbitmq节点,所以这种方式叫做镜像集群。

当然这种方式也有它的优缺点的地方。

好处:任何一个节点宕机后,其它节点不受影响,正常使用

坏处:

  • 性能开销大,消息同步所有机器,导致网络带宽压力和消耗很重
  • 没有扩展性,如果某个queue负载很重,加机器,新增的机器也包含了这个queue的所有数据,没有办法扩展

 3,集群搭建

为了方便快捷搭建笔者选择在自己的腾讯云服务器上通过Docker来搭建集群,因为它省去了我们下载配置繁琐服务的时间。

4.3.1,利用Docker拉取带有管理界面的镜像

docker pull rabbitmq:management

查看拉取对象是否成功

docker images 

[root@VM-12-4-centos ~]# docker images
REPOSITORY   TAG          IMAGE ID       CREATED      SIZE
rabbitmq     management   321a17c29307   5 days ago   262MB

4.3.2,运行RabbitMQ镜像,开启三个RabbitMQ服务,同时确保个节点上RbbitMQ底层erlang的cookie文件的cookie是同一个值!

 # 开启第一个RabbitMQ服务

docker run -d --hostname myRabbit1 --name rabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

# 开启第二个

docker run -d --hostname myRabbit2 --name rabbit2 -p 15673:15672 -p 5673:5672 --link rabbit1:myRabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

# 开启第三个

docker run -d --hostname myRabbit3 --name rabbit3 -p 15674:15672 -p 5674:5672 --link rabbit1:myRabbit1 --link rabbit2:myRabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:management

 查看运行的镜像后可知,三个RabbitMQ镜像开启完成,成功运行。

[root@VM-12-4-centos ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                 NAMES
24be9bbde112   rabbitmq:management   "docker-entrypoint.s…"   6 seconds ago    Up 5 seconds    4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5675->5672/tcp, :::5675->5672/tcp, 0.0.0.0:15675->15672/tcp, :::15675->15672/tcp   rabbit3
6c21c2595eaa   rabbitmq:management   "docker-entrypoint.s…"   23 seconds ago   Up 22 seconds   4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, :::5674->5672/tcp, 0.0.0.0:15674->15672/tcp, :::15674->15672/tcp   rabbit2
226789a013be   rabbitmq:management   "docker-entrypoint.s…"   46 seconds ago   Up 45 seconds   4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, :::5673->5672/tcp, 0.0.0.0:15673->15672/tcp, :::15673->15672/tcp   rabbit1

 4,配置RabbitMQ节点

4.4.1,配置节点1

[root@VM-12-4-centos ~]# docker exec -it rabbit1 bash
root@myRabbit1:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@myRabbit1 ...
root@myRabbit1:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@myRabbit1 ...
root@myRabbit1:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@myRabbit1 ...
root@myRabbit1:/# exit
exit

4.4.2,配置节点2

[root@VM-12-4-centos ~]# docker exec -it rabbit2 bash
root@myRabbit2:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@myRabbit2 ...
root@myRabbit2:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@myRabbit2 ...
root@myRabbit2:/# rabbitmqctl join_cluster --ram rabbit@myRabbit1
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node rabbit@myRabbit2 with rabbit@myRabbit1
root@myRabbit2:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be D in a future version. Use the $HOME/.erlang.cookie file or the --erlakie switch instead.
Starting node rabbit@myRabbit2 ...
root@myRabbit2:/# exit
exit

4.4.3,配置节点3

[root@VM-12-4-centos ~]# docker exec -it rabbit3 bash
root@myRabbit3:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be D in a future version. Use the $HOME/.erlang.cookie file or the --erlakie switch instead.
Stopping rabbit application on node rabbit@myRabbit3 ...
root@myRabbit3:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be D in a future version. Use the $HOME/.erlang.cookie file or the --erlakie switch instead.
Resetting node rabbit@myRabbit3 ...
root@myRabbit3:/# rabbitmqctl join_cluster --ram rabbit@myRabbit1
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be D in a future version. Use the $HOME/.erlang.cookie file or the --erlakie switch instead.
Clustering node rabbit@myRabbit3 with rabbit@myRabbit1
root@myRabbit3:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be D in a future version. Use the $HOME/.erlang.cookie file or the --erlakie switch instead.
Starting node rabbit@myRabbit3 ...

4.4.4,通过命令依次进入各个集群并设置相应的密码,权限

rabbitmqctl add_user admin admin

rabbitmqctl set_user_tags admin administrator

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

4.4.5,在RabbitMQ1上设置镜像队列

[root@VM-12-4-centos ~]# docker exec -it rabbit1 bash
root@myRabbit1:/#  rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

此时查看 集群状态如下:

root@myRabbit1:/# rabbitmqctl cluster_status
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Cluster status of node rabbit@myRabbit1 ...
Basics

Cluster name: rabbit@myRabbit1

Disk Nodes

rabbit@myRabbit1

RAM Nodes

rabbit@myRabbit2
rabbit@myRabbit3

Running Nodes

rabbit@myRabbit1
rabbit@myRabbit2
rabbit@myRabbit3

Versions

rabbit@myRabbit1: RabbitMQ 3.10.7 on Erlang 25.0.3
rabbit@myRabbit2:   on Erlang 
rabbit@myRabbit3:   on Erlang 

Maintenance status

Node: rabbit@myRabbit1, status: not under maintenance
Node: rabbit@myRabbit2, status: unknown
Node: rabbit@myRabbit3, status: unknown

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@myRabbit1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@myRabbit1, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
Node: rabbit@myRabbit1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@myRabbit1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag: classic_mirrored_queue_version, state: enabled
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: stream_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled

可看出节点设置成功,rabbit@myRabbit1为磁盘节点,rabbit@myRabbit2,rabbit@myRabbit3为内存结点。

(注:docker的一些常用命令)

# 查看已经运行过但停止了的镜像

docker ps -a

# 停止镜像

docker stop 镜像id/镜像名称

# 开启镜像,恢复运行状态

dockers start 镜像id/镜像名称

# 删除镜像

docker rm 镜像id/镜像名称

# 删除所有镜像

docker rmi $(docker ps -a)

4.4.6,测试集群

再进行测试前,需要事先将需要用到的端口在服务器防火墙进行开放,否则在RabbiqMQ的web端将登陆不进去。另外,一些云服务器需要开启安全组或者防火墙的相关端口号。

输入自己的IP地址与RabbitMQ的端口号进行登录,便可以查看到镜像集群部署成功~

RabbitMQ(含集群)简介以及在centos7上的安装使用_第11张图片

4.4.7,在idea中用springboot整合RabbitMQ集群测试。

详情在我的GitHub中自行下载查看代码文件。

五、卸载


1、卸载rabbitmq相关文件

# 停止RabbitMQ服务
/sbin/service rabbitmq-server stop
# 查看rabbitmq安装的相关列表
yum list | grep rabbitmq
# 卸载rabbitmq已安装的相关内容
yum -y remove rabbitmq-server.noarch
# 删除相关文件
rm -rf /var/lib/rabbitmq

2、卸载erlang

# 查看erlang安装的相关列表
yum list | grep erlang
# 卸载erlang已安装的相关内容
yum -y remove erlang-*
yum remove erlang.x86_64
# 删除相关文件
rm -rf /usr/lib64/erlang

你可能感兴趣的:(SpringBoot,java-rabbitmq,rabbitmq,java)