一、rabbitmq单点部署
1.RabbitMQ介绍
消息系统通过将消息的发送和接收分离来实现应用程序的异步和解偶。 或许你正在考虑进行数据投递,非阻塞操作或推送通知。或许你想要实现发布/订阅,异步处理,或者工作队列。所有这些都属于消息系统的模式。 RabbitMQ是一个消息代理,一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息再传输过程中的安全。 RabbitMQ是一个在AMQP协议标准上完整的、可复用的企业消息系统。它遵循Mozilla Public License开源协议,采用Erlang语言实现的工业级的消息队列。
2.环境准备安装
添加主机名host。rabbitmq是通过主机名连接其他节点
1)安装erlang
wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.centos.x86_64.rpm yum install erlang-19.0.4-1.el7.centos.x86_64.rpm -y
2)安装rabbitmq
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-3.6.10-1.el7.noarch.rpm yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm -y
3)启动rabbitmq
systemctl start rabbitmq-server
可以看到日志: tail -f /var/log/rabbitmq/rabbit@node1.log中报出没有配置文件
config file(s) : /etc/rabbitmq/rabbitmq.config (not found) //(没有特殊配置需求,可以不需要这个配置文件)
cd /etc/rabbitmq/
vi rabbitmq.config (这里文件名一定要是rabbitmq.config,rabbitmq.conf无法生效)
[{rabbit, [{loopback_users, []}]}]. 这里的意思是开放使用,rabbitmq默认创建的用户guest,这个用户默认只能是本机访问,localhost或者127.0.0.1,从外部访问需要添加上面的配置。(不建议开启)
systemctl restart rabbitmq-server 重启生效
4)开启管理UI
rabbitmq-plugins enable rabbitmq_management (开启后/etc/rabbitmq/下会多一个文件enabled_plugins)
systemctl restart rabbitmq-server 重启生效
5)修改数据存储路径
vim /etc/rabbitmq/rabbitmq-env.conf
增加如下两行内容 RABBITMQ_MNESIA_BASE=/usr/local/rabbitmq/mnesia //数据存储路径
RABBITMQ_LOG_BASE=/usr/local/rabbitmq/log //日志存储路径
创建对应目录并更改目录属主、属组为rabbitmq
6)添加用户
rabbitmqctl add_user admin 123456
rabbitmqctl set_user_tags admin administrator //设置admin用户为管理员角色
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" //设置admin的具体权限
二、rabbitmq普通模式集群
1.集群概述
通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
2.环境部署安装
1)单节点rabbitmq安装完成并能成功启动,各节点可以互相主机名解析
2)设置erlang cookie
设置不同节点间同一认证的Erlang Cookie, 这里将 node1 的该文件复制到 node2、node3,由于这个文件权限是 400为方便传输,先修改权限,非必须操作,所以需要先修改 node2、node3 中的该文件权限为 777
chmod 777 /var/lib/rabbitmq/.erlang.cookie
然后将 node1 中的该文件拷贝到 node2、node3,
$ scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
$ scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/
最后将权限和所属用户/组修改回来
$ chmod 400 /var/lib/rabbitmq/.erlang.cookie
$ chown rabbitmq /var/lib/rabbitmq/.erlang.cookie
$ chgrp rabbitmq /var/lib/rabbitmq/.erlang.cookie
注意事项
cookie在所有节点上必须完全一样,同步时一定要注意。 erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
3)组成集群
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl join_cluster rabbit@node1
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
node3 $ rabbitmqctl stop_app # 停止rabbitmq服务
node3 $ rabbitmqctl join_cluster rabbit@node1
node3 $ rabbitmqctl start_app # 开启rabbitmq服务
此时 node2 与 node3 也会自动建立连接
4)设置内存节点
其中–ram指的是作为内存节点,要是想做为磁盘节点的话,就不用加–ram这个参数了
加入内存节点集群
node2 # rabbitmqctl join_cluster --ram rabbit@node1
在RabbitMQ集群里,必须至少有一个磁盘节点存在。
5)更改节点属性
node2 $ rabbitmqctl stop_app # 停止rabbitmq服务
node2 $ rabbitmqctl change_cluster_node_type ram # 更改节点为内存节点
node2 $ rabbitmqctl change_cluster_node_type disc # 更改节点为磁盘节点
node2 $ rabbitmqctl start_app # 开启rabbitmq服务
6)查看集群状态
[root@node1 ~]# rabbitmqctl cluster_status
三、镜像模式集群
RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列 镜像队列概念 镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。 镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列。 镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。 queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。
设置镜像队列策略 在普通集群的中任意节点启用策略,策略会自动同步到集群节点 命令格式 set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
在任意一个节点上执行
[root@node1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
说明: 上面命令是将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致,RabbitMQ高可用集群就已经搭建好了,我们可以重启服务,查看其队列是否在从节点同步。
集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:
先在一个节点上执行
$ rabbitmqctl force_boot
$ systemctl start rabbitmq-server
在其他节点上执行
$ systemctl start rabbitmq-server
查看cluster状态是否正常(要在所有节点上查询)
$ rabbitmqctl cluster_status