注:本文基于3个节点搭建rabbitmq集群,并且都是磁盘节点,只要有任何一个节点能够工作,rabbitmq集群对外就能提供服务。(所有节点状态保持一致,节点完全对等,即每个节点都提供服务给客户端连接,进行消息发送与接收。)
一、环境介绍
系统及组件版本:
centos7.6
rabbitmq 3.6.10
准备三个节点,主机名及IP如下,mqsrv01作为master节点。
Node | IP | Note |
mqsrv01 | 192.168.191.152 | master节点 |
mqsrv02 | 192.168.191.153 | slave节点 |
mqsrv03 | 192.168.191.154 | slave节点 |
二、部署步骤
1.各节点上配置/etc/hosts,如下:
192.168.191.152 mqsrv01
192.168.191.153 mqsrv02
192.168.191.154 mqsrv03
2.各节点上安装rabbitmq
2.1安装rabbitmq
yum -y install epel-release
yum -y install erlang socat
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm
rpm -import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
rpm -Uvh rabbitmq-server-3.6.10-1.el7.noarch.rpm
各节点上启动rabbitmq服务
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
各节点上开启管理页面插件(监听15672端口)
rabbitmq-plugins enable rabbitmq_management
注:rabbitmq-plugins list命令可查看插件状态
2.2用浏览器访问rabbitmq管理页面
2.3 远程访问配置(建议在集群配置之后设置)
默认网页(http://ip:15672)是不允许访问的,需要增加一个用户修改一下权限:
添加用户:rabbitmqctl add_user mqadmin 123456
添加权限:rabbitmqctl set_permissions -p “/” mqadmin “.*” “.*” “.*”
修改用户角色:rabbitmqctl set_user_tags mqadmin administrator
#根据需要创建以下内容
创建虚拟主机:rabbitmqctl add_vhost vhost(vhost为虚拟主机名)
清理原始权限:rabbitmqctl clear_permissions -p / mqadmin
授予新虚拟主机权限:rabbitmqctl set_permissions -p vhost mqadmin “.*” “.*” “.*”
然后就可以远程访问了,然后可直接配置用户权限等信息。
3.RabbitMQ集群配置
3.1前置条件检查并设置:
(1)所有节点上分别部署同一版本rabbitmq
使用以下命令确认节点主机名是否相同:rabbitmqctl status
要配置集群,保证所有节点的主机名不同,且能互相ping通。(/etc/hosts中设置)
(2)设置每个节点Cookie
注:RabbitMQ集群通过.erlang.cookie内的cookie值来确认各节点是否在同一个集群。
rabbitmq的集群是依赖erlang的集群来工作的,所以必须先构建erlang的集群环境。erlang集群中各节点是通过一个 magic cookie来实现的,这个cookie存放在.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信. 建议在RabbitMQ服务启动前修改cookie,如果RabbitMQ服务已经启动,修改cookie值后,必须重启RabbitMQ服务。
.erlang.cookie一般会存在这两个目录下:第一个是$home/.erlang.cookie;第二个是/var/lib/rabbitmq/.erlang.cookie。如果使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下。
将master节点mqsrv01中的.erlang.cookie通过scp复制到mqsrv02、mqsrv03节点:
# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.191.153:/var/lib/rabbitmq/.erlang.cookie
# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.191.154:/var/lib/rabbitmq/.erlang.cookie
查看同步后的.erlang.cookie是否一致:
[root@mqsrv01 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HGGCRHYLCACDFFFPXHMJ
[root@mqsrv02 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HGGCRHYLCACDFFFPXHMJ
[root@mqsrv03 ~]# cat /var/lib/rabbitmq/.erlang.cookie
HGGCRHYLCACDFFFPXHMJ
3.2节点加入集群
设192.168.191.152 (mqsrv01)为主节点,在192.168.191.152机器上执行:
#rabbitmqctl stop_app
#rabbitmqctl reset (这一步会重置<清空添加的用户信息等>,请备份数据) //非必须,只是为了初始化清空之前数据
#rabbitmqctl start_app
查看mqsrv01节点集群状态:
将各slave节点加入到集群:
在192.168.191.153(mqsrv02)机器上执行:
[root@mqsrv02 ~]# rabbitmqctl stop_app
Stopping node rabbit@mqsrv02 …
[root@mqsrv02 ~]# rabbitmqctl join_cluster rabbit@mqsrv01
Clustering node rabbit@mqsrv02 with rabbit@mqsrv01 …
[root@mqsrv02 ~]# rabbitmqctl start_app
在192.168.191.154(mqsrv03)机器上执行:
[root@mqsrv03 ~]# rabbitmqctl stop_app
Stopping node rabbit@mqsrv03 …
[root@mqsrv03 ~]#rabbitmqctl join_cluster rabbit@mqsrv01
Clustering node rabbit@mqsrv03 with rabbit@mqsrv01 …
[root@mqsrv03 ~]# rabbitmqctl start_app
注:如果要使用内存节点,则可以使用 rabbitmqctl join_cluster –ram rabbit@mqsrv01加入集群
所有节点加入集群后,可在任意节点查看集群状态:
3.3设置镜像队列策略 //非必须,推荐操作,搭配均衡器,实现高可用集群。
使用镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改集群范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。
在任意一个节点上执行:
# rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:”all”}’
上述命令将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。
完成上述步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。
3.4使用haproxy创建LB集群
安装haproxy:
yum -y install haproxy
设置配置文件:
vi /etc/haproxy/haproxy.cfg
内容如下:
global
log 127.0.0.1 local0 info
log 127.0.0.1 local1 notice
daemon
maxconn 4096
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option abortonclose
maxconn 4096
timeout connect 5000ms
timeout client 3000ms
timeout server 3000ms
balance roundrobin
listen private_monitoring
bind 0.0.0.0:8100
mode http
option httplog
stats refresh 5s
stats uri /stats
stats realm Haproxy
stats auth admin:admin
listen rabbitmq_admin
bind 0.0.0.0:15672
server mqsrv01 192.168.191.152:15672
server mqsrv02 192.168.191.153:15672
server mqsrv03 192.168.191.154:15672
listen rabbitmq_cluster
bind 0.0.0.0:5672
mode tcp
option tcplog
balance roundrobin
server mqsrv01 192.168.191.152:5672 check inter 5000 rise 2 fall 3
server mqsrv02 192.168.191.153:5672 check inter 5000 rise 2 fall 3
server mqsrv03 192.168.191.154:5672 check inter 5000 rise 2 fall 3
保存退出。
启动haproxy:
systemctl start haproxy
访问HAProxy数据统计页面
http://haproxy server IP:8100/stats
访问RabbitMQ管理页面
http://haproxy server IP:15672/
注:参考2.3 远程访问配置章节内容设置用户、密码及权限、角色,即可访问RabbitMQ管理页面。
附录:
1.当第一次启动服务,检测数据库是否未初始化或者被删除,它会用下面的资源初始化一个新的数据库:一个命名为 / 的虚拟宿主,一个名为guest密码也为guest的用户,它拥有/虚拟宿主的所有权限,如果你的rabbitmq是公开访问的,最好修改guest用户的密码。
2.rabbitmqctl 是RabbitMQ的一个命令行管理工具。它通过连接一个节点执行所有的动作。可以通过这个命令前使用”-n”标志明确指定节点名称, 例如:
# rabbitmqctl -n rabbit@mqsrv02 add_user tony changeit
这个命令指示RabbitMQ在rabbit@mqsrv02节点创建一个tony/changeit的用户。
3.常用命令:
应用和集群管理
停止RabbitMQ应用,关闭节点:rabbitmqctl stop
停止RabbitMQ应用:rabbitmqctl stop_app
启动RabbitMQ应用:rabbitmqctl start_app
显示RabbitMQ信息:rabbitmqctl status
显示RabbitMQ集群信息:rabbitmqctl cluster_status
重置RabbitMQ节点:rabbitmqctl reset
用户管理
添加用户:rabbitmqctl add_user username password
删除用户:rabbitmqctl delete_user username
修改密码:rabbitmqctl change_password username newpassword
设置用户角色:rabbitmqctl set_user_tags username tag
tag可以为administrator,monitoring,management等。
列出所有用户:rabbitmqctl list_users
权限控制
创建虚拟主机:rabbitmqctl add_vhost vhostpath
删除虚拟主机:rabbitmqctl delete_vhost vhostpath
列出所有虚拟主机:rabbitmqctl list_vhosts
设置用户权限:rabbitmqctl set_permissions [-p vhostpath] username regexp regexp regexp
清除用户权限:rabbitmqctl clear_permissions [-p vhostpath] username
列出虚拟主机上的所有权限:rabbitmqctl list_permissions [-p vhostpath]
列出用户权限:rabbitmqctl list_user_permissions username
4.remove a node from a cluster(remove rabbit@rabbit3 from the cluster)
# on rabbit3
rabbitmqctl stop_app
# => Stopping node rabbit@rabbit3 …done.
rabbitmqctl reset
# => Resetting node rabbit@rabbit3 …done.
rabbitmqctl start_app
# => Starting node rabbit@rabbit3 …done.
Running the cluster_status command on the nodes confirms that rabbit@rabbit3 now is no longer part of the cluster and operates independently.
5.管理界面出现:/etc/rabbitmq/rabbitmq.config (not found)解决办法
# find / -name rabbitmq.config.example
/usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example
# cp /usr/share/doc/rabbitmq-server-3.6.10/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# systemctl restart rabbitmq-server