【云原生进阶之PaaS中间件】第四章RabbitMQ-3-RabbitMQ安装

1 Rabbitmq集群搭建

1.1 普通安装方式

1.1.1 环境准备

要在Linux环境下安装RabbitMQ,首先我们要有一个Linux环境,此处我们使用CentOS7虚拟机进行演示。如果本地还没有装过虚拟机,可以参考我之前的文章搭建虚拟机环境:VMware Workstation 14安装教程、虚拟机环境搭建(VMware Workstation14 + centos7)、VMware+CentOS7 网络及静态IP配置。

准备好虚拟机以后,我们就可以按照下面的步骤安装RabbitMQ了。

1.1.2 安装Erlang

RabbitMQ依赖于Erlang,所以,在安装RabbitMQ之前,需要先安装Erlang。此处需要注意,Erlang和RabbitMQ之间有版本的依赖关系,详见:RabbitMQ Erlang Version Requirements --- RabbitMQ

所以,如果我们已经确定了要安装哪个版本的RabbitMQ后,需要安装对应版本的Erlang。此处,我们选择RabbitMQ 3.9.14 + ErLang 23.3。

在开始安装之前,先执行下面的命令安装一些必要的依赖:

bash 复制代码
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel glibc-devel xmlto perl wget socat

然后下载23.3版本的Erlang包:

将下载好的Erlang包上传到虚拟机中,然后执行下面命令解压:

bash 复制代码
tar -xvf otp_src_23.3.tar.gz

解压完成后,进入解压后的目录,执行下面命令配置erlang的资源文件路径:

bash 复制代码
./configure --prefix=/usr/local/erlang

然后执行下面命令编译源码并安装Erlang:

bash 复制代码
make && make install

1.1.3 配置Erlang环境变量

执行下面命令编辑环境变量文件:

bash 复制代码
vim /etc/profile

在文件最后加入一行:

bash 复制代码
export PATH=$PATH:/usr/local/erlang/bin

其中,/usr/local/erlang为erlang安装目录。

执行下面的命令编译生效配置:

bash 复制代码
source /etc/profile

1.1.4 验证Erlang是否安装成功

执行完上面的步骤后,如果中间没有出现报错,那么就说明已经安装成功了。此时可以通过执行下面的命令验证Erlang是否安装成功:erl。

输入erl命令后,如果出现Erlang版本信息,说明Erlang已经安装成功了:

1.1.5 安装RabbitMQ

首先,去GitHub上找到自己需要的版本,然后下载对应版本的压缩包文件:

将下载好的文件上传到虚拟机上,然后执行下面的命令解压:

bash 复制代码
tar -xvf rabbitmq-server-generic-unix-3.9.14.tar.xz

1.1.6 配置RabbitMQ环境变量

执行下面命令配置环境变量:

bash 复制代码
vim /etc/profile

在最后加入一行:

bash 复制代码
export PATH=$PATH:/usr/local/rabbitmq_server-3.9.14/sbin

其中/usr/local/rabbitmq_server-3.9.14为RabbitMQ安装目录。

执行下面的命令编译生效配置:

bash 复制代码
source /etc/profile

1.1.7 启动RabbitMQ

进入RabbitMQ安装目录下的sbin目录,通过里面的rabbit-server命令可以启动RabbitMQ,有三种方式:

bash 复制代码
# 后台方式启动
#./rabbitmq-server -detachedservice 
#rabbitmq-server start
#./rabbitmq-server start

我们选择任意一种方式启动即可:

1.1.8 添加用户

RabbitMQ安装成功后有一个默认用户和密码,都是guest,但这个guest用户只能在RabbitMQ本机登录使用,如果想在其他机器上访问RabbitMQ需要添加新的账户。在RabbitMQ安装目录的sbin目录下,使用下面命令添加一个admin用户,并且密码也是admin:

bash 复制代码
./rabbitmqctl add_user admin admin

然后修改用户角色为管理员:

bash 复制代码
./rabbitmqctl set_user_tags admin administrator

最后给admin用户添加权限:

bash 复制代码
./rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

1.1.9 启用web端管理界面插件

执行下面的命令启用管理插件:

bash 复制代码
./rabbitmq-plugins enable rabbitmq_management

然后就可以在浏览器中访问RabbitMQ的管理界面了。在浏览器地址栏中输入:虚拟机IP:15672即可:

用户名和密码输入我们上面创建的admin登录:

至此,我们的RabbitMQ就已经安装完成,并且可以通过web界面进行管理RabbitMQ了。

1.2 容器安装方式

1.2.1 搭建普通集群

1、新建三个docker容器。

bash 复制代码
docker run -d --hostname rabbit1 --name myrabbit1  -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15671:15672 -p 5671:5672 rabbitmq
docker run -d --hostname rabbit2 --name myrabbit2  -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 --link myrabbit1:rabbit1 rabbitmq
docker run -d --hostname rabbit3 --name myrabbit3  -v /home/rabbitmq/data:/var/lib/rabbitmq -p 15673:15672 -p 5673:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 rabbitmq

2、三个都进入容器下载可视化工具。

3、进入第一个mq容器重启。

bash 复制代码
docker exec -it ef4a1f0fade7 /bin/bash 
rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl start_app 
exit

4、进入第二个 和 第三个 mq容器执行。

bash 复制代码
docker exec -it e36d94d40008 /bin/bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1   //如遇到报错再执行上句、再继续执行
rabbitmqctl start_app
exit

5、进去mq可视化界面,overview面板中的Nodes可查看到节点信息。

6、测试,在mq上新建交换机、其余两个也出现新建的交换机。

此时普通集群以构建完成:

1、此种集群主节点down掉后,消费者也无法消费从节点的消息,不能做故障转移,只能当作备份。

2、主节点正常,从节点则可以消费消息

1.2.2 镜像集群(高可用)(推荐)

这种集群弥补第一种的缺陷,需在普通集群的基础下搭建(确保第一种集群可用)。

镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升mq集群的高可用性。

该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。

所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据"队列名称"自动设置是普通集群模式或镜像队列。具体如下:

队列通过策略来使能镜像。策略能在任何时刻改变,rabbitmq队列也近可能的将队列随着策略变化而变化;非镜像队列和镜像队列之间是有区别的,前者缺乏额外的镜像基础设施,没有任何slave,因此会运行得更快。

为了使队列称为镜像队列,你将会创建一个策略来匹配队列,设置策略有两个键"ha-mode和 ha-params(可选)"。ha-params根据ha-mode设置不同的值,下面表格说明这些key的选项。

为什么RabbitMQ不将队列复制到集群里每个节点呢?这与它的集群的设计本意相冲突,集群的设计目的就是增加更多节点时,能线性的增加性能(CPU、内存)和容量(内存、磁盘)。理由如下:

Storage Space: If every cluster node had a full copy of every queue, adding nodes wouldn't give you more storage capacity. For example, if one node could store 1GB of messages, adding two more nodes would simply give you two more copies of the same 1GB of messages.(存储空间:如果每个集群节点每个队列的一个完整副本,增加节点需要更多的存储容量。例如,如果一个节点可以存储1 gb的消息,添加两个节点需要两份相同的1gb的消息)

Performance: Publishing messages would require replicating those messages to every cluster node. For durable messages that would require triggering disk activity on all nodes for every message. Your network and disk load would increase every time you added a node, keeping the performance of the cluster the same (or possibly worse).(性能:发布消息需要将这些信息复制到每个集群节点。对持久消息,要求为每条消息触发磁盘活动在所有节点上。每次添加一个节点都会带来 网络和磁盘的负载。)

当然RabbitMQ新版本集群也支持队列复制(有个选项可以配置)。比如在有五个节点的集群里,可以指定某个队列的内容在2个节点上进行存储,从而在性能与高可用性之间取得一个平衡(应该就是指镜像模式)。

1、配置集群架构

2、进入任意节点配置策略

bash 复制代码
docker exec -it ef4a1f0fade7 /bin/bash
rabbitmqctl set_policy ha-all "^rabbitmq" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

3、测试,新建一个rabbitmq开头的队列

此时某个节点down掉(包括主节点),其余节点也能消费。

将主节点down掉,节点自动切换。

4、清除策略

bash 复制代码
rabbitmqctl clear_policy ha-all

2 界面认识

2.1 概要页面

2.2 连接页面

2.3 通道页面

2.4 交换器页面

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列

2.5 队列页面

点击名称进去,可以看到队列的详细信息

get Message可以看到消息的内容

arguments具体参数如下:

2.6 用户页面

就是添加用户和设置用户权限。

2.7 开启日志

进入容器,输入:

bash 复制代码
rabbitmq-plugins enable rabbitmq_tracing

此时会多一个tracing标签,输入信息添加日志。

  • Name: 自定义,建议标准点容易区分
  • Format: 表示输出的消息日志格式,有Text和JSON两种,Text格式的日志方便人类阅读,JSON的方便程序解析。

JSON格式的payload(消息体)默认会采用Base64进行编码,如上面的"trace test payload."会被编码成"dHJhY2Ug dGVzdCBwYXlsb2FkLg=="。

  • Max payload bytes: 表示每条消息的最大限制,单位为B。比如设置了了此值为10,那么当有超过10B的消息经过Rabbit MQ流转时,在记录到trace文件的时候会被截断。如上text日志格式中"trace test payload."会被截断成"trace tes
  • Pattern:
    • 追踪所有进入和离开MQ的消息

    • publish.# 追踪所有进入MQ的消息
    • publish.myExchage 追踪所有进入到myExchange的消息
    • deliver.# 跟踪所有离开MQ的消息
    • deliver.myQueue 追踪所有从myQueue离开的消息 #.myQueue实测效果等同于deliver.myQueue

添加后,点击即可查看日志。

如果出现错误,是因为插件默认是使用 guest 用户,是因为把 guest 用户删除了,或者在配置文件里面使用其他用户。

解决: 配置/etc/rabbitmq/rabbitmq.config,添加配置(未尝试,可以或者不行或者有其他解决方法请留言)

Groovy 复制代码
{rabbitmq_tracing,
    [
        {directory, "/var/vcap/sys/log/rabbitmq-server/tracing"},
        {username, <<"admin">>},
        {password, <<"password">>}
    ]
},

3 rabbitmq常见故障

  • 集群状态异常
  1. rabbitmqctl cluster_status检查集群健康状态,不正常节点重新加入集群
  2. 分析是否节点挂掉,手动启动节点。
  3. 保证网络连通正常
  • 队列阻塞、数据堆积
  1. 保证网络连通正常
  2. 保证消费者正常消费,消费速度大于生产速度
  3. 保证服务器TCP连接限制合理
  • 脑裂
  1. 按正确顺序重启集群
  2. 保证网络连通正常
  3. 保证磁盘空间、cpu、内存足够
  • 内存使用量超过阀值
bash 复制代码
=INFO REPORT==== 15-Mar-2022::03:21:13 ===
rabbit on node 'rabbit@hb-lvs-rabbitmq-mem-1' down

=INFO REPORT==== 15-Mar-2022::03:21:16 ===
vm_memory_high_watermark set. Memory used:3194473120 allowed:3188020019

=WARNING REPORT==== 15-Mar-2022::03:21:16 ===
memory resource limit alarm set on node 'rabbit@hb-lvs-rabbitmq-disk-2'.

**********************************************************
*** Publishers will be blocked until this alarm clears ***
**********************************************************

这时会阻塞生产者,以避免服务崩溃。

临时解决办法是调大内存阀值,默认是0.4;

bash 复制代码
rabbitmqctl set_vmmemory_high_watermark 0.6

4 常用命令

  • 启动rabbit服务:service rabbitmq-server start
  • 停止rabbit服务:service rabbitmq-server stop
  • 后台启动:rabbitmq-server -detached
  • 运行状态:rabbitmqctl status
  • 用户管理
  • 查看所有用户:rabbitmqctl list_users
  • 添加用户:rabbitmqctl add_user username password
  • 删除用户:rabbitmqctl delete_user username
  • 修改密码:rabbitmqctl change_password username newpassword
  • 开启rabbit网页控制台
  • 进入rabbit安装目录:cd /usr/lib/rabbitmq
  • 查看已经安装的插件:rabbitmq-plugins list
  • 开启网页版控制台:rabbitmq-plugins enable rabbitmq_management
  • 重启rabbitmq服务
  • 输入网页访问地址:http://localhost:15672/ 使用默认账号:guest/guest登录

参考链接

Linux安装Erlang和RabbitMQ详细步骤

RabbitMQ的工作模式及原理

RabbitMQ如何保证消息的可靠性投递与消费?

rabbitmq详解-CSDN博客

RabbitMQ(一)------常见消息中间件

深入理解:RabbitMQ的前世今生

RabbitMQ技术详解-架构

透彻rabbitmq - 知乎

消息队列的使用场景是怎样的? - 知乎

RabbitMQ原理 - 知乎

RabbitMQ 原理解析

RabbitMQ原理详解_rabbitmq工作原理-CSDN博客

相关推荐
Karoku0662 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
蜡笔小鑫️3 小时前
金碟中间件-AAS-V10.0安装
中间件
Lspecialnx_5 小时前
文件解析漏洞中间件(iis和Apache)
网络安全·中间件
隔着天花板看星星5 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka
探索云原生7 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳7 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
会飞的土拨鼠呀11 小时前
chart文件结构
运维·云原生·kubernetes
Hello Dam14 小时前
面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制
spring cloud·微服务·云原生·架构·gateway·登录验证·单点登录
power-辰南15 小时前
Zookeeper 底层原理解析
分布式·zookeeper·云原生
power-辰南15 小时前
Zookeeper常见面试题解析
分布式·zookeeper·云原生