操作系统:centos7.6
[root@localhost opt]# uname -srm
Linux 3.10.0-957.el7.x86_64 x86_64
服务器IP
192.168.161.16 node16
192.168.161.17 node17
192.168.161.18 node18
安装包

在正式部署环境前,需要将本节点必须的集群其他机器的IP、主机名加入hosts文件,执行指令如下:
[root@localhost opt]# vim /etc/hosts
#node
192.168.161.16 node16
192.168.161.17 node17
192.168.161.18 node18
注:根据实际配置,将所有集IP都添加进去。

不关闭防火墙开放端口
开通端口:
[root@localhost opt]#
firewall-cmd --permanent --add-port={4369/tcp,25672/tcp,5671/tcp,5672/tcp,15672/tcp}
或者
关闭防火墙
[root@localhost opt]# systemctl stop firewalld
[root@localhost opt]# systemctl disable firewalld
通常,在部署环境时候需要关闭selinux。编辑/etc/selinux/config文件将SELINUX设置为disabled。如下
[root@localhost opt]# vim /etc/selinux/config
[root@localhost opt]# setenforce 0 ##临时关闭,不需要重启即可生效

生成密钥对(所有服务器均处理)
[root@localhost opt]# ssh-keygen -t rsa
将公钥复制到需要无密码登陆的服务器上
在192.168.161.16服务器上执行:
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.17
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.18
在192.168.161.17服务器上执行:
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.16
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.18
在192.168.161.18服务器上执行:
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.16
[root@localhost opt]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.161.17
[root@localhost opt]# rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm

[root@localhost opt]# rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm
[root@localhost opt]# rpm --import rabbitmq-release-signing-key.asc
[root@localhost opt]# rpm -ivh tcp_wrappers-7.6-77.el7.x86_64.rpm
[root@localhost opt]# rpm -ivh socat-1.7.2.4-1.el7.rf.x86_64.rpm
[root@localhost opt]# rpm -ivh rabbitmq-server-3.6.12-1.el7.noarch.rpm

日志文件位置:/var/log/rabbitmq/
[root@localhost ~]# systemctl start rabbitmq-server.service
[root@localhost ~]# systemctl status rabbitmq-server.service
出现running则启动成功

查看插件列表
[root@localhost ~]# rabbitmq-plugins list
安装插件
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management
#rabbitmq启用trace插件
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_tracing
#打开trace的开关:rabbitmqctl trace_on
#打开trace的开关(test为需要日志追踪的vhost):rabbitmqctl trace_on -p test
#关闭trace的开关:rabbitmqctl trace_off
将rabbitmq_delayed_message_exchange-0.0.1.ez传至/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins目录下
[root@localhost opt]# mv rabbitmq_delayed_message_exchange-0.0.1.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins/
[root@localhost opt]# cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.12/plugins/
[root@localhost plugins]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange
出现以下信息则说明启动成功

至此3台上面的rabbitmq都已安装完成,并且启动正常,现在开始配置集群服务。
说明:Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在 $home/.erlang.cookie 中,我的是用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq中。
erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400,不然节点之间就无法通信。
打开文件然后需要先把其中的一台服务器的.erlang.cookie中的内容复制到别的机器上,最好是复制内容,因为文件权限不对的话会出现问题,在最后退出保存的时候使用wq!用来进行强制保存即可.
比如以192.168.161.16 node16为准
[root@localhost plugins]# cd /var/lib/rabbitmq/
[root@localhost rabbitmq]# cat .erlang.cookie
RGDIJSPIUOPKSUACDCVU

再编辑另两台.erlang.cookie,将原来的内容删掉替换为RGDIJSPIUOPKSUACDCVU;使用wq!强制保存。

erlang.cookie复制完成后,逐个重启节点服
[root@localhost rabbitmq]# systemctl stop rabbitmq-server.service
[root@localhost rabbitmq]# systemctl start rabbitmq-server.service
[root@localhost rabbitmq]# systemctl status rabbitmq-server.service

以节点192.168.161.16为集群主节点,在节点192.168.161.17和节点192.168.161.18上添加配置,以加入到集群中
[root@localhost rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@localhost
[root@localhost rabbitmq]# rabbitmqctl reset
Resetting node rabbit@localhost
[root@localhost rabbitmq]# rabbitmqctl join_cluster rabbit@192.168.161.16
[root@localhost rabbitmq]# rabbitmqctl start_app
Starting node rabbit@localhost
每台都查看集群状态
[root@localhost rabbitmq]# rabbitmqctl cluster_status

==添加账号:(仅在主节点上执行即可)==
[root@localhost rabbitmq]# rabbitmqctl add_user admin admin
Creating user "admin"
==添加权tag:==
[root@localhost rabbitmq]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator]
[root@localhost rabbitmq]# rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
Setting permissions for user "admin" in vhost "/"
==查看当前用户列表:==
[root@localhost rabbitmq]# rabbitmqctl list_users
Listing users
admin [administrator]
guest [administrator]
==查看用户权限:==
[root@localhost rabbitmq]# rabbitmqctl list_user_permissions admin
Listing permissions for user "admin"
/ .* .* .*
[root@localhost rabbitmq]#

其他操作:
删除用户guest
[root@localhost rabbitmq]# rabbitmqctl delete_user guest
Deleting user "guest"
查看用户列表
[root@localhost rabbitmq]# rabbitmqctl list_users
Listing users
admin [administrator]
更改用户密码
[root@localhost rabbitmq]# rabbitmqctl change_password Username Newpassword
[root@localhost rabbitmq]# rabbitmqctl change_password admin 123456
Changing password for user "admin"
URL:
http://192.168.161.16:15672
使用admin登陆,登陆成功后界面如下:


至此rabbitmq普通集群模式创建完成.
(在需要移除的节点服务器上操作,比如移除node17)
[root@node17 rabbitmq]#rabbitmqctl stop_app
[root@node17 rabbitmq]#rabbitmqctl reset
[root@node17 rabbitmq]#rabbitmqctl start_app
加入集群时指定节点类型:
[root@node16 rabbitmq]]#rabbitmqctl stop_app
[root@node16 rabbitmq]]#rabbitmqctl join_cluster --ram rabbit@192.168.161.16
[root@node16 rabbitmq]]#rabbitmqctl start_app
备注:–ram 指定内存节点类型,–disc指定磁盘节点类型
修改节点类型:
[root@node16 rabbitmq]]#rabbitmqctl stop_app
[root@node16 rabbitmq]]#rabbitmqctl change_cluster_node_type disc
[root@node16 rabbitmq]]#rabbitmqctl start_app
/var/log/rabbitmq/rabbit@node16.log
/var/log/rabbitmq/rabbit@node16-sasl.log
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
镜像队列的创建可通过rabbitmq管理界面或者使用命令来创建。
Pattern:“^” 表示所有匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。
ha-mode:“all”代表同步到所以节点。
输入以下命令:(所有服务器均操作)
rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
这样三台rabbitmq就可以数据同步了。
