1.软件环境

操作系统:centos 7.2 X64

Erlang18.3

Rabbit3.5.1

节点IP:node1 192.168.1.21

             Node 2 192.168.1.22

Node1为主,node2为从

2.安装部署

以下安装均使用root权限安装。

在两个节点服务器上安装:

安装依赖包

yum install gcc gcc-c++ ncurses-devel openssl-devel -y

 

1)   安装Erlang

下载地址:

wget http://distfiles.macports.org/erlang/otp_src_18.3.tar.gz
mkdir ../src
tar -zxf otp_src_18.3.tar.gz -C ../src/  
cd ../src/otp_src_18.3/  
./configure --with-ssl=/etc/ssl
make   
make install

 

2)   安装RabbitMQ

下载地址:

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-generic-unix-3.5.1.tar.gz
tar -zxf rabbitmq-server-generic-unix-3.5.1.tar.gz -C ../src/   
cd ../src/ 
mv rabbitmq_server-3.5.1 /usr/local/rabbitmq

 

 

3)   配置 rabbitmq

rpm安装后配置文件目录:

mkdir /etc/rabbitmq
cd /etc/rabbitmq
源码解压配置文件目录:
/usr/local/rabbitmq/etc/rabbitmq
默认是没有rabbitmq.conf和rabbitmq-env.conf文件,需要手工创建:
rabbitmq.config配置方法(含调优):
[root@node1 rabbitmq]# vim rabbitmq.config
[
{rabbit,
  [
 {tcp_listeners, [5672]},
 {dump_log_write_threshold, [1000]},
 {vm_memory_high_watermark, 0.5},
 {hipe_compile,true}
  ]
  }
].
 
 
 
或者在/usr/local/rabbitmq/etc/rabbitmq
cp rabbitmq.config.example rabbitmq.config
 
vim rabbitmq-env.conf   创建配置文件
RABBITMQ_MNESIA_BASE=/data/rabbitmq/db  #指定数据目录
RABBITMQ_LOG_BASE=/data/rabbitmq/logs   #指定日志目录

4)   确保节点之间主机名称可以相互解析。

在两台节点服务器上分别配置hosts文件,加入所有的节点主机名称

vim /etc/hosts
192.168.1.21 node1
192.168.1.22 node2

注意:配置的主机名不要含有特殊符号,如.\-之类的,如主机名不能为node1.xxx.com

5)   安装web界面访问插件,以生成.erlang.cookie文件创建erlang集群。

进入目录:
cd /usr/local/rabbitmq/sbin
安装web访问插件:
./rabbitmq-plugins enable rabbitmq_management
查看插件列表:
[root@node1 sbin]$ ./rabbitmq-plugins list
 Configured: E = explicitly enabled; e =implicitly enabled
 |Status:   [failed to contact rabbit@web3- status not shown]
 |/
[e ] amqp_client                       3.5.1
[  ]cowboy                           0.5.0-rmq3.5.1-git4b93c2d
[e ] mochiweb                         2.7.0-rmq3.5.1-git680dba8
[  ]rabbitmq_amqp1_0                  3.5.1
[  ]rabbitmq_auth_backend_ldap        3.5.1
[  ]rabbitmq_auth_mechanism_ssl       3.5.1
[  ]rabbitmq_consistent_hash_exchange 3.5.1
[  ]rabbitmq_federation               3.5.1
[  ]rabbitmq_federation_management    3.5.1
[E ] rabbitmq_management               3.5.1
[e ] rabbitmq_management_agent         3.5.1
[  ]rabbitmq_management_visualiser    3.5.1
[  ]rabbitmq_mqtt                     3.5.1
[  ]rabbitmq_shovel                   3.5.1
[  ]rabbitmq_shovel_management        3.5.1
[  ]rabbitmq_stomp                    3.5.1
[  ]rabbitmq_test                     3.5.1
[  ]rabbitmq_tracing                  3.5.1
[e ] rabbitmq_web_dispatch             3.5.1
[  ]rabbitmq_web_stomp                3.5.1
[  ]rabbitmq_web_stomp_examples       3.5.1
[  ]sockjs                           0.3.4-rmq3.5.1-git3132eb9
[e ] webmachine                       1.10.3-rmq3.5.1-gite9359c7
 
查看生成的.erlang.cookie文件
[root@web4 sbin]$ ll ~/.erlang.cookie
-r-------- 1 root root 20 Dec  7 00:00 /root/.erlang.cookie

可以看到.erlang.cookie文件的权限是400.

node2服务器也创建web界面插件。然后查看.erlang.cookie是否生成。

 

6)   同步.erlang.cookie文件

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在$HOME/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。

将node1中的.erlang.cookie通过scp传输到node1中去
[root@node1 ~]$ scp -rp ~/.erlang.cookie root@192.168.1.22:/root
分别在node1和node2查看同步后的.erlang.cookie是否一致
[root@node1 ~]$ cat ~/.erlang.cookie
GGWQARTSOKFNZTLLIITV
[root@node2 ~]$ cat ~/.erlang.cookie
GGWQARTSOKFNZTLLIITV

7)   启动RabbitMQ

同步完成后,就可以在两个节点上启动rabbitmq

cd rabbitmq/sbin 
启动RabbitMQ           ./rabbitmq-server -detached
停止RabbitMQ           ./rabbitmqctl stop
查看状态:
[root@node1 sbin]$ ./rabbitmqctl cluster_status
Cluster status of node rabbit@ node1...
[{nodes,[{disc,[rabbit@ node1]}]},
 {running_nodes,[rabbit@ node1]},
 {cluster_name,<<"rabbit@ node1">>},
 {partitions,[]}]
 
[root@node2 sbin]#  ./rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node2]}]},
 {running_nodes,[rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]

 

8)   node2加入node1节点,创建主从同步

主机在加入集群之前必须停掉本机的集群服务;

node2要加入node1,需要现在node2上执行命令

关闭集群服务,然后再执行以下命令加入node1的集群:
[root@node2 sbin]# ./rabbitmqctl stop_app 
加入node1节点,执行此步骤之前确保主节点服务器是开启的:
[root@node2 sbin]# ./rabbitmqctl join_cluster --ram rabbit@node1
注:--ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加--ram这个参数了,如果磁盘是ssd,建议不加—ram
执行加入集群命令后,再次开始集群服务:
[root@node2 sbin]# ./rabbitmqctl start_app 
分别在node1和node2上查看节点状态:
node1节点:
[root@node1 sbin]#  ./rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
 {running_nodes,[rabbit@node1]},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]}]
 
node2节点:
[root@node2 sbin]# ./rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]},
 {running_nodes,[rabbit@node1,rabbit@node2]},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]}]

 

9)   验证同步

在node1上创建一个用户:
[root@node1 sbin]# ./rabbitmqctl  add_user mxd_mq mxd123456
Creating user "mxd_mq" ...
查看用户列表:
[root@node1 sbin]# ./rabbitmqctl  list_users
\Listing users ...
guest  [administrator]
mxd_mq    []
 
然后在node2上查看用户列表:
[root@node2 sbin]# ./rabbitmqctl list_users
Listing users ...
guest  [administrator]
mxd_mq    []
node2上也有在node1上创建的用户,表示两个节点完成主从同步。
10)重启集群节点:
如果node2要关闭节点,可以执行操作:
[root@node2 sbin]#./rabbitmqctl stop 
查看集群节点状态
[root@node2 sbin]# ./rabbitmqctl cluster_status
启动节点:
[root@node2 sbin]# ./rabbitmq-server –detached

11)节点退出集群:

如果node2要关闭节点,可以执行操作:
[root@node2 sbin]#./rabbitmqctl stop_app
如果node2要退出集群,则执行操作:
[root@node2 sbin]#./rabbitmqctl reset
注:如果只剩最后一个节点,退出集群时使用force_reset
启动节点集群服务
[root@node2 sbin]#./rabbitmqctl start_app

 

12)测试:在断开(关闭)一个节点时,另一节点的状态:

关闭node2时,查看node1的状态:
[root@node1 sbin]# ./rabbitmqctl  cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
 {running_nodes,[rabbit@node1]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]

 

3.其他说明

1)  关闭node1时,查看node2的状态:

[root@node2 sbin]#  ./rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
 {running_nodes,[rabbit@node2]},
 {cluster_name,<<"rabbit@node2">>},
 {partitions,[]}]

 

再次启动node1后,大约30秒回复正常

注:从节点重启后,会自动连接上集群,不过需要大约15-20秒。

2)  如何将节点中磁盘点修改为内存点:

如,将node1的磁盘点改为内存点
root@node1 sbin]# rabbitmqctl stop_app
root@node1 sbin]# rabbitmqctl  change_cluster_node_type ram
root@node1 sbin]# rabbitmqtl start_app
查看修改后的状态:
[root@node1 sbin]$ ./rabbitmqctl cluster_status
Cluster status of node rabbit@ node1...
[{nodes,[{disc,[rabbit@ node2]},{ram,[rabbit@ node1]}]},
 {running_nodes,[rabbit@ node2,rabbit@ node1]},
 {cluster_name,<<"rabbit@ node1 ">>},
 {partitions,[]}]
注:节点中必须最少要有一个disc点(磁盘点),这是为了永久化存储考虑,


 

3)  关于使用其他用户(普通用户)启动rabbitmq的操作方法

如果想要使用其他用户,比如创建一个www用户启动rabbitmq,则操作方法为:

使用root安装完成erlang后,并将rabbitmq包解压并移动至/usr/local目录下,将rabbitmq目录以及rabbitmq数据和日志的目录的所属用户修改为www

chown -R www.www /usr/local/rabbitmq
chown -R www.www /data/rabbitmq/

然后使用www登录服务器,并安装rabbitmqweb插件,此时会在www的家目录下生成.erlang.cookie文件,在其他从节点服务器也如此操作,从节点操作完成后,需要将从节点下的.erlang.cookie文件修改权限为700,否则从主节点同步.erlang.cookie到从节点时会报权限不足,完成后,使用scp命令同步.erlang.cookie文件到从节点:

[www@node1~]$ scp -rp ~/.erlang.cookie www@192.168.1.22:/home/www
完成以上配置后,在主从节点上使用www用户启动rabbitmq即可,
小提醒:如果执行启动命令
./rabbitmq-server –detached出现以下提示,表示erlang在编译,
HiPE compiling…….
可以在启动命令后加“&”
./rabbitmq-server -detached &

 

 

4)  用户管理说明以及常用命令

在使用过程中的问题:使用默认的账号guest登陆管理控制台,却提示登陆失败。是因为出于安全因素的考虑,guest用户只能通过localhost登陆使用。所以若是在其他机子上登入远端的rabbitmq服务器需要新建一个用户,并且新用户需要赋予超级管理员(administrator)权限

 

一些常用的rabbitmq/sbin/下的命令

启用监控插件             ./rabbitmq-plugins enable rabbitmq_management

关闭监控插件             ./rabbitmq-plugins disable rabbitmq_management

新增一个用户             ./rabbitmqctl  add_user  Username Password

删除一个用户             ./rabbitmqctl  delete_user  Username

修改用户的密码            ./rabbitmqctl  change_password  Username Newpassword

查看当前用户列表           ./rabbitmqctl  list_users

赋予超级管理员权限         ./rabbitmqctlset_user_tags newuser administrator

 

5)  关于集群中节点的说明

集群中有两种节点:

   1 内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk

   2 磁盘节点:保存状态到内存和磁盘。

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态就足够了;

如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

服务器安装完成rabbitmq,并安装web界面访问插件后,会在/root/下生成一个.erlang.cookie文件,该文件将在集群中使用到。

 

 

6)  疑难问题解决:

如果在rabbitmq单机版服务开启的过程中,改动erlang.cookie,就会在服务重启后出现各种各样的问题,所以建议在rabbitmq的服务开启之前要把erlang.cookie配置好。如果出现问题,解决方法就是将服务停掉后执行以下命令:

rm -f /var/lib/rabbitmq/mnesia/rabbit/*

如果在rabbitmq-server的配置文件中更改了数据库存放目录,则执行以下命令:

rm -f /path/to/rabbitmq/db/rabbit/*

重启服务即可!