一、rabbitmq节点
1、节点分类
1)磁盘节点:配置信息和元信息存储在磁盘上
2)内存节点:配置信息和元信息存储在内存中,RAM节点不提供更高的消息速率
2、节点的选择
1)在单机情况下,节点必须为磁盘节点
2)在集群模式下,至少有一个节点是磁盘节点
如果唯一磁盘的磁盘节点崩溃了,不能进行如下操作:
- 不能创建队列
- 不能创建交换器
- 不能创建绑定
- 不能添加用户
- 不能更改权限
- 不能添加和删除集群几点
3)集群中所有节点都是对等的,不存在主从关系
二、rabbitmq的三种模式
1、单机模式,就是单独运行一个rabbitmq服务
2、普通集群模式
1)节点之间同步元数据
- 队列元数据:队列名称和它的属性;
- 交换器元数据:交换器名称、类型和属性;
- 绑定元数据:一张简单的表格展示了如何将消息路由到队列;
- vhost元数据:为vhost内的队列、交换器和绑定提供命名空间和安全属性;
- 用户元数据
- 权限元数据
2)消息不会在节点之间同步
3)队列只会在创建的节点中存在,其他节点只知道这个queue的metadata信息和一个指向queue的owner node的指针
3、生产和消费消息
1)如果生产者消费者连接的节点为队列所在节点,集群中的消息收发只与该节点有关
2)如果连接的节点为队列非所在节点,该节点起路由转发作用,
生产消息:根据节点上有关的元数据,将数据转发至队列所在节点上,最终发送的消息还是会存储至队列所在节点上。
消费消息:根据节点上有关的元数据,从队列所在节点拉取消息,发送给消费者
3、镜像集群模式
1)每一个镜像队列都包含一个master和1个或多个slave队列
2)一旦主节点不可用,最老的从队列将被选举为新的主队列。
3)镜像模式是在普通模式的基础上,通过配置同步策略,将消息同步到从队列
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority] -p Vhost: 可选参数,针对指定vhost下的queue进行设置 Name: policy的名称 Pattern: queue的匹配模式(正则表达式) Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes all:表示在集群中所有的节点上进行镜像 exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定 nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定 ha-params:作为参数,为ha-mode的补充 ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual priority:可选参数,policy的优先级
实例: rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to all
三、docker部署镜像模式
cat>>/etc/hosts<<EOF 10.31.4.45 test-prd-10-31-4-45 10.31.4.96 test-prd-10-31-4-96 EOF systemctl enable docker systemctl start docker docker run --name rabbitmq-3.7.16 -e RABBITMQ_DEFAULT_PASS="12345678" -e RABBITMQ_DEFAULT_USER="root" -v /data/rabbitmq:/var/lib/rabbitmq -e RABBITMQ_ERLANG_COOKIE="NLZZHgKCFB123XSVWXGD" --network=host -d rabbitmq:3.7.16-management 在节点10.31.4.45 docker exec abf6fe67724e rabbitmqctl stop_app docker exec abf6fe67724e rabbitmqctl join_cluster rabbit@test-prd-10-31-4-96 docker exec abf6fe67724e rabbitmqctl start_app 在其中一个节点执行同步策略 docker exec 51189b820642 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}' --apply-to all