一、服务器与主机名列表

环境:2台Linux主机,主机名和IP如下,rabbitmq执行用户为rabbitmq,所属组为rabbitmq

172.16.192.145   ecs003

172.16.192.146   ecs004


二、在个节点服务器上做好hosts解析

#cat>>/etc/hosts<

172.16.192.145   ecs003

172.16.192.146   ecs004

EOF


三、在各节点安装Rabbitmq

1、安装epel源和rabbit-relang源

root@ecs003:~# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

root@ecs003:~# rpm -ivh epel-release-6-8.noarch.rpm

root@ecs003:~# wget -O /etc/yum.repos.d/epel-erlang.repo root@ecs003:~#http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo

2、安装erlang

root@ecs003:~# yum install erlang xmlto git -y

root@ecs003:~# rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc

3、安装rabbitmq

root@ecs003:~# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.6/rabbitmq-server-3.5.6-1.noarch.rpm

root@ecs003:~#rpm -ivh rabbitmq-server-3.5.6-1.noarch.rpm

在ecs0004上做同样的安装操作

4、rabbitmq页面(web)管理

启用web插件:

root@ecs003:~# rabbitmq-plugins enable rabbitmq_management

关闭web插件

root@ecs003:~#rabbitmq-plugins disable rabbitmq_management

可以用默认账号guest,guest登陆http://主机IP:15672,如果要远程登录,需要先创建帐户,因为是集群,所以只要在一台主机设置即可,其它会自动同步。

root@ecs003:~# rabbitmqctl add_user dtom 123456  #dtom为新建的用户,123456为密码

root@ecs003:~# rabbitmqctl  set_user_tags dtom administrator  #将用户设置为管理员角色

root@ecs003:~# rabbitmqctl set_permissions -p / iom “.*” “.*” “.*”    #在 / 虚拟主机里设置dtom用户配置权限,写权限,读权限。.*是正则表达式里用法。rabbitmq的权限是根据不同的虚拟主机(virtual hosts)配置的,同用户在不同的虚拟主机(virtual hosts)里可能不一样。

5、启动各节点rabiitmq,并验证启动情况

root@ecs003:~# rabbitmq-server --detached &

root@ecs003:~# ps -aux |grep rabbitmq


四、Rabbitmq集群环境配置

一个RABBITMQ集 群中可以共享user,virtualhosts,queues(开启Highly Available Queues),exchanges等。但message只会在创建的节点上传输。当message进入A节点的queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。

RABBITMQ的集群节点包括内存节点、磁盘节点。内存节点的元数据仅放在内存中,性能比磁盘节点会有所提升。不过,如果在投递message时,打开了message的持久化,那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。

集群环境说明:

ecs003作为磁盘节点,ecs004作为内存节点

1、同步erlang.cookie

杀掉ecs004的rabbitmq进程

root@ecs004:~#/etc/rabbitmq# ps -ef|grep rabbitmq|awk '{print $2}'|xarge kill -9

2、登录ecs003机器,执行:

root@ecs003:~# cd /var/lib/rabbitmq/

root@ecs003:~# /var/lib/rabbitmq# scp .erlang.cookie root@ecs004:/var/lib/rabbitmq/

在ecs004上启动rabbitmq

root@ecs004:~#/etc/rabbitmq# rabbitmq-server --detached & 或/etc/init.d/rabbitmq-server start

3、加入集群

查看ecs003集群状态

root@ecs003:~# /var/lib/rabbitmq# rabbitmqctl cluster_status

Cluster status of node rabbit@ecs003 ...

[{nodes,[{disc,[rabbit@ecs003]}]},

{running_nodes,[rabbit@ecs003]},

{cluster_name,<<"rabbit@ecs003">>},

{partitions,[]}]

4、ecs004加入ecs003集群:

root@ecs004:~# rabbitmqctl stop_app    #关闭ecs004中rabbitmq服务

root@ecs004:~# rabbitmqctl stop_app    #初始化node状态,会从集群中删除该节点,从管理数据库中删除所有数据,例如vhosts等等。在初始化之前rabbitmq的应用必须先停止

root@ecs004:~# /etc/rabbitmq# rabbitmqctl join_cluster rabbit@ecs003  #ecs004加入ecs003集群

Clustering node rabbit@ecs004 with rabbit@ecs003 ...

root@ecs004:~# /etc/rabbitmq# rabbitmqctl start_app   #启动rabbitmq服务

Starting node rabbit@ecs004 ...

RabbitMQ 3.5.6. Copyright (C) 2007-2015 Pivotal Software, Inc.

##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/

##  ##

##########  Logs: /var/log/rabbitmq/rabbit@ecs004.log

######  ##        /var/log/rabbitmq/rabbit@ecs004-sasl.log

##########

Starting broker... completed with 6 plugins.

root@ecs003:~# /var/lib/rabbitmq# rabbitmqctl cluster_status   #再次查看集群状态

Cluster status of node rabbit@ecs003 ...

[{nodes,[{disc,[rabbit@ecs003]},{ram,[rabbit@ecs004]}]},

{running_nodes,[rabbit@ecs004,rabbit@ecs003]},

{cluster_name,<<"rabbit@ecs003">>},

{partitions,[]}]

–第一行是集群中的节点成员,disc表示这些都是磁盘节点,ram表示为内存节点。

–第二行是正在运行的节点成员

5、更改节点属性:

root@ecs004:~# rabbitmqctl stop_app   –停止rabbitmq服务

root@ecs004:~# rabbitmqctl change_cluster_node_type disc/ram   –更改节点为磁盘或内存节点

root@ecs004:~# rabbitmqtl start_app    –开启rabbitmq服务

6、rabbitmq退出集群

假设要把ecs004退出集群,在ecs004上执行:

root@ecs004:~# rabbitmqctl stop_app

root@ecs004:~# rabbitmqctl reset

root@ecs004:~# rabbitmqctl start_app

在集群主节点上执行

root@ecs003:~# rabbitmqctl forget_cluster_node rabbit@ecs004

7、rabbitmq集群重启

集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:

先在一个节点上执行

#rabbitmqctl force_boot

#service rabbitmq-server start

在其他节点上执行

#service rabbitmq-server start

查看cluster状态是否正常(要在所有节点上查询)。

#rabbitmqctl cluster_status


如果有节点没加入集群,可以先退出集群,然后再重新加入集群。

注意:上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。


五、注意事项

  • cookie在所有节点上必须完全一样,同步时一定要注意。

  • erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。

  • 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。

  • 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。


六、安装过程中遇到的错误解决:

加入Rabbit集群时报错 - Error: mnesia_unexpectedly_running

root@ecs004:~#rabbitmqctl stop_app

root@ecs004:~#rabbitmqctl reset

root@ecs004:~#rabbitmqctl cluster rabbit@ecs003

root@ecs004:~#rabbitmqctl start_app