文章目录
一、clustering(集群)
1、使用集群的原因
如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况,该怎么办?单台 RabbitMQ服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个 RabbitMQ 集群才是解决实际问题的关键。
2、搭建步骤
2.1、拉取镜像
博主这里早已经拉取过了,没有拉取的记得拉取一下。
docker pull rabbitmq:3.12-management
2.2、创建三个RabbitMQ容器节点
创建三个节点命令:
sudo docker run -d--hostname rabbitmq01 --name rabbitmqCluster01 -p6002:15672 -p5674:5672 -eRABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq:3.12-management sudo docker run -d--hostname rabbitmq02 --name rabbitmqCluster02 -p7002:15672 -p5675:5672 -eRABBITMQ_ERLANG_COOKIE='rabbitmqCookie'--link rabbitmqCluster01:rabbitmq01 rabbitmq:3.12-management sudo docker run -d--hostname rabbitmq03 --name rabbitmqCluster03 -p8002:15672 -p5676:5672 -eRABBITMQ_ERLANG_COOKIE='rabbitmqCookie'--link rabbitmqCluster01:rabbitmq01 --link rabbitmqCluster02:rabbitmq02 rabbitmq:3.12-management
- -d 后台运行容器;
- –name 指定容器名;
- -p 指定服务运行的端口(6002:应用访问端口;15672:控制台Web端口号),控制台端口用于管理rabbitmq,应用访问端口号为rabbitclient等应用访问。;
- –hostname 主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
- -e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码,RABBITMQ_ERLANG_COOKIE 节点认证作用,部署集成时 需要同步该值)
- –link 用于容器的链接
查看容器运行如何:
sudo docker ps
2.3、集群搭建
将rabbitmqCluster02 节点和 rabbitmqCluster03 节点加入 rabbitmqCluster01 创建集群
进入 rabbitmqCluster02 节点
sudo docker exec -it rabbitmqCluster02 /bin/bash
输入以下命令
rabbitmqctl stop_app rabbitmqctl reset #rabbitmq01为rabbitmqCluster01容器中的hostnamerabbitmqctl join_cluster --ram rabbit@rabbitmq01 rabbitmqctl start_app
进入 rabbitmqCluster03 节点
sudo docker exec -it rabbitmqCluster03 /bin/bash
输入以下命令
rabbitmqctl stop_app rabbitmqctl reset #rabbitmq01为rabbitmqCluster01容器中的hostnamerabbitmqctl join_cluster --ram rabbit@rabbitmq01 rabbitmqctl start_app
执行完后在任意节点(博主这里选用三号节点)
sudo docker exec -it rabbitmqCluster03 /bin/bash
查看集群状态:
rabbitmqctl cluster_status
此时可以在Web页面看到主从信息
从机也能看到主从信息
二、镜像队列
1、使用镜像的原因
如果 RabbitMQ 集群中只有一个 Broker 节点,那么该节点的失效将导致整体服务的临时性不可用,并且也可能会导致消息的丢失。可以将所有消息都设置为持久化,并且对应队列的durable属性也设置为true,但是这样仍然无法避免由于缓存导致的问题:因为消息在发送之后和被写入磁盘井执行刷盘动作之间存在一个短暂却会产生问题的时间窗。通过 publisherconfirm 机制能够确保客户端知道哪些消息己经存入磁盘,尽管如此,一般不希望遇到因单点故障导致的服务不可用。
引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
2、搭建步骤
1.启动三台集群节点
2.随便找一个节点添加 policy
参数解释:
- Name: policy的名称,用户自定义。
- Pattern: queue的匹配模式(正则表达式)。^表示所有队列都是镜像队列。
- Definition: 镜像定义,包括三个部分ha-sync-mode、ha-mode、ha-params。
- ha-mode: 指明镜像队列的模式,有效取值范围为all/exactly/nodes。
- all:表示在集群所有的代理上进行镜像。
- exactly:表示在指定个数的代理上进行镜像,代理的个数由ha-params指定。
- nodes:表示在指定的代理上进行镜像,代理名称通过ha-params指定。
- ha-params: ha-mode模式需要用到的参数。
- ha-sync-mode: 表示镜像队列中消息的同步方式,有效取值范围为:automatic,manually。
- automatic:表示自动向master同步数据。
- manually:表示手动向master同步数据。
- Priority: 可选参数, policy的优先级。
3.在 node1 上创建一个队列发送一条消息,队列存在镜像队列
4.停掉 node1 之后发现 node2 成为镜像队列
5.就算整个集群只剩下一台机器了 依然能消费队列里面的消息说明队列里面的消息被镜像队列传递到相应机器里面了。
总结
以上就是RabbitMQ 集群和镜像队列的相关知识点,希望对你有所帮助。