目录
一,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
它是一个由erlang开发的基于AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。
RabbitMQ的官方
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询发布 | 支持 | 支持 | 支持 | / |
公平分发 | / | 支持 | 支持 | / |
重发 | 支持 | 支持 | / | 支持 |
消息拉取 | / | 支持 | 支持 | 支持 |
由于RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,首先需要安装Erlang。
通过官方文档中的版本查看可以看到目前最新的Erlang版本是25,也是官方最推荐的。
可以看到,对于Erlang23,已经在7月31已经停止了对RabbitMQ3.9.15以上的版本的支持了。因此我们优先考虑最新版本。对于安装在Linux系统上我们可以直接去github上面的下载地址上下载他们的rpm包。但是进入首页发现25,24.x已经不持支CentOS7了。
因此我们只能退而求其次,选择23.x的Erlang版本进行下载。安装过git的朋友可以直接在GitHub上对Erlang文件进行拉取。也可以在下面的介绍中从包云上下载。
在上面找到历史对应发布的Erlang版本,可以通过wget或者yum进行安装。
通过相同的方法,对照版本对比,下载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
yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
[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退出。
#命令
[root@VM-12-4-centos rabbitMQ]#yum install -y socat
[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)则证明启动成功!
由于默认情况下,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_dispatchset 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
# 进入【/etc/rabbitmq】文件夹下
cd /etc/rabbitmq
# 编辑【rabbitmq.config】文件
vim rabbitmq.config
在rabbitmq.config文件中写入下面的命令,不要忘了后面的点.
[{rabbit,[{loopback_users,[]}]}].
如果是轻量级应用服务器或者其他在防火墙上开放这个端口即可! 最后重启服务便可以在自己的web浏览器上看到客户端的RabbitMQ界面。默认账号密码为guest,guest。
7.1:新增账户
rabbitmqctl add_user username password
7.2:设置用户分配操作权限
rabbitmqctl set_user_tags username administrator
用户级别详解:
7.3:为用户添加资源
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
部分操作列表如下
- rabbitmqctl add_user username password
- rabbitmqctl set_user_tags username administrator
- rabbitmqctl change_password username newpassword 修改密码
- rabbitmqctl delete_user username 删除用户
- rabbitmqctl list_users 查看用户清单
- rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*" 为用户设置administrator角色
详情在我的GitHub自行下载查看,里面包含笔者的学习rabbitmq的学习过程代码笔记等。
如果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能够正常生产,消费消息。
4.2.1,单机模式:
一般用于本机测试,不会用于生产环境,不详述
4.2.2,普通集群模式:
在多台机器上启动多个rabbitmq实例,每个机器启动一个。但是创建的queue,只会放在一个rabbtimq实例上,但是每个实例都同步queue的元数据(存放含queue数据的真正实例位置)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。
这种方式并没有做到分布式,只是普通集群。虽然达到了消息的高可用,但是它没办法保证可靠性。
缺点:
4.2.3,镜像队列
这种模式才是rabbitmq的高可用模式,跟普通集群模式不一样的是,当我们创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。
图中每个节点有一个queue,生产者生产完毕数据后投递到指定交换机的队列,交换机的队列进行消息同步。每个节点queue都有一个完整的rabbitmq节点,所以这种方式叫做镜像集群。
当然这种方式也有它的优缺点的地方。
好处:任何一个节点宕机后,其它节点不受影响,正常使用
坏处:
为了方便快捷搭建笔者选择在自己的腾讯云服务器上通过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
[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
[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
[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 ...
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
[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)
再进行测试前,需要事先将需要用到的端口在服务器防火墙进行开放,否则在RabbiqMQ的web端将登陆不进去。另外,一些云服务器需要开启安全组或者防火墙的相关端口号。
输入自己的IP地址与RabbitMQ的端口号进行登录,便可以查看到镜像集群部署成功~
详情在我的GitHub中自行下载查看代码文件。
# 停止RabbitMQ服务
/sbin/service rabbitmq-server stop
# 查看rabbitmq安装的相关列表
yum list | grep rabbitmq
# 卸载rabbitmq已安装的相关内容
yum -y remove rabbitmq-server.noarch
# 删除相关文件
rm -rf /var/lib/rabbitmq
# 查看erlang安装的相关列表
yum list | grep erlang
# 卸载erlang已安装的相关内容
yum -y remove erlang-*
yum remove erlang.x86_64
# 删除相关文件
rm -rf /usr/lib64/erlang