设置cookie
rabbitmq节点需要能互相访问到的话,节点的cookie必须保持一致。在类nix系统中,此cookie文件的位置存放在 /var/lib/rabbitmq/.erlang.cookie。
可以把其中一个节点的文件复制到其它节点中即可。在操作的过程中,关闭节点服务器,操作完成后再打开。以免造成cookie不一致,只能手动杀死服务器进程。
设置节点名称
rabbitmq节点名称默认为rabbit@hostname。这里hostname使用的是short hostname。通过
hostsname -s来查看。
我们也可以自己设置节点名称。新建/etc/rabbitmq/rabbitmq-env.conf文件,设置NODENAME即可。
1 2 |
[root@premium.dev152.youku]$ cat /etc/rabbitmq/rabbitmq-env.conf NODENAME=rabbit@dev152 |
上面设置的节点名称为rabbit@dev152,与hostname是完全不同的。这需要在/etc/hosts文件中,增加 127.0.0.1 dev152的记录。
组建集群
在本文中,通过两个节点rabbit@dev150,rabbit@dev152来说明集群的搭建。
rabbitmq设置集群的时候,有两个方式
- 普通模式,这个是默认的。
- 镜像模式,这个在普通模式的基础上,进一步的设置。
普通模式
查看节点的集群状态的话,通过
rabbitmqctl cluster_status命令。
在设置集群之前,确保两个节点是能互通访问。比如说已登录在dev152这个服务器上。
rabbitmqctl status -n rabbit@dev150是否能连接到dev150这个节点。如果不能连接,显示nodedown,可以通过两种方式去解决。一个是dns解析。另一个是配置/etc/hosts。在dev152的hosts文件中,增加
10.10.72.150 dev150。同样地,在dev150中也做相应的配置。
还需要注意的一点是,两个节点最好在同一个网段中。如果通过WAN互联,性能是比较差得。
组建集群,操作如下
1 2 3 4 5 6 |
[root@premium.dev152.youku]$ rabbitmqctl stop_app Stopping node rabbit@dev152 ... [root@premium.dev152.youku]$ rabbitmqctl join_cluster rabbit@dev150 Clustering node rabbit@dev152 with rabbit@dev150 ... [root@premium.dev152.youku]$ rabbitmqctl start_app Starting node rabbit@dev152 ... |
在dev152上查看集群状态
1 2 3 4 5 6 |
[root@premium.dev152.youku]$ rabbitmqctl cluster_status Cluster status of node rabbit@dev152 ... [{nodes,[{disc,[rabbit@dev150,rabbit@dev152]}]}, {running_nodes,[rabbit@dev150,rabbit@dev152]}, {cluster_name,<<"rabbit@premium">>}, {partitions,[]}] |
可以看到,集群中已经有两个节点了。同样在dev150上操作,也可以看到
1 2 3 4 5 6 |
[root@premium.dev150.youku]$ rabbitmqctl cluster_status Cluster status of node rabbit@dev150 ... [{nodes,[{disc,[rabbit@dev150,rabbit@dev152]}]}, {running_nodes,[rabbit@dev152,rabbit@dev150]}, {cluster_name,<<"rabbit@premium">>}, {partitions,[]}] |
到目前为止,我们已经建立了两个节点,分别为dev152和dev150。
在此种模式下,如果给其中一个节点发送消息,比如dev152。发送成功后,我们也会在dev150上看到队列信息以及消息数,并且两个节点的数量是一致的。但是要注意的是,消息内容只会存储在dev152上。
为了提高性能,在这两个节点中组建逻辑上的主从关系。一个节点负责写,另一个节点负责读出。
在此种模式下,进行了读写分离,提高了性能。但是一旦遇到单点故障,dev152出现故障的话,那消息就永久丢失了。
镜像模式
使用镜像模式,可以把队列内容复制到其它的节点。这样如果一个节点出现宕机,队列内容也还在其它节点。这样可以提高可用性。 通过policy镜像队列,可以选择同步到所有节点,或者指定节点和节点名称。
1 2 |
[root@premium.dev152.youku]$ rabbitmqctl set_policy ha-allqueue "^" '{"ha-mode":"all"}' Setting policy "ha-allqueue" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0" ... |
在默认vhost中创建名称为ha-allqueue的policy。所有队列都创建镜像,并同步至所有节点。
在rabbitmq中没有负载均衡,我们需要自己实现。