RabbitMQ之集群搭建

1.RabbitMQ集群模式

RabbitMQ集群中节点包括内存节点(RAM)、磁盘节点(Disk,消息持久化),集群中至少有一个Disk节点

2.普通模式(默认)

        对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点。对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。

        应用场景:该模式各适合于消息无需持久化的场合,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化,只能等故障节点恢复。

3.镜像模式

        与普通模式不同之处是消息实体会主动在镜像节点间同步,而不是在取数据时临时拉取,高可用;该模式下,mirror queue有一套选举算法,即1个master、n个slaver,生产者、消费者的请求都会转至master。

        应用场景:可靠性要求较高场合,如下单、库存队列。

        缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。

        PS:(1)镜像集群也是基于普通集群,即只有先搭建普通集群,然后才能设置镜像队列。(2)若消费过程中,master挂掉,则选举新master,若未来得及确认,则可能会重复消费

2.Erlang安装(官网)

  • RmpFusion软件仓库安装
       RabbitMQ通过ELang(air-lang)开发,故需先安装ErLang,其许多相关依赖并不在yum软件仓库中,需从第三方软件仓库中获取,此处选择RmpFusion 。
yum install epel-release
rpm -ivh https://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm
  • Elang安装
sudo yum install erlang
  • 验证
erl -v

3.RabbitMQ安装

  • RabbitMQ安装(3.7.4版本)
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
rpm -ivh https://bintray.com/rabbitmq/rabbitmq-server-rpm/download_file?file_path=rabbitmq-server-3.7.4-1.el7.noarch.rpm 

PS:安装过程中提示socat被rabbitmq-server依赖,故需要先安装socat

yum install socat
  • 启动RabbitMQ
rabbitmq-server -detached  或者
rabbitmq-server start
  • RabbitMQ-Management安装
rabbitmq-plugins enable rabbitmq_management
  • 新增账户
rabbitmqctl add_user mq 123456
rabbitmqctl set_user_tags mq administrator


4.集群搭建(官网地址)

1.集群配置

编号 IP 宿主OS 硬件配置 hostname
1 192.*.*.147 CentOs 7.4.1708

CPU:4core,Inter i5-4590,3.3GHz

Memory:16G

rabbit1
2 192.*.*140 CentOs 7.4.1708

CPU:4core,Inter i5-4590,3.3GHz

Memory:8G

rabbit2
3 192.*.*.6 CentOs 7.4.1708

CPU:4core,Inter i5-4570,3.2GHz

Memory:16G

rabbit3

PS:需要保证各节点通过hostname可以ping通


可修改/etc/hosts


2.普通集群

  • Step1:集群节点(对等)通信---erlang Cookie
erlang分布式的每个节点上要保持相同的.erlang.cookie文件,文件路径: /var/lib/rabbitmq/.erlang.cookie
  • Step2:将rabbit2加入到rabbit1(RAM节点,默认Disk节点)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1 --ram
rabbitmqctl start_app
  • Step3:同上,将rabbit3加入到rabbit1(Disk节点)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app

PS:若希望修改节点类型,则(需要先Stop)

rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app


3.镜像集群

  • Policy(各节点均会同步)
RabbitMQ提供"ha-mode"和"ha-params(可选)",组合情况如下:


  • 配置

有两种配置方式:rabbitmqctl或者Rabbit Management,如

rabbitmqctl set_policy-p/ha-all"^"'{"ha-mode":"all"}'
rabbitmqctl set_policy productsyncinfo-ha ".*\.ProductSyncInfo\..*" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

5.其他

1.常用命令

rabbitmq-server -detached  启动RabbitMQ节点
rabbitmqctl start_app 启动RabbitMQ应用,而不是节点
rabbitmqctl stop_app  停止
rabbitmqctl status  查看状态
rabbitmqctl add_user mq 123456
rabbitmqctl set_user_tags mq administrator 新增账户
rabbitmq-plugins enable rabbitmq_management  启用RabbitMQ_Management
rabbitmqctl cluster_status 集群状态
rabbitmqctl forget_cluster_node rabbit@rabbit3 节点摘除 
rabbitmqctl reset application重置

2.异常处理

在搭建集群过程中,若节点异常退出且无法再次加入集群时:

(1)rm /var/lib/rabbitmq/mnesia--->该文件夹保存着集群信息;

(2)rabbitmq-service stop--->若未执行第一步,会提示异常;

{"init terminating in do_boot",{error,{inconsistent_cluster,"Node rabbit@rabbit2 thinks it's clustered with node rabbit@rabbit3, but rabbit@rabbit3 disagrees"}}}
init terminating in do_boot ({error,{inconsistent_cluster,Node rabbit@rabbit2 thinks it's clustered with node rabbit@rabbit3, but rabbit@rabbit3 disagrees}})

(3)在节点(rabbit1)中摘除该节点;

(4)重启RabbitMQ,并加入集群。

猜你喜欢

转载自blog.csdn.net/jinyidong/article/details/80003362