环境说明
- 系统环境
hostname IP地址 操作系统
tk226-nw-f05-dx1-08 10.2.210.176 Oracle Linux 7.4 - 64位
tk226-nw-f05-dx1-09 10.2.210.177 Oracle Linux 7.4 - 64位
tk226-nw-f05-dx1-10 10.2.210.178 Oracle Linux 7.4 - 64位
下载安装包
推荐一个 Linux包下载网站,很多依赖包都可以在这个网站找到
https://pkgs.org/
![](https://img.haomeiwen.com/i6278284/164c4e6c0ad8df8a.png)
一, 安装Erlang
RabbitMQ 使用 Erlang 语言编写,所以在安装 RabbitMQ 需要先安装Erlang,这跟 java 程序需要安装 jdk 应该是一个道理的.
Erlang的安装有很多种,这里为了方便,我选择的是 zero dependency Erlang RPM package for running RabbitMQ (0 依赖 RPM 包)。
[root@tk226-nw-f05-dx1-08 ~]#rpm -ivh erlang-20.2.3-1.el7.centos.x86_64.rpm
二, 安装RabbitMQ
- 安装RabbitMQ,由于系统缺少socat包,所以需要先安装依赖
[root@tk226-nw-f05-dx1-08 ~]# rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
[root@tk226-nw-f05-dx1-08 ~]# rpm -ivh rabbitmq-server-3.7.4-1.el7.noarch.rpm
- 进入/sbin目录,运行./rabbitmq-server -detached启动服务。
[root@tk226-nw-f05-dx1-08 ~]#./rabbitmq-server -detached #这是后台服务运行
- 运行./rabbitmqctl status检查状态
[root@tk226-nw-f05-dx1-08 ~]# ./rabbitmqctl status #监测服务状态
- 启动Web管理界面
[root@tk226-nw-f05-dx1-08 ~]# rabbitmq-plugins enable rabbitmq_management #启动web
输入http://ip地址:端口号(默认:15672)
默认可是可以再本地登陆,使用guest用户,密码也是guest. http://localhost:15672
注意:guest用户不能远程登陆。
- 增加用户(默认guest只允许本地访问)
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl add_user admin admin
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl set_user_tags admin administrator #设置用户分组
[root@tk226-nw-f05-dx1-08 ~]#rabbitmqctl set_permissions -p "/" admin "." "." ".*" #设置默认vhost(“/”)访问权限
![](https://img.haomeiwen.com/i6278284/0094311f8b88c6ed.png)
三,RabbitMQ Cluster 配置
-
局域网配置
分别在三个节点的/etc/hosts下设置相同的配置信息
10.2.210.176 tk226-nw-f05-dx1-08
10.2.210.177 tk226-nw-f05-dx1-09
10.2.210.178 tk226-nw-f05-dx1-10
-
同步Erlang Cookie
采用从主节点copy的方式保持Cookie的一致性
[root@tk226-nw-f05-dx1-08 ~]# scp /var/lib/rabbitmq/.erlang.cookie 10.2.210.177:/var/lib/rabbitmq
[root@tk226-nw-f05-dx1-08 ~]# scp /var/lib/rabbitmq/.erlang.cookie 10.2.210.178:/var/lib/rabbitmq
- 使用 -detached运行各节点
rabbitmqctl stop
rabbitmq-server -detached
- 查看各节点的状态
[root@tk226-nw-f05-dx1-08 ~]# rabbitmqctl cluster_status
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl cluster_status
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl cluster_status
- 创建并部署集群
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl stop_app
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl join_cluster rabbit@tk226-nw-f05-dx1-08
[root@tk226-nw-f05-dx1-09 ~]# rabbitmqctl start_app
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl stop_app
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl join_cluster rabbit@tk226-nw-f05-dx1-08
[root@tk226-nw-f05-dx1-10 ~]# rabbitmqctl start_app
- 查看集群状态
[root@tk226-nw-f05-dx1-08 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@tk226-nw-f05-dx1-08 ...
[{nodes,[{disc,['rabbit@tk226-nw-f05-dx1-08','rabbit@tk226-nw-f05-dx1-09',
'rabbit@tk226-nw-f05-dx1-10']}]},
{running_nodes,['rabbit@tk226-nw-f05-dx1-10','rabbit@tk226-nw-f05-dx1-09',
'rabbit@tk226-nw-f05-dx1-08']},
{cluster_name,<<"rabbit@tk226-nw-f05-dx1-08">>},
{partitions,[]},
{alarms,[{'rabbit@tk226-nw-f05-dx1-10',[]},
{'rabbit@tk226-nw-f05-dx1-09',[]},
{'rabbit@tk226-nw-f05-dx1-08',[]}]}]
![](https://img.haomeiwen.com/i6278284/ec9b2262253e4bb5.png)
- 总结
- cookie在所有节点上必须完全一样,同步时一定要注意。
- erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
- 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。
- 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。
四,RabbitMQ HA
1.镜像模式概念
在服务负载不是很大的情况下,一般我们只需要一个节点便能为我们提供服务,可这难免会发生单点故障,要解决这个问题,我们便需要配置集群和镜像。
![](https://img.haomeiwen.com/i6278284/2a2ad93d567565cb.png)
做一下简单的比较,为直观起见,流程简化为单链接,中间为RabbitMQ节点,上方为publisher,下方为consumer。
-
单一模式:最简单的情况,非集群模式。
没什么好说的。
-
普通模式:默认的集群模式。
对于Queue来说,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。
当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。
所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连A或B,出口总在A,会产生瓶颈。
该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,然后就没有然后了……
-
镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案
该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。
所以在对可靠性要求较高的场合中适用。
2.配置镜像队列
- 方法1 :使用命令行来设置
set_policy [-p vhostpath] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}
例
./rabbitmqctl set_policy -p '/' --priority 9 --apply-to all ha-all "^.*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
说明
| ha-mode | ha-params
-------------------------------------------------------------
| -p '/' | 设置vhost信息。
-------------------------------------------------------------
| --priority 10 | 设置优先级。高数字会优先处理。
-------------------------------------------------------------
| --apply-to queue | 作用对象。queue、exchanges,all
-------------------------------------------------------------
| name | 规则名称
-------------------------------------------------------------
- 方法2 :web管理页面设置
web配置镜像复制比较简单也比较直观
![](https://img.haomeiwen.com/i6278284/9b8b4fb0999c6a4e.png)
![](https://img.haomeiwen.com/i6278284/30fa8a2331072a81.png)
3. 如何检查队列镜像是否成功
创建 test 队列,在WebUI中可以看到该队列使用了哪些policies,镜像的份数,点击队列还可以查看详细信息。
![](https://img.haomeiwen.com/i6278284/8b26cd29e377c22d.png)
![](https://img.haomeiwen.com/i6278284/5e3463d45f98a893.png)
到此,RabbitMQ的安装,集群及镜像就全部完了。
网友评论