|
1.软件环境
操作系统:centos 7.2 X64 Erlang:18.3 Rabbit:3.5.1 节点IP:node1 192.168.1.21 Node 2 192.168.1.22 Node1为主,node2为从 2.安装部署
以下安装均使用root权限安装。
在两个节点服务器上安装:
安装依赖包
1
| yum install gcc gcc-c++ ncurses-developenssl-devel -y
|
1) 安装Erlang
下载地址:
2) 安装RabbitMQ
下载地址:
3) 配置 rabbitmq
rpm安装后配置文件目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| mkdir /etc/rabbitmq
cd /etc/rabbitmq
源码解压配置文件目录:
/usr/local/rabbitmq/etc/rabbitmq
默认是没有rabbitmq.conf和rabbitmq-env.conf文件,需要手工创建:
rabbitmq.config配置方法(含调优):
[iyunv@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文件,加入所有的节点主机名称
1
2
3
| vim /etc/hosts
192.168.1.21 node1
192.168.1.22 node2
|
注意:配置的主机名不要含有特殊符号,如.\-之类的,如主机名不能为node1.xxx.com
5) 安装web界面访问插件,以生成.erlang.cookie文件创建erlang集群。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| 进入目录:
cd /usr/local/rabbitmq/sbin
安装web访问插件:
./rabbitmq-plugins enablerabbitmq_management
查看插件列表:
[iyunv@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文件
[iyunv@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保持一致,否则节点之间就无法通信。
1
2
3
4
5
6
7
| 将node1中的.erlang.cookie通过scp传输到node1中去
[iyunv@node1 ~]$ scp -rp ~/.erlang.cookie root@192.168.1.22:/root
分别在node1和node2查看同步后的.erlang.cookie是否一致
[iyunv@node1 ~]$ cat ~/.erlang.cookie
GGWQARTSOKFNZTLLIITV
[iyunv@node2 ~]$ cat ~/.erlang.cookie
GGWQARTSOKFNZTLLIITV
|
7) 启动RabbitMQ
同步完成后,就可以在两个节点上启动rabbitmq了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| cd rabbitmq/sbin
启动RabbitMQ ./rabbitmq-server -detached
停止RabbitMQ ./rabbitmqctl stop
查看状态:
[iyunv@node1 sbin]$ ./rabbitmqctlcluster_status
Cluster status of node rabbit@ node1...
[{nodes,[{disc,[rabbit@ node1]}]},
{running_nodes,[rabbit@ node1]},
{cluster_name,<<"rabbit@ node1">>},
{partitions,[]}]
[iyunv@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上执行命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| 关闭集群服务,然后再执行以下命令加入node1的集群:
[iyunv@node2 sbin]# ./rabbitmqctlstop_app
加入node1节点,执行此步骤之前确保主节点服务器是开启的:
[iyunv@node2 sbin]# ./rabbitmqctljoin_cluster --ram rabbit@node1
注:--ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加--ram这个参数了,如果磁盘是ssd,建议不加—ram
执行加入集群命令后,再次开始集群服务:
[iyunv@node2 sbin]# ./rabbitmqctlstart_app
分别在node1和node2上查看节点状态:
node1节点:
[iyunv@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节点:
[iyunv@node2 sbin]# ./rabbitmqctlcluster_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) 验证同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| 在node1上创建一个用户:
[iyunv@node1 sbin]# ./rabbitmqctl add_user mxd_mq mxd123456
Creating user "mxd_mq" ...
查看用户列表:
[iyunv@node1 sbin]# ./rabbitmqctl list_users
\Listing users ...
guest [administrator]
mxd_mq []
然后在node2上查看用户列表:
[iyunv@node2 sbin]# ./rabbitmqctl list_users
Listing users ...
guest [administrator]
mxd_mq []
node2上也有在node1上创建的用户,表示两个节点完成主从同步。
10)重启集群节点:
如果node2要关闭节点,可以执行操作:
[iyunv@node2 sbin]#./rabbitmqctl stop
查看集群节点状态
[iyunv@node2 sbin]# ./rabbitmqctl cluster_status
启动节点:
[iyunv@node2 sbin]# ./rabbitmq-server –detached
|
11)节点退出集群:
1
2
3
4
5
6
7
| 如果node2要关闭节点,可以执行操作:
[iyunv@node2 sbin]#./rabbitmqctl stop_app
如果node2要退出集群,则执行操作:
[iyunv@node2 sbin]#./rabbitmqctl reset
注:如果只剩最后一个节点,退出集群时使用force_reset
启动节点集群服务
[iyunv@node2 sbin]#./rabbitmqctl start_app
|
12)测试:在断开(关闭)一个节点时,另一节点的状态:
1
2
3
4
5
6
7
| 关闭node2时,查看node1的状态:
[iyunv@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的状态:
1
2
3
4
5
6
| [iyunv@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) 如何将节点中磁盘点修改为内存点:
1
2
3
4
5
6
7
8
9
10
11
12
| 如,将node1的磁盘点改为内存点
root@node1 sbin]# rabbitmqctl stop_app
root@node1 sbin]# rabbitmqctlchange_cluster_node_type ram
root@node1 sbin]# rabbitmqtl start_app
查看修改后的状态:
[iyunv@node1 sbin]$ ./rabbitmqctlcluster_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:
1
2
| chown -R www.www /usr/local/rabbitmq
chown -R www.www /data/rabbitmq/
|
然后使用www登录服务器,并安装rabbitmq的web插件,此时会在www的家目录下生成.erlang.cookie文件,在其他从节点服务器也如此操作,从节点操作完成后,需要将从节点下的.erlang.cookie文件修改权限为700,否则从主节点同步.erlang.cookie到从节点时会报权限不足,完成后,使用scp命令同步.erlang.cookie文件到从节点:
1
2
3
4
5
6
7
| [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-pluginsenable 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/*
重启服务即可!
|
|