1.安装前准备:
RabbitMQ版本界面:
- http://www.rabbitmq.com/download.html
- https://github.com/rabbitmq/rabbitmq-server/releases
RabbitMQ Erlang版本兼容:http://www.rabbitmq.com/which-erlang.html
Erlang各版本下载界面:http://erlang.org/download/
2.安装相关依赖库:
yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel openssl-devel zlib-devel -y
3.编译安装Erlang
tar -zxf otp_src_19.3.tar.gz
cd otp_src_19.3
./configure --prefix=/opt/erlang/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac
make && make install
4.配置环境变量(/etc/profile):
export ERL_HOME=/usr/local/erlang
export PATH=${JAVA_HOME}/bin:${ERL_HOME}/bin:$PATH
source /etc/profile
5.验证erlang环境:
>erl
6.安装RabbitMQ
xz -d rabbitmq-server-generic-unix-3.6.16.tar.xz
tar -xf rabbitmq-server-generic-unix-3.6.16.tar.xz
mv -r rabbitmq_server-3.6.16 /usr/local/rabbitmq-3.6.16
7.准备环境
修改Hosts配置
准备三台服务器并配置hosts(/etc/hosts):
192.168.21.191 vm1
192.168.21.189 vm2
192.168.21.190 vm3
配置host名称(/etc/sysconfig/network):
HOSTNAME=vm1
8.设置Erlang cookie 使三台保持一致:
自己编译安装的rabbitmq 在第一次启动rabbitmq的时候.erlang.cookie才会生成
在搭建RabbitMQ集群的时候往往会因为.erlang.cookie而报各种错误,网上查资料也会经常说.erlang.cookie会在$home下,或者在/var/lib/rabbitmq下,到底在rabbitmq启动的时候用的哪个cookie,cookie存放的路径在哪里,那么下面我们来仔细的查证一下。
.erlang.cookie是什么
erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400。
.erlang.cookie存放路径
官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。
- 如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。
- 如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。
9.启动
使用-detached参数运行各节点:
rabbitmqctl stop
rabbitmq-server -detached
然后可以通过rabbitmqctl cluster_status查看节点状态。PS:要先拷贝cookie到另外两台机器上,保证三台机器上的cookie是一致的,然后再启动服务。
由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限:
添加用户并设置密码:
rabbitmqctl add_user admin 123456
添加权限(使admin用户对虚拟主机“/” 具有所有权限):
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
修改用户角色(加入administrator用户组)
rabbitmqctl set_user_tags admin administrator
然后就可以远程访问了,然后可直接配置用户权限等信息。到此,就可以通过http://ip:15672 使用admin 123456 进行登陆了。
到这里的话,每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了
(3)组成集群
rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
将 vm2、vm3与 vm1 组成集群,这里以vm2为例
vm2# rabbitmqctl stop_app
vm2# rabbitmqctl join_cluster rabbit@vm1 ####这里集群的名字一定不要写错了
vm2# rabbitmqctl start_app
将vm3重复上述操作,也加入vm1的集群。
则此时 vm2 与 vm3 也会自动建立连接,集群配置完毕;(PS:如果要使用内存节点,则可以使用vm2 # rabbitmqctl join_cluster --ram rabbit@vm1加入集群)集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
vm3# rabbitmqctl cluster_status
Cluster status of node rabbit@vm3 ...
[{vms,[{disc,[rabbit@vm1,rabbit@vm2,rabbit@vm3]}]},
{running_vms,[rabbit@vm1,rabbit@vm2,rabbit@vm3]},
{cluster_name,<<"rabbit@vm1">>},
{partitions,[]},
{alarms,[{rabbit@vm1,[]},{rabbit@vm2,[]},{rabbit@vm3,[]}]}]
可知,集群的名称默认为rabbit@vm1;
PS:另外一种查看集群是否成功的方式,在web页面上的“Queues”的列表中,查看有如下显示为“同步镜像到node2”,则也表示集群配置成功
RabbitMQ脑裂问题:
如上图红色字体展示部分:Network partition detected ,Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data.
参考:
https://blog.csdn.net/wochunyang/article/details/52524977
https://www.cnblogs.com/taoge007/p/6208552.html
https://blog.csdn.net/jxdl6655/article/details/78194191
https://www.cnblogs.com/kevingrace/p/8012792.html