
[TOC]
1.rabbitmq集群
1.1 rabbitmq集群模式分两种
- 普通集群模式
queue创建之后,如果没有其它policy,消息实体只存在于其中一个节点,A、B两个Rabbitmq节点仅有相同的元数据,即队列结构,但队列的数据仅保存有一份,即创建该队列的rabbitmq节点(A节点),当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer,所以consumer可以连接每一个节点,从中取消息,该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体。
- 镜像模式
把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案(镜像模式是在普通模式的基础上,增加一些镜像策略)该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取,该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置policy,然后客户端创建队列的时候,rabbitmq集群根据“队列名称”自动设置是普通集群模式或镜像队列。
- 区别
普通模式:数据不安全,消息只会存在某个节点,如果其中一个宕机,数据就丢失。
镜像模式:数据安全,每个节点都有数据,缺点:会降低系统性能,增加网络带宽负荷。
1.2 集群中节点模式
- 内存节点:数据保存在内存中,如果集群全是内存节点,那么该集群不能全部停止,否则数据丢失。
- 磁盘节点:数据保存在内存和磁盘中,内存数据不写入磁盘,集群中只要一个节点数据写入到磁盘作为备份就足够了,起到备份,数据安全。
1.3 推荐架构
在一个rabbitmq集群中,有3台及以上节点,其中一台节点使用磁盘模式,其余是内存模式,内存节点无访问速度更快,由于磁盘io相对较慢,可作为备份节点使用。
1.4 搭建环境要求
- 3台机器centos7或8
ip地址:
- node1:192.168.37.10
- node2:192.168.37.20
- node3:192.168.37.5
1.5 添加3台主机解析
#把一下解析内容复制到rabbitmq集群中的hosts文件
[root@Centos8mini ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.37.10 CentOS7
192.168.37.20 CentOS7-server
192.168.37.5 Centos8mini1.6 3台服务器分别:执行脚本,安装erlang语言及key
[root@Centos8mini ~]# cat /data/rabbitmq-server-repo.sh
#!/bin/bash
#
#**********************************************************************
#Author: zp.duan
#QQ: 760245899
#Data: 2020-03-24
#URL: http:
#FileName: rabbitmq-server-repo.sh
#Description: The test script
#Copyright(C): 2020All rights reserved
#*********************************************************************
#适用于centos7和8的repo安装
NU=`awk -F'[ .]' '{ print $4 }' /etc/redhat-release`
#安装erlang语言
yum install erlang -y
#安装key
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey && rpm --import https://packagecloud.io/gpg.key
#安装包秘钥
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
#安装repo源
/usr/bin/tee /etc/yum.repos.d/rabbitmq.repo << EOF
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/${NU}/
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOF
[root@Centos8mini ~]# bash /data/rabbitmq-server-repo.sh1.7 分别启动3台服务器
#分别启动三台服务器
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
#分别查询状态
[root@CentOS7 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@CentOS7 ...
Basics
Cluster name: rabbit@Centos8mini
Disk Nodes
rabbit@Centos8mini
···省略···
#依次停止所有服务器rabbit服务,
systemctl stop rabbitmq-server.service
#创建rabbitmq集群,拷贝cookie文件到另外两台服务器,集群依赖erlang集群工作,文件权限是400,该集群的所有节点中的cookie必须一致,否则节点无法通信。
#拷贝节点到192.168.37.5
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.37.5:/var/lib/rabbitmq/.erlang.cookie
#拷贝到192.168.37.20
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.37.20:/var/lib/rabbitmq/.erlang.cookie
#依次启动rabbitmq服务
systemctl start rabbitmq-server.service1.8 分别加入节点生成集群
#暂停节点内app
rabbitmqctl stop_app
#清空数据
rabbitmqctl reset
#依次把节点添加到192.168.37.5上rabbit@Centos8mini这是该节点名称可用rabbitmqctl cluster_status查看,加ram表示节点以内存模式保存数据,不加则是磁盘
rabbitmqctl join_cluster rabbit@Centos8mini --ram
#开启app
rabbitmqctl start_app
## 在节点192.168.37.20.执行上述步骤即可1.9 上述rabbitmq集群搭建完成,工作模式为普通模式
1.9.1 更改rabbitmq工作模式
1.9.2 修改为镜像模式
#任意一个节点上执行
```bash
[root@CentOS7 ~]# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...1.10 分别启动rabbitmq的web插件及修改guset用户登录
[root@Centos8mini ~]# rabbitmq-plugins enable rabbitmq_management
[root@Centos8mini ~]# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.3/ebin/rabbit.app
39 {loopback_users, []}, #第39行内的<<"guest">>去掉