官方提供的另一种集群方式,基本工做原理:经过使用rabbitmq的插件的形式提供集群功能. 每一个节点都启用rabbitmq_federation,rabbitmq_federation_management.节点之间经过 amqp协议传输消息,因为是遵循协议,因此节点之间的版本能够不一样,不想原生集群那么多限制. 绑定关系,经过设定parameter和policy关联集群.html
特性:linux
我使用docker建立两个容器git
docker run -d --hostname my-rabbit-cluster-federation --name my-rabbit-cluster-federation fansin/rabbitmq-cluster docker run -d --link my-rabbit-cluster-federation --hostname my-rabbit-cluster-federation-1 --name my-rabbit-cluster-federation-1 fansin/rabbitmq-cluster
第一步启动插件 启动每一个节点的插件github
rabbitmq-plugins enable rabbitmq_federation rabbitmq_federation_management
第二步 downstream节点 设置加入集群目标节点 设置/清楚参数,用来关联集群节点docker
rabbitmqctl set_parameter federation-upstream my-upstream '{"uri":"amqp://admin:admin@my-rabbit-cluster-federation/%2f","expires":3600000}' rabbitmqctl clear_parameter federation-upstream my-upstream
第三步 downstream节点
设置集群内容 设置/清除策略,用来肯定加入集群exchange,没法加载""空exchange服务器
rabbitmqctl set_policy --apply-to all federate-all "^fed\." '{"federation-upstream-set":"all"}' rabbitmqctl clear_policy federate-all
单独设置exchange 或 queuemarkdown
rabbitmqctl set_policy --apply-to queues federate-queue "^queue\." '{"federation-upstream-set":"all"}' rabbitmqctl set_policy --apply-to exchanges federate-exchange "^exchange\." '{"federation-upstream-set":"all"}'
第四步验证集群cookie
rabbitmqctl eval 'rabbit_federation_status:status().'
如今看my-rabbit-cluster-federation的集群会看到多个链接,而后再看 my-rabbit-cluster-federation-1也会看到多个链接,同时exchange上会有"federate-all" 特性.网络
代码测试用例app
建议先建立好queue或者exchange,若是不提早建立,代码第一次启动会报错.第二次就正常了. 队列默认建立的是durable的exchange或者queue,若是遇到durable的问题,须要从新删掉对应的exchange或者queue,从新建立.
docker run -d --hostname my-rabbit-federation --name my-rabbit-federation fansin/rabbitmq-federation docker run -d --link my-rabbit-federation -e JOIN_CLUSTER=my-rabbit-federation --hostname my-rabbit-federation-1 --name my-rabbit-federation-1 fansin/rabbitmq-federation
再次贴一下与原生集群的区别:
分布式原理: Federation / Shovel: exchange 逻辑上是分离的,可能有不一样的拥有者
Federation/Shovel | cluster |
---|---|
exchange是逻辑分离的,可能有不一样拥有者 | 单个逻辑exchange |
不限制rabbitmq和erlang 版本 | rabbitmq和erlang 版本要保持一致 |
exchange能够经过不可靠(公网)网络链接,<br/>直接使用amqp链接,可是须要设置用户权限. | 可靠(内网)网络,通讯依赖Erlang interode,共享erlang cookie |
拓扑结构能够是单项或双向 | 节点两两互联 |
cap理论中的ap | cap理论中的cp |
exchange能够有单独的信息,有些消息是本地的 | 每一个节点的消息都是相同的 |
客户端只能看到链接的服务器队列 | 客户端能够看到集群内全部队列 |
官网介绍了提供了5种基本集群格式:
1 基本集群方式,这个是单向的集群
2 两节点相互federation,默认参数max_hops=1
不须要特殊设置
3 三节点两两federation,上面的节点+1,默认参数max_hops=1
不须要特殊设置
4 扇出(p/s订阅)树型 跟fanout的exchange相似功能, 注意设置参数max_hops=0
, 若是肯定树的深度,max_hops应当大于等于树的深度
5 环形 参数设置为max_hops=5
有一点,一旦环中一个节点down,整个环也就断了.
shovel跟federation使用相似,但使用的是erlang client,更底层,更多配置,也更灵活. 默认使用动态配置,关于静态配置请详看官网shovel
特性:
一样使用docker从新建立两个新容器
docker run -d --hostname my-rabbit-cluster-federation --name my-rabbit-cluster-federation -e RABBITMQ_ERLANG_COOKIE='secret cookie here' fansin/rabbitmq-cluster docker run -d --link my-rabbit-cluster-federation --hostname my-rabbit-cluster-federation-1 --name my-rabbit-cluster-federation-1 -e RABBITMQ_ERLANG_COOKIE='secret cookie here' fansin/rabbitmq-cluster
第一步启动插件 启动每一个节点的插件
rabbitmq-plugins enable rabbitmq_shovel rabbitmq_shovel_management
第二步 dest节点
(在src节点也能够,比较灵活) 设置加入集群目标节点 设置/清楚参数,用来关联集群节点
rabbitmqctl set_parameter shovel my-shovel-queue '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "src-queue": "shovel.queue", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "dest-queue": "shovel.queue"}' rabbitmqctl clear_parameter shovel my-shovel-queue
设置exchange
rabbitmqctl set_parameter shovel my-shovel-exchange '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "src-exchange": "shovel.exchange", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "dest-exchange": "shovel.exchange"}' rabbitmqctl set_parameter shovel my-shovel-exchange-1 '{"src-uri": "amqp://admin:admin@my-rabbit-cluster-federation-1/%2f", "src-exchange": "shovel.exchange", "dest-uri": "amqp://admin:admin@my-rabbit-cluster-federation/%2f", "dest-exchange": "shovel.exchange"}'
在docker容器中,后启动的容器link了前面的容器,可是前面的没法识别到后面容器ip,若是要在src节点
设置shovel,注意加入域名映射
echo "172.17.0.4 my-rabbit-cluster-federation-1" >> /etc/hosts
建议先建立好queue或者exchange,若是不提早建立,代码第一次启动会报错.第二次就正常了. 队列默认建立的是durable的exchange或者queue,若是遇到durable的问题,须要从新删掉对应的exchange或者queue,从新建立.
因为我的水平有限,若有问题请指出。