长春地区网站建设,专业建设验收网站,番禺区移动端网站制作,个人网站备案核验单RabbiMQ简介
RabbitMQ是用Erlang开发的#xff0c;集群非常方便#xff0c;因为Erlang天生就是一门分布式语言#xff0c;但其本身并不支持负载均衡。
RabbitMQ模式
RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列…RabbiMQ简介
RabbitMQ是用Erlang开发的集群非常方便因为Erlang天生就是一门分布式语言但其本身并不支持负载均衡。
RabbitMQ模式
RabbitMQ模式大概分为以下三种: (1)单一模式。 (2)普通模式(默认的集群模式)。 (3)镜像模式(把需要的队列做成镜像队列存在于多个节点属于RabbitMQ的HA方案在对业务可靠性要求较高的场合中比较适用)。 要实现镜像模式需要先搭建一个普通集群模式在这个模式的基础上再配置镜像模式以实现高可用。
RabbitMQ特点
RabbitMQ的集群节点包括:内存节点、磁盘节点。RabbitMQ支持消息的持久化 也就是数据写在磁盘上最合适的方案就是既有内存节点又有磁盘节点。
节点环境
192.168.1.17 rabbitmq3 内存节点 192.168.1.18 rabbitmq2 内存节点 192.168.1.19 rabbitmq1 磁盘节点
注意: RabbitMQ集群节点必须在同一网段里如果是跨广域网效果会变差。
RabbitMQ普通集群配置
配置hosts文件
更改三台MQ节点的计算机名分别为rabbitmq1、rabbitmq2 和rabbitmq3然后修改hosts配置文件
#查看主机名
hostname#修改主机名
hostnamectl set-hostname rabbitmq1#或者
vim /etc/hostname //其他两台相同
rabbitmq1vim /etc/hosts
192.168.1.17 rabbitmq3
192.168.1.18 rabbitmq2
192.168.1.19 rabbitmq1#如果先安装了rabbitMQ后改的主机名,启动可能会有问题
#分别在三台机器上 创建文件
vim /etc/rabbitmq/rabbitmq-env.conf
NODENAMErabbitrabbitmq1 #注意这里的主机名修改对应的节点主机名rabbitmq软件安装
分别安装三台的rabbitMQ
Centos离线安装RabbitMQ并开启MQTT
arm架构安装RabbitMQ并升级erlang解决Requires: erlang 23.2
#删除rabbitmq之前启动过生成的文件
cd /var/lib/rabbitmq/
rm -rf *#重启
sudo systemctl restart rabbitmq-server.service#停止
sudo systemctl stop rabbitmq-server.service #查看服务启动状态
sudo systemctl status rabbitmq-server.service #查看开机自启动状态
sudo systemctl is-enabled rabbitmq-server.service#查看状态
rabbitmqctl status#创建用户admin和密码beyond_2021
rabbitmqctl add_user admin beyond_2021#设置admin角色
rabbitmqctl set_user_tags admin administrator#分配权限
rabbitmqctl set_permissions -p / admin .* .* .* #RabbitMQ提供了一个非常友好的图形化监控页面插件rabbitmq_management让我们可以一目了然看见Rabbit的状态或集群状态。
#查看插件安装情况
rabbitmq-plugins list#开启图形化监控页面插件
rabbitmq-plugins enable rabbitmq_management //管理控制台的默认端口是15672#开启mqtt插件
rabbitmq-plugins enable rabbitmq_mqtt //默认端口mqtt是1883 mqtt://192.168.1.17:1883#开启Mqtt的websocket插件
rabbitmq-plugins enable rabbitmq_web_mqtt //默认端口websocket是15675 ws://192.168.1.17:15675/ws path是/ws #查看监听端口插件监控的端口是15672
netstat -ntap |grep 5672拷贝erlang.cookie
Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。
#查看rabbitmq1的节点的cookie文件
cat /var/lib/rabbitmq/.erlang.cookie
HKHIEHFDVNFFGGPQ#用scp的方式将rabbitmq1节点的.erlang.cookie的值复制到其他两个节点中。
#rabbitmq1复制到其他两个节点中
scp /var/lib/rabbitmq/.erlang.cookie root192.168.1.17:/var/lib/rabbitmq/.erlang.cookie#重启服务
sudo systemctl restart rabbitmq-server.service scp /var/lib/rabbitmq/.erlang.cookie root192.168.1.18:/var/lib/rabbitmq/.erlang.cookiesudo systemctl restart rabbitmq-server.service #如果报错: 参考链接: https://blog.csdn.net/u014209205/article/details/106647229
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq
mkdir -pv /var/log/rabbitmq#报错:failed to open log file at /var/log/rabbitmq/rabbitrabbitmq3.log, reason: no such file or directory#创建文件vim /var/log/rabbitmq/rabbitrabbitmq3.logfailed to open log file at /var/log/rabbitmq/rabbitrabbitmq3_upgrade.log, reason: no such file or directory
#创建文件vim /var/log/rabbitmq/rabbitrabbitmq3_upgrade.log将rabbitmq2、rabbitmq3作为内存节点加入rabbitmq1节点集群中
在rabbitmq2 rabbitmq3下执行
rabbitmqctl stop_app //停掉rabbit应用rabbitmqctl join_cluster --ram rabbitrabbitmq1 //加入到内存节点#也可以加入到磁盘节点
#rabbitmqctl join_cluster rabbitrabbitmq1 //加入到磁盘节点rabbitmqctl start_app //启动rabbit应用#如果加入集群报错
Clustering node rabbitrabbitmq2 with rabbitrabbitmq1
Error:
incompatible_feature_flags
表示: Rabbitmq各节点版本不一致导致的(1默认rabbitmq启动后是磁盘节点在这个cluster命令下rabbitmq2和rabbitmq3是内存节点rabbitmq1是磁盘节点。 2如果要使rabbitmq2、rabbitmq3都是磁盘节点去掉–ram参数即可。 3如果想要更改节点类型可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用
在RabbitMQ集群中必须至少有一个磁盘节点否则队列元数据无法写入到集群中当磁盘节点宕掉时集群将无法写入新的队列元数据信息。
保持版本一致,rabbitmq卸载与升级
我这里有rabbitmq3.8.2和3.8.18版本的rpm包,有需要可以给我留言或评论
#查看版本
rabbitmqctl versionerlerl -version#查询rpm安装包
rpm -qa rabbitmq
rpm -qa epel-release
rpm -qa erlang#rpm卸载老版本
sudo rpm -e rabbitmq-server-3.8.2-1.el7.noarch.rpm
sudo rpm -e erlang-22.2.8-1.el7.x86_64.rpm
sudo rpm -e epel-release-7-11.noarch.rpm#yum查询安装包与卸载
yum list | grep rabbitmq
yum -y remove rabbitmq-server.noarch
yum list | grep erlang
yum remove erlang.x86_64
yum remove socat#安装最新的,相同的版本
sudo rpm -ivh epel-release-7-13.noarch.rpm
sudo rpm -ivh erlang-23.3.4.4-1.el7.x86_64.rpm
sudo rpm -ivh rabbitmq-server-3.8.18-1.el7.noarch.rpm#然后重新加入到集群
rabbitmqctl join_cluster --ram rabbitrabbitmq1 查看集群状态
#查看集群状态
rabbitmqctl cluster_status
#显示如下:
Cluster status of node rabbitrabbitmq1 ...
BasicsCluster name: rabbitrabbitmq1Disk Nodesrabbitrabbitmq2
rabbitrabbitmq3
rabbitrabbitmq1Running Nodesrabbitrabbitmq2
rabbitrabbitmq3
rabbitrabbitmq1Versionsrabbitrabbitmq2: RabbitMQ 3.8.18 on Erlang 23.3.4.4
rabbitrabbitmq3: RabbitMQ 3.8.18 on Erlang 23.3.4.4
rabbitrabbitmq1: RabbitMQ 3.8.18 on Erlang 23.3.4.4Maintenance statusNode: rabbitrabbitmq2, status: not under maintenance
Node: rabbitrabbitmq3, status: not under maintenance
Node: rabbitrabbitmq1, status: not under maintenanceAlarms(none)Network Partitions(none)ListenersNode: rabbitrabbitmq2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbitrabbitmq2, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbitrabbitmq2, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSockets
Node: rabbitrabbitmq2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbitrabbitmq2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbitrabbitmq3, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbitrabbitmq3, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbitrabbitmq3, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSockets
Node: rabbitrabbitmq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbitrabbitmq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbitrabbitmq4, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbitrabbitmq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbitrabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbitrabbitmq1, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbitrabbitmq1, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSocketsFeature flagsFlag: 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: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabledrabbitmq集群节点的移除
#停止rabbitmq2 rabbitmq3服务或者rabbitmqctl stop_app停止应用后
#在rabbitmq1上 从集群中 移除节点
rabbitmqctl forget_cluster_node rabbitrabbitmq2
rabbitmqctl forget_cluster_node rabbitrabbitmq3#重置数据, 用户名密码都会要重新设置
rabbitmqctl stop_app
rabbitmqctl reset #修改成磁盘节点
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc(ram)
rabbitmqctl start_app登录rabbitmq web管理控制台创建新的队列
打开浏览器输入任意一个节点的: 比如17节点, http://192.168.1.17:15672, 输入之前创建的用户Usernameadmin输入Password:beyond_2021 ,登录后出现如图所示的界面。 根据界面提示创建一条队列 队列创建成功 在RabbitMQ集群中必须至少有一个磁盘节点否则队列元数据无法写入到集群中当磁盘节点宕掉时集群将无法写入新的队列元数据信息。
RabbitMQ镜像集群配置
上面已经完成RabbitMQ默认集群模式但并不保证队列的高可用性尽管交换机、绑定这些可以复制到集群里的任何一个节点但是队列内容不会复制。虽然该模式解决一项目组节点压力但队列节点宕机直接导致该队列无法应用只能等待重启所以要想在队列节点宕机或故障也能正常应用就要复制队列内容到集群里的每个节点必须要创建镜像队列。
镜像队列是基于普通的集群模式的然后再添加一些策略所以你还是得先配置普通集群然后才能设置镜像队列我们就以上面的集群接着做。
设置的镜像队列可以通过开启的网页的管理端也可以通过命令这里说的是其中的网页设置方式。
创建rabbitmq策略
在任一节点控制台上创建策略 比如:在rabbitmq1节点的控制台上创建策略:http://192.168.1.17:15672
1Web网页配置 点击Admin菜单–-右侧的Policies选项–-左侧最下下边的Add/update a policy。
2按照图中的内容根据自己的需求填写。 Name: my_liang Pattern: ^ Definition: ha-modeall Apply to Queues Name:策略名称 Pattern匹配的规则(^ a)表示匹配a开头的队列如果是匹配所有的队列那就是^. Definition:使用ha-mode模式中的all也就是同步所有匹配的队列。问号链接帮助文档。
3点击Add policy添加策略 此时分别登陆rabbitmq2、rabbitmq3两个节点的控制台可以看到上面添加的这个策略
添加队列
添加队列: 可以在控制台添加,也可以用代码或工具订阅会自己创建队列
控制台创建
在rabbitmq1节点的控制台上添加队列 1点击Queues菜单–左侧下边的Add a new queue 2输入Name和Arguments参数的值别的值默认即可 Name:队列名称Durability:队列是否持久化Node消息队列的节点Auto delete自动删除Arguments:使用的策略类型
3点击Add queue 将鼠标指向2可以显示出另外两台消息节点。
往队列里发送消息
(1点击ab队列按钮 2拖动滚动条点击publish message 3填写相关内容 Persistent:表示持久化Headers:随便填写即可Properties:点击问号选择一个消息ID号Payload:消息内容
4点击Publish message按钮 发送消息
关闭消息发送提示窗口
点击queue按钮发现ab队列的Ready和Total中多了一条消息记录。 做破坏性测试
(1将rabbitmq1节点的服务关闭再通过rabbitmq2和rabbitmq3查看消息记录是否还存在。
rabbitmqctl stop_app //停掉rabbitmq1的rabbit应用
查看rabbitmq2或rabbitmq3节点的控制台 从中可以看到ab队列已经从之前的2显示成1了而且消息记录是存在的。
(2再将rabbitmq2节点的服务关闭通过rabbitmq3查看消息记录是否还存在。
rabbitmqctl stop_app //停掉rabbitmq2的rabbit应用
从rabbitmq3控制台中可以看到ab队列和消息记录还是存在的只是变成了一个节点了。
3将rabbitmq1和rabbitmq2的服务再启动起来
rabbitmqctl start_app //启动rabbitmq1、rabbitmq2的rabbit应用 从中可以看到ab队列后面2变成了粉色鼠标指上去显示镜像无法同步。如果这时候停掉rabbitmq3节点的服务那么队列里面的消息将会丢失。
采取的解决办法是选择在rabbitmq1或rabbitmq2节点上执行同步命令。
rabbitmqctl sync_queue ab //同步ab队列
同步完成后2又变成了蓝色。
这样我们就测试了rabbitmq集群的破坏性测试说明集群配置成功。
参考链接: https://blog.51cto.com/11134648/2155934