RabbitMQ集群搭建

注:本文基于3个节点搭建rabbitmq集群,并且都是磁盘节点,只要有任何一个节点能够工作,rabbitmq集群对外就能提供服务。(所有节点状态保持一致,节点完全对等,即每个节点都提供服务给客户端连接,进行消息发送与接收。)

、环境介绍

系统及组件版本:

centos7.6

rabbitmq 3.6.10

准备三个节点,主机名及IP如下,mqsrv01作为master节点。    

NodeIPNote
mqsrv01192.168.191.152master节点
mqsrv02192.168.191.153slave节点
mqsrv03192.168.191.154slave节点

、部署步骤

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管理页面

http://ip:15672/

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