[官方翻译]RabbitMQ 原生 CP 集群使用

4 单机集群(跟多主机集群相似)node

首先过一下rabbitmqctl提供的方法git

$sudo rabbitmqctl | egrep cluster
    join_cluster <clusternode> [--ram] 加入集群,cluster方法的升级,更加简单
    cluster_status 查看集群状态,app不启动,也是能够查看基本信息
    change_cluster_node_type disc | ram 更改节点类型
    forget_cluster_node [--offline] 移除集群
    rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 ...] 重命名节点名称
    update_cluster_nodes clusternode 更新节点
    set_cluster_name name 设置集群名称

0 若是已经启动management插件,则先要关闭插件github

sudo rabbitmq-plugins disable rabbitmq_management

1 启动多个rabbitmq实例docker

sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detatched &
sudo RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detatched &
sudo RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit_2 rabbitmq-server -detatched &

启动成功输出:bash

...
completed with 0 plugins.
completed with 0 plugins.
completed with 0 plugins.
...

查看3个进程是否启动服务器

sudo netstat -pan |egrep "5672|5673|5674"

或者markdown

sudo rabbitmqctl -n rabbit@zhaofeng-pc status ;\
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc status ;\
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc status

2 加入集群 rabbitmq集群依赖的是erlang opt功能 rabbitmq的集群按节点持久化类型分为磁盘型和内存型,磁盘型节点必须有一个;按照性质可分为持有者和复制者.cookie

如今将rabbit和rabbit_1,以磁盘的类型接入集群,加入集群时,能够将一个节点当作全部者节点, 其余节点依次接入到全部者集群.网络

接入集群的三个步骤,stop_app,join_cluster,start_app 首先查看集群状态app

sudo rabbitmqctl -n rabbit@zhaofeng-pc cluster_status ;\
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc cluster_status ;\
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc cluster_status

能够看到集群都是单节点的.如今把rabbit和rabbit_1加到同一个集群,上面已经看到了,每一个节点 其实都是在集群中,只不过只有他们自己节点,那么,如今就只须要将rabbit_1加到rabbit便可.

sudo rabbitmqctl -n rabbit_1@zhaofeng-pc stop_app
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc join_cluster rabbit@zhaofeng-pc
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc start_app

下面咱们将rabbit_2以ram类型加入rabbit

sudo rabbitmqctl -n rabbit_2@zhaofeng-pc stop_app
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc join_cluster --ram rabbit@zhaofeng-pc
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc start_app

操做到如今,你应该能够看到相似下面信息

Cluster status of node 'rabbit_2@zhaofeng-pc'
[{nodes,[{disc,['rabbit_1@zhaofeng-pc','rabbit@zhaofeng-pc']},
     {ram,['rabbit_2@zhaofeng-pc']}]},
{running_nodes,['rabbit@zhaofeng-pc','rabbit_1@zhaofeng-pc',
             'rabbit_2@zhaofeng-pc']},
{cluster_name,<<"rabbit@zhaofeng-pc">>},
{partitions,[]},
{alarms,[{'rabbit@zhaofeng-pc',[]},
      {'rabbit_1@zhaofeng-pc',[]},
      {'rabbit_2@zhaofeng-pc',[]}]}]

3 集群客户端代码验证

如今开始进行代码验证,是否真正的集群了 测试代码跟官方hello world同样简单,不在这里粘贴.

测试代码链接

集群中有3个服务器(本地),向任意一个服务中发送消息,都可以在其余服务器接收到消息, 证实集群有效

4 集群节点其余操做

为了提升性能,如今咱们改变一下rabbit_1的类型为ram

sudo rabbitmqctl -n rabbit_1@zhaofeng-pc stop_app
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc change_cluster_node_type ram
sudo rabbitmqctl -n rabbit_1@zhaofeng-pc start_app

如今你能够看到rabbit_1已经变成了ram类型的节点了. 若是发现节点有问题,或者其余缘由,想要下线集群,能够经过reset/force_reset或forget_cluster_node, 其中,reset:重置自己的节点,必须等待stop_app; forget_cluster_node:集群中在线的节点,将已下线的节点移除集群,用于删除故障节点

$sudo rabbitmqctl -n rabbit_2@zhaofeng-pc reset
Resetting node 'rabbit_2@zhaofeng-pc'
Error:  Mnesia is still running on node 'rabbit_2@zhaofeng-pc'.
        Please stop the node with rabbitmqctl stop_app first.


sudo rabbitmqctl -n rabbit_2@zhaofeng-pc stop_app
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc reset
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc start_app

使用 forget_cluster_node,其中--offline,用于删除最后一个节点

sudo rabbitmqctl -n rabbit_2@zhaofeng-pc stop_app
sudo rabbitmqctl -n rabbit@zhaofeng-pc forget_cluster_node  rabbit_2@zhaofeng-pc

处理完了,从新上线

sudo rabbitmqctl -n rabbit_2@zhaofeng-pc join_cluster rabbit@zhaofeng-pc
sudo rabbitmqctl -n rabbit_2@zhaofeng-pc start_app

其余的小功能: 集群任意节点重命名集群名称,默认集群名称为收割加入节点的节点名称 默认是:

$sudo rabbitmqctl -n rabbit_2@zhaofeng-pc cluster_status
{cluster_name,<<"rabbit@zhaofeng-pc">>},
$sudo rabbitmqctl -n rabbit_2@zhaofeng-pc set_cluster_name rabbit-cluster
Setting cluster name to rabbit-cluster
$sudo rabbitmqctl -n rabbit_2@zhaofeng-pc cluster_status
...
{cluster_name,<<"rabbit-cluster">>},
...

5 多机器(真机)集群

第一点 注意erlang-cookie要保持一致. cookie 存放的位置在:

sudo cat ~/.erlang.cookie
sudo cat /var/lib/rabbitmq/.erlang.cookie

第二点 rabbitmq的版本要一致

咱们可使用docker 验证一下

启动3个容器

docker run --rm -d --hostname my-rabbit --name my-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq
docker run --rm -d --hostname my-rabbit-1 --name my-rabbit-1 -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq
docker run --rm -d --hostname my-rabbit-2 --name my-rabbit-2 -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq

查看第一个IP,其后两个ip依次累加

$docker inspect my-rabbit | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

如今已经知道三个机器地址了.用到本文讲得,依次为三个服务器添加远程用户

$docker  exec -it  my-rabbit bash

root@my-rabbit:/# rabbitmqctl add_user admin admin
Creating user "admin"
root@my-rabbit:/# rabbitmqctl authenticate_user admin admin
Authenticating user "admin"
Success
root@my-rabbit:/# rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
Setting permissions for user "admin" in vhost "/"
root@my-rabbit:/# rabbitmqctl list_user_permissions admin
Listing permissions for user "admin"
/	.*	.*	.*

rabbitmq依赖的是主机名,因此还要在/etc/hosts添加其余节点主机信息, 事实上,只要保证非全部者节点有全部者节点便可

172.17.0.3 my-rabbit

root@my-rabbit:/# echo -e "172.17.0.3 my-rabbit\n172.17.0.4 my-rabbit-1\n172.17.0.5 my-rabbit-2" >> /etc/hosts

或者是,使用--link,直接使用其余容器

添加完了这些,剩下的就是stop_app,join_cluster,start_app了,下面举例一个

root@my-rabbit-1:/# rabbitmqctl stop_app
Stopping rabbit application on node 'rabbit@my-rabbit-1'
root@my-rabbit-1:/# rabbitmqctl join_cluster --ram rabbit@my-rabbit
Clustering node 'rabbit@my-rabbit-1' with 'rabbit@my-rabbit'
root@my-rabbit-1:/# rabbitmqctl start_app
Starting node 'rabbit@my-rabbit-1'
root@my-rabbit-1:/# rabbitmqctl cluster_status
Cluster status of node 'rabbit@my-rabbit-1'
[{nodes,[{disc,['rabbit@my-rabbit-2','rabbit@my-rabbit']},
         {ram,['rabbit@my-rabbit-1']}]},
 {running_nodes,['rabbit@my-rabbit','rabbit@my-rabbit-2',
                 'rabbit@my-rabbit-1']},
 {cluster_name,<<"rabbit@my-rabbit">>},
 {partitions,[]},
 {alarms,[{'rabbit@my-rabbit',[]},
          {'rabbit@my-rabbit-2',[]},
          {'rabbit@my-rabbit-1',[]}]}]

如今咱们已经实现了真机(测试/生产环境)条件下的集群了. 我使用docker,建立了简单的集群镜像,方便测试使用

Docker Hub镜像地址

代码测试正常! 测试代码链接

6 其余的分布式方式

官方还提供了一种Federation / Shovel的方式,这是一种转发的机制,消息能够发我其余的服务节点.

这二者的区别

分布式原理: Federation / Shovel: exchange 逻辑上是分离的,可能有不一样的拥有者

Federation/Shovel cluster
exchange是逻辑分离的,可能有不一样拥有者 单个逻辑exchange
不限制rabbitmq和erlang 版本 rabbitmq和erlang 版本要保持一致
exchange能够经过不可靠(公网)网络链接,<br/>直接使用amqp链接,可是须要设置用户权限. 可靠(内网)网络,通讯依赖Erlang interode,共享erlang cookie
拓扑结构能够是单项或双向 节点两两互联
cap理论中的ap cap理论中的cp
exchange能够有单独的信息,有些消息是本地的 每一个节点的消息都是相同的
客户端只能看到链接的服务器队列 客户端能够看到集群内全部队列

没法正常显示markdown表格

因为我的水平有限,若有问题请指出。 https://fansinzhao.github.io/page/image/weixin.png

相关文章
相关标签/搜索