首页 > 代码库 > centos7上Rabbit集群主从部署
centos7上Rabbit集群主从部署
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权限安装。
在两个节点服务器上安装:
安装依赖包
yum install gcc gcc-c++ ncurses-developenssl-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 zxfrabbitmq-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 enablerabbitmq_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]$ ./rabbitmqctlcluster_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]# ./rabbitmqctlstop_app 加入node1节点,执行此步骤之前确保主节点服务器是开启的: [root@node2 sbin]# ./rabbitmqctljoin_cluster --ram rabbit@node1 注:--ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加--ram这个参数了,如果磁盘是ssd,建议不加—ram 执行加入集群命令后,再次开始集群服务: [root@node2 sbin]# ./rabbitmqctlstart_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]# ./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) 验证同步
在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]# rabbitmqctlchange_cluster_node_type ram root@node1 sbin]# rabbitmqtl start_app 查看修改后的状态: [root@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:
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文件到从节点:
[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/*
重启服务即可!
centos7上Rabbit集群主从部署