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常见故障
- 集群状态异常
- rabbitmqctl cluster_status检查集群健康状态,不正常节点重新加入集群
- 分析是否节点挂掉,手动启动节点。
- 保证网络连通正常
- 队列阻塞、数据堆积
- 保证网络连通正常
- 保证消费者正常消费,消费速度大于生产速度
- 保证服务器TCP连接限制合理
- 脑裂
- 按正确顺序重启集群
- 保证网络连通正常
- 保证磁盘空间、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登录