Rabbitmq集群搭建

RabbitMQ集群基本概念

Rabbit模式大概分为以下三种:单主机模式、普通集群模式、镜像集群模式。

  • 单主机模式:

    • RabbitMQ服务运行在单独的一台主机中,通常生产环境不使用该模式,性能有限,并且如果服务器宕机服务将完全不可用。
  • 普通集群模式

    • 首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。

    • 当消息进入A节点的Queue中后,Consumer从B节点拉取消息时,RabbitMQ会临时在两个节点间进行消息传输,把A中的消息实体取出并经过B发送给Consumer。所以Consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立Queue。否则Consumer如果只连接一个节点区消息会造成该节点的性能瓶颈。

    • 该模式存在一个问题就是当其中一个节点故障后,其他节点无法取到故障节点中还未消费的消息。如果做了消息持久化,那么得等A节点恢复,然后才可被消费;如果没有持久化的话,那就杯具了!

  • 镜像集群模式

    • 前面讲到RabbitMQ的普通集群模式不同节点间只同步队列结构不同步消息。镜像模式会把队列结构和消息都存在于多个节点,属于RabbitMQ的HA方案。其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大量消耗。所以这种模式应用于可靠性要求较高的场合中。
  • 内存节点与磁盘节点

    • RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。不过,如前文所述,如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是会放在磁盘。原则上一个集群至少有一个磁盘节点。在实际使用中会发现所谓的磁盘节点是只用来存储集群的配置信息,也就是说如果集群中没有磁盘节点,当所有节点关机后集群的配置信息就会丢失。在进行性能测试时两个模式的节点订阅发布消息的性能没有太大差距。
  • 多节点负载分发

    • RabbitMQ集群模式是没有中心节点的,并且在连接集群的时候实际上Consumer是连接其中某一台节点,连接方法和单主机模式一致。那就遇到一个尴尬的问题,怎么保证Consumer均匀的连接到多个节点。提供了两个思路。

      • 1、通过负载均衡设备来实现流量分发。可以使用F5硬件负载均衡,如果没有F5的硬件负载均衡设备也可以使用想LVS等服务,当Consumer连接集群时实际是先经过负载均衡。
      • 2、虽然负载均衡设备通常都很稳定,但这样一来RabbitMQ的集群就有了中心节点。我们在使用的时候是这样的,首先将集群中所以节点的IP放在一个数组中,app在连接RabbitMQ的时候会从数组中随机选择一个IP来连接,然后把连接的节点的IP缓存到服务器,如果连接超时则重新随机选择其他节点来连接。通过这种方式来实现app流量的分发。

下面我们一起来搭建一个普通模式的集群。

RabbitMQ集群部署

我用3台服务器来搭建一个3个节点的集群,其中192.168.127.139为磁盘节点,192.168.127.140,192.168.127.132为内存节点。为便于管理,对服务器的命名如下:

192.168.127.139 basic-server

192.168.127.140 rabbitmq-m

192.168.127.132 agentNode01

修改每台主机的host文件:

vi /etc/hosts

192.168.127.139 basic-server
192.168.127.140 rabbitmq-m
192.168.127.132 agentNode01                    
修改每台主机名:已139为例

vi /etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=basic-server

打开主机的相应端口,并在设置完成后重启防火墙:

firewall-cmd --permanent --add-port=25672/tcp

firewall-cmd --permanent --add-port=15672/tcp

firewall-cmd --permanent --add-port=5672/tcp

firewall-cmd --permanent --add-port=4369/tcp

systemctl restart firewalld.service

同步每个节点Cookie(在150执行) 
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。


所有节点重启:

rabbitmqctl stop
rabbitmq-server -detached

连接集群:

rabbitmqctl stop_app(注意硬盘节点先不要执行)
rabbitmqctl join_cluster --ram rabbit@basic-server(连接到任意一个已经加入集群的节点均可,此处均连接磁盘节点)
rabbitmqctl start_app
rabbitmqctl cluster_status  //查看集群状态
//磁盘节点,join_cluster 命令去掉--ram参数即可。
//在RabbitMQ集群里,必须至少有一个磁盘节点存在(磁盘节点用来存储集群状态)

集群创建成功后可查看集群状态:


远程访问配置 
配置集群之后需要重新添加账号 

默认网页是不允许访问的,需要增加一个用户修改一下权限,代码如下:

rabbitmqctl add_user admin admin//添加用户
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"  //添加权限
rabbitmqctl set_user_tags admin administrator  //修改用户角色

在浏览器输入任意一个节点的WEB管理插件http://ip:15672,在Overviem视图找到Nodes选项卡可以看到所有的节点。


删除节点: 
修改host和主机名,同之前的步骤。 

在要脱离集群的节点执行:

rabbitmqctl  stop_app
rabbitmqctl  reset
rabbitmqctl  start_app

或者在其他节点执行:

rabbitmqctl forget_cluster_node rabbit@basic-server
增加节点:  

在已有节点复制cookies到新的节点

scp /root/.erlang.cookie root@192.168.127.132:/root/  //在已有节点执行。
//以下在要新增的节点执行。
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram  rabbit@agentNode01
rabbitmqctl start_app

查看集群状态:

rabbitmqctl cluster_status

RabbitMQ镜像集群配置

尽管我们部署好了普通模式的集群,但因为节点间只同步队列结构并不进行消息的同步,对于一些可靠性要求较高的场景需要对队列中的消息也同步到所有节点。 
使用Rabbit镜像功能,需要基于rabbitmq策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。

策略的修改可以通过命令也可以通过WEB,也可以通过WEB来修改的,非常简单。 
Pattern:“^” 表示所有匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。 

ha-mode:“all”代表同步到所以节点。

镜像集群配置可参考https://blog.youkuaiyun.com/super_rd/article/details/70856909

更多集群的设置请参考https://blog.youkuaiyun.com/zyz511919766/article/details/41896747

转自 https://blog.youkuaiyun.com/super_rd/article/details/70856909

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值