RabbitMQ是一个免费的开源企业消息代理软件。 它是用Erlang编写的,并实现了高级消息队列协议(AMQP)。 它提供所有主要编程语言的客户端库。 它支持多种消息传递协议,消息队列,传送确认,灵活的路由到队列,多种交换类型。 它还提供易于使用的HTTP-API,命令行工具和用于管理RabbitMQ的Web UI;在本教程中,我们将在CentOS 7服务器上安装RabbitMQ。
环境
- Centos7
- Erlang 22.3
- RabbitMQ 3.8.3
- Haproxy 1.5.18
网络拓扑图
安装Erlang
Erlang安装包官网下载地址:https://www.erlang.org/downloads
1 | wget http://erlang.org/download/otp_src_22.3.tar.gz |
到此,Erlang安装完成,直接输入erl
1 | [root@iz7ejqa3pg6fglz ~]# erl |
安装RabbitMQ Server
RabbitMQ官方下载地址:https://www.rabbitmq.com/install-rpm.html#downloads
我这里选择RPM for RHEL Linux 7.x, CentOS 7.x, Fedora 24+ (supports systemd)
1 | wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el7.noarch.rpm |
集群配置
RabbitMQ利用erlang的分布式特性组建集群,erlang集群通过magic cookie实现,此cookie保存在$home/.erlang.cookie,这里即:/var/lib/rabbitmq/.erlang.cookie,需要保证集群各节点的此cookie一致,可以选取一个节点的cookie,采用scp同步到其余节点。
同步cookie
1 | #注意.erlang.cookie文件的权限,rabbitmq账号,权限400或600即可,为组或other账号赋权会报错 |
配置hosts
1 | #组建集群时采用”cluster@node”的格式,需要提前设置hosts文件; |
使用-detached参数启动节点
1 | #rmq-node2/3因更换了.erlang.cookie,使用此命令会无效并报错,可以依次采用“systemctl stop rabbitmq-server”停止服务,“systemctl start rabbitmq-server”启动服务,最后再“rabbitmqctl stop” |
组建集群(rmq-node2&rmq-node3)
组建集群(disk节点)
1 | #“rabbitmqctl join_cluster rabbit@rmq-node1”中的“rabbit@rmq-node1”,rabbit代表集群名,rmq-node1代表集群节点(节点名同hostname,hostname与/etc/hosts中设置必须保持一致);rmq-node2与rmq-node3均连接到rmq-node1,它们之间也会自动建立连接。 |
修改disk节点到内存节点
1 | #如果节点已是"disk"节点,可以修改为内存节点 |
查看集群状态
1 | rabbitmqctl cluster_status |
- 3个节点正常运行,其中rmq-node3是内存节点;
- 另外节点间的元数据也会同步,如前文只在rmq-node1节点创建的admin账号,此时也可在其他两个节点查询
但节点间的配置文件不会同步,如前文在rmq-node1节点允许的guest账号远程登录,此时其他节点的guest账号并不具备登录权限。
设置镜像队列高可用
到目前为止,集群虽然搭建成功,但只是默认的普通集群,exchange,binding等数据可以复制到集群各节点。
但对于队列来说,各节点只有相同的元数据,即队列结构,但队列实体只存在于创建该队列的节点,即队列内容不会复制(从其余节点读取,可以建立临时的通信传输)。
这样此节点宕机后,其余节点无法从宕机节点获取还未消费的消息实体。如果做了持久化,则需要等待宕机节点恢复,期间其余节点不能创建宕机节点已创建过的持久化队列;如果未做持久化,则消息丢失。
1 | #任意节点执行均可如下命令:将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直; |
Haproxy安装
1 | yum install haproxy |
Haproxy配置
1 | #绑定配置 |
启动Haproxy
1 | /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg |
关于RabbitMQ还想提几点,队列有。1.单机模式,2.普通模式集群,3.镜像队列,在普通模式上搭建起来的镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作,在 某台 rabbitmq节点上,执行 : rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’ 可以把队列设置为镜像队列