一、服务器与主机名列表
环境: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
转载于:https://blog.51cto.com/dotlim/1956374