RabbitMQ单机及集群安装
RabbitMQ 安装和使用
一、安装依赖环境
-
在 http://www.rabbitmq.com/which-erlang.html 页面查看安装rabbitmq需要安装erlang对应的版本
-
在 https://github.com/rabbitmq/erlang-rpm/releases 页面找到需要下载的erlang版本,
erlang-*.centos.x86_64.rpm
就是centos版本的。 -
复制下载地址后,使用wget命令下载
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
-
安装 Erlang
sudo rpm -Uvh /home/download/erlang-21.2.3-1.el7.centos.x86_64.rpm
-
安装 socat
sudo yum install -y socat
二、安装RabbitMQ
-
在官方下载页面找到CentOS7版本的下载链接,下载rpm安装包
wget -P /home/download https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.9/rabbitmq-server-3.7.9-1.el7.noarch.rpm
提示:可以在
https://github.com/rabbitmq/rabbitmq-server/tags下载历史版本
-
安装RabbitMQ
sudo rpm -Uvh /home/download/rabbitmq-server-3.7.9-1.el7.noarch.rpm
三、启动和关闭
-
启动服务
sudo systemctl start rabbitmq-server
-
查看状态
sudo systemctl status rabbitmq-server
-
停止服务
sudo systemctl stop rabbitmq-server
-
设置开机启动
sudo systemctl enable rabbitmq-server
四、开启Web管理插件
-
开启插件
rabbitmq-plugins enable rabbitmq_management
说明:rabbitmq有一个默认的guest用户,但只能通过localhost访问,所以需要添加一个能够远程访问的用户。
-
添加用户
rabbitmqctl add_user admin admin
-
为用户分配操作权限
rabbitmqctl set_user_tags admin administrator
-
为用户分配资源权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
五、防火墙添加端口
- RabbitMQ 服务启动后,还不能进行外部通信,需要将端口添加都防火墙
-
添加端口
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 --reload
多机多节点集群部署
一、 环境准备
-
准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤
- 10.10.1.41
- 10.10.1.42
- 10.10.1.43
提示:如果使用虚拟机,可以在一台VM上安装好RabbitMQ后,创建快照,从快照创建链接克隆,会节省很多磁盘空间
二、修改配置文件
-
修改
10.10.1.41
机器上的/etc/hosts
文件sudo vim /etc/hosts
-
添加IP和节点名
10.10.1.41 node1 10.10.1.42 node2 10.10.1.43 node3
-
修改对应主机的hostname
hostname node1
hostname node2
hostname node3
-
将
10.10.1.41
上的hosts文件复制到另外两台机器上sudo scp /etc/hosts root@node2:/etc/ sudo scp /etc/hosts root@node3:/etc/
说明:命令中的root是目标机器的用户名,命令执行后,可能会提示需要输入密码,输入对应用户的密码就行了
-
将
10.10.1.41
上的/var/lib/rabbitmq/.erlang.cookie
文件复制到另外两台机器上scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/
提示:如果是通过克隆的VM,可以省略这一步
三、防火墙添加端口
- 给每台机器的防火墙添加端口
-
添加端口
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 --reload
四、启动RabbitMQ
-
启动每台机器的RabbitMQ
sudo systemctl start rabbitmq-server
或者
rabbitmq-server -detached
-
将
10.10.1.42
加入到集群# 停止RabbitMQ 应用 rabbitmqctl stop_app # 重置RabbitMQ 设置 rabbitmqctl reset # 加入到集群 rabbitmqctl join_cluster rabbit@node1 --ram # 启动RabbitMQ 应用 rabbitmqctl start_app
-
查看集群状态,看到
running_nodes,[rabbit@node1,rabbit@node2]
表示节点启动成功rabbitmqctl cluster_status
提示:在管理界面可以更直观的看到集群信息
-
将
10.10.1.43
加入到集群# 停止 RabbitMQ 应用 rabbitmqctl stop_app # 重置 RabbitMQ 设置 rabbitmqctl reset # 节点加入到集群 rabbitmqctl join_cluster rabbit@node1 --ram # 启动 RabbitMQ 应用 rabbitmqctl start_app
-
重复地3步,查看集群状态
单机多节点部署
一、环境准备
- 准备一台已经安装好RabbitMQ 的机器,安装方法见 安装步骤
- 10.10.1.41
二、启动RabbitMQ
-
在启动前,先修改RabbitMQ 的默认节点名(非必要),在
/etc/rabbitmq/rabbitmq-env.conf
增加以下内容# RabbitMQ 默认节点名,默认是rabbit 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 # 重置 rabbit2 的设置 rabbitmqctl -n rabbit2 reset # rabbit2 节点加入到 rabbit1的集群中 rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram # 启动 rabbit2 节点 rabbitmqctl -n rabbit2 start_app
-
将rabbit3加入到集群
# 停止 rabbit3 的应用 rabbitmqctl -n rabbit3 stop_app # 重置 rabbit3 的设置 rabbitmqctl -n rabbit3 reset # rabbit3 节点加入到 rabbit1的集群中 rabbitmqctl -n rabbit3 join_cluster rabbit1 --ram # 启动 rabbit3 节点 rabbitmqctl -n rabbit3 start_app
-
查看集群状态,看到
{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}
说明节点已启动成功。rabbitmqctl cluster_status
提示:在管理界面可以更直观的看到集群信息
三、防火墙添加端口
- 需要将每个节点的端口都添加到防火墙
-
添加端口
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
-
重启防火墙
sudo firewall-cmd --reload
镜像队列模式集群
-
镜像队列属于RabbitMQ 的高可用方案,见:https://www.rabbitmq.com/ha.html#mirroring-arguments
-
通过前面的步骤搭建的集群属于普通模式集群,是通过共享元数据实现集群
-
开启镜像队列模式需要在管理页面添加策略,添加方式:
-
进入管理页面 -> Admin -> Policies(在页面右侧)-> Add / update a policy
-
在表单中填入:
name: ha-all Pattern: ^ Apply to: Queues Priority: 0 Definition: ha-mode = all
参数说明
name: 策略名称,如果使用已有的名称,保存后将会修改原来的信息
Apply to:策略应用到什么对象上
Pattern:策略应用到对象时,对象名称的匹配规则(正则表达式)
Priority:优先级,数值越大,优先级越高,相同优先级取最后一个
Definition:策略定义的类容,对于镜像队列的配置来说,只需要包含3个部分:
ha-mode
、ha-params
和ha-sync-mode
。其中,ha-sync-mode
是同步的方式,自动还是手动,默认是自动。ha-mode
和ha-params
组合使用。组合方式如下:
ha-mode ha-params 说明 all (empty) 队列镜像到集群类所有节点 exactly count 队列镜像到集群内指定数量的节点。如果集群内节点数少于此值,队列将会镜像到所有节点。如果大于此值,而且一个包含镜像的节点停止,则新的镜像不会在其它节点创建。 nodes nodename 队列镜像到指定节点,指定的节点不在集群中不会报错。当队列申明时,如果指定的节点不在线,则队列会被创建在客户端所连接的节点上。 -
-
镜像队列模式相比较普通模式,镜像模式会占用更多的带宽来进行同步,所以镜像队列的吞吐量会低于普通模式
-
但普通模式不能实现高可用,某个节点挂了后,这个节点上的消息将无法被消费,需要等待节点启动后才能被消费。
内存告警
默认情况下 set_vm_memory_high_watermark
的值为 0.4,即内存阈值(临界值)为 0.4,表示当 RabbitMQ 使用的内存超过 40%时,就会产生内存告警并阻塞所有生产者的连接。一旦告警被解除(有消息被消费或者从内存转储到磁盘等情况的发生), 一切都会恢复正常。
在出现内存告警后,所有的客户端连接都会被阻塞。阻塞分为 blocking
和 blocked
两种。
- blocking:表示没有发送消息的链接。
- blocked:表示试图发送消息的链接。
如果出现了内存告警,并且机器还有可用内存,可以通过命令调整内存阈值,解除告警。
rabbitmqctl set_vm_memory_high_watermark 1
或者
rabbitmqctl set_vm_memory_high_watermark absolute 1GB
但这种方式只是临时调整,RabbitMQ 服务重启后,会还原。如果需要永久调整,可以修改配置文件。但修改配置文件需要重启RabbitMQ 服务才能生效。
-
修改配置文件:
vim /etc/rabbitmq/rabbitmq.conf
vm_memory_high_watermark.relative = 0.4
或者
vm_memory_high_watermark.absolute = 1GB
模拟内存告警
-
调整内存阈值,模拟出告警,在RabbitMQ 服务器上修改。
注意:修改之前,先在管理页面看一下当前使用了多少,调成比当前值小
rabbitmqctl set_vm_memory_high_watermark absolute 50MB
-
刷新管理页面(可能需要刷新多次),在
Overview -> Nodes
中可以看到Memory变成了红色,表示此节点内存告警了 -
启动
Producer
和Consumer
-
查看管理界面的
Connections
页面,可以看到生产者和消费者的链接都处于blocking
状态。 -
在
Producer
的控制台按回车健,再观察管理界面的Connections
页面,会发现生产者的状态成了blocked
。 -
此时虽然在
Producer
控制台看到了发送两条消息的信息,但Consumer
并没有收到任何消息。并且在管理界面的Queues
页面也看到不到队列的消息数量有变化。 -
解除内存告警后,会发现
Consumer
收到了Producer
发送的两条消息。
内存换页
-
在Broker节点的使用内存即将达到内存阈值之前,它会尝试将队列中的消息存储到磁盘以释放内存空间,这个动作叫内存换页。
-
持久化和非持久化的消息都会被转储到磁盘中,其中持久化的消息本身就在磁盘中有一份副本,此时会将持久化的消息从内存中清除掉。
-
默认情况下,在内存到达内存阈值的 50%时会进行换页动作。也就是说,在默认的内存阈值为 0.4 的情况下,当内存超过 0.4 x 0 .5=0.2 时会进行换页动作。
-
通过修改配置文件,调整内存换页分页阈值(不能通过命令调整)。
# 此值大于1时,相当于禁用了换页功能。 vm_memory_high_watermark_paging_ratio = 0.75
磁盘告警
-
当磁盘剩余空间低于磁盘的阈值时,RabbitMQ 同样会阻塞生产者,这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃
-
默认情况下,磁盘阈值为50MB,表示当磁盘剩余空间低于50MB 时会阻塞生产者并停止内存中消息的换页动作
-
这个阈值的设置可以减小,但不能完全消除因磁盘耗尽而导致崩渍的可能性。比如在两次磁盘空间检测期间内,磁盘空间从大于50MB被耗尽到0MB
-
通过命令可以调整磁盘阈值,临时生效,重启恢复
# disk_limit 为固定大小,单位为MB、GB rabbitmqctl set_disk_free_limit <disk_limit>
或者
# fraction 为相对比值,建议的取值为1.0~2.0之间 rabbitmqctl set_disk_free_limit mem_relative <fraction>
模拟磁盘告警
-
在服务器通过命令,临时调整磁盘阈值(需要设置一个绝对大与当前磁盘空间的数值)
rabbitmqctl set_disk_free_limit 102400GB
-
刷新管理页面(可能需要刷新多次),在 Overview -> Nodes 中可以看到Disk space变成了红色,表示此节点磁盘告警了
-
后续步骤同模拟内存告警。