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 <span style="background-color:rgb(255,204,0);">--ram</span>
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,并加入集群。
---------------------

原文:https://blog.csdn.net/jinyidong/article/details/80003362

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二篇

https://mp.weixin.qq.com/s/cjz26W-06xsNauteKLs6hw

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

1、单主机模式:

rabbitMQ服务运行在单独的一台主机种,通常生产环境不适用该模式,性能有限,并且如果服务器宕机服务将完全不可用

2、普通集群模式:

一说到集群问题瞬间变得复杂多了。首先对于Queue来说消息实体只存在于其中一个节点,集群中其他节点仅有相同的元数据,即队列结构。

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

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

3、镜像集群模式:

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

rabbitmq集群节点:内存节点与磁盘节点

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

本文是两台服务器搭建的rabbitmq镜像集群,其实就是从单主机模式--->普通集群模式--->镜像集群模式的搭建过程

一、服务器基本配置:

服务器(prod01)

IP:172.17.47.219 

主机名:prd01

内核:CentOS Linux release 7.4.1708 (Core)

hosts文件修改:echo '172.17.73.215 prd02' >> /etc/hosts

服务器(prod02)

IP:172.17.73.215 

主机名:prd02

内核:CentOS Linux release 7.4.1708 (Core)

hosts文件修改:echo '172.17.47.219 prd01' >> /etc/hosts

二、安装依赖(prd01、prd02都需要安装,安装步骤一样)

yum -y install make ncurses-devel gcc gcc-c++unixODBC unixODBC-devel openssl openssl-devel

三、安装rabbitmq依赖的erlang环境(prd01、prd02都需要安装,安装步骤一样)

  • cd /usr/local/src/

  • wget http://erlang.org/download/otp_src_19.3.tar.gz

  • tar xf otp_src_19.3.tar.gz

  • cd otp_src_19.3

  • ./configure --prefix=/usr/local/erlang--enable-smp-support --enable-threads --enable-sctp --enable-kernel-poll --enable-hipe --with-ssl

  • make && make install

  • vim /etc/profile

        ERL_HOME=/usr/local/erlang

        PATH=$ERL_HOME/bin:$PATH

        export ERL_HOME PATH

  • source /etc/profile

四、安装rabbitmq

  • wget https://github.com/rabbitmq/rabbitmq-server/releases/download/rabbitmq_v3_6_6/rabbitmq-server-generic-unix-3.6.6.tar.xz

  • tar xfrabbitmq-server-generic-unix-3.6.6.tar.xz

  • mkdir /data/application

  • mv rabbitmq_server-3.6.6/data/application/rabbitmq3.6

五、启动

  • cd /data/application/rabbitmq3.6/

  • ./sbin/rabbitmq-server  -detached

  • ./sbin/rabbitmq-plugins enablerabbitmq_management

六、添加用户,设置角色,授权

  • ./sbin/rabbitmqctl add_user user password

  • ./sbin/rabbitmqctl set_user_tags user administrator

  • ./sbin/rabbitmqctl set_permissions -p / user ".*" ".*" ".*"

七、登陆

浏览器输入ip:port

以上rabbitmq已将安装成功,这里只展示了其中一台服务器的rabbitmq安装,两台步骤一样,不做多余展示,大家发现与本人之前发表的rabbitmq单点安装(一)步骤一样,没错是一样的,不一样的在后面,以下内容需要注意了!!!!

八、erlang cookie准备

同步每个节点cookie

Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang集群中各节点是通过一个magic cookie来实现的

找到erlang cookie文件的位置,官方在介绍集群的文档中提到过.erlang.cookie一般会存在这两个地址:第一个是$home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在${home}目录下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式进行安装的,那么这个文件会在/var/lib/rabbitmq目录下,文件是400权限,必须保证各节点cookie保持一致,否则节点之间就无法通信。

将prd01的.erlang.cookie文件内容复制到prd02,复制方式很多,请自行选择

Prd01内容:

cat .erlang.cookie

ZVTEFVBWNCJDTXNTIPXY

备份prd02上面的.erlang.cookie文件

mv .erlang.cookie .erlang.cookie_prd02

替换为prd01的内容

 cat.erlang.cookie

ZVTEFVBWNCJDTXNTIPXY

修改权限(两台都要保证为400)

chmod 400 .erlang.cookie

九、集群

rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用

将prd02加入到prd01,在rpd02上操作

 ./sbin/rabbitmqctl stop_app 

磁盘节点(默认): ./sbin/rabbitmqctl join_cluster rabbit@prd01

内存节点:./sbin/rabbitmqctl join_cluster --ram rabbit@prd01

启动prod02上面rabbitmq的应用

 ./sbin/rabbitmqctl start_app

十、集群访问

加入集群之后prd02创建的用户无法登陆访问了,需要用prd01创建的用户访问

使用prod01的ip:port访问:

使用prod02的ip:port访问:

十一、集群常用命令

  • 脱离集群

         ./sbin/rabbitmqctl  stop_app

         ./sbin/rabbitmqctl  reset

         ./sbin/rabbitmqctl  start_app

    • 查看集群状态,可以在rabbitMQ任意节点执行查看集群状态:

./sbin/rabbitmqctl cluster_status

十二、镜像集群设置

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

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

到这里RabbitMQ搭建好了,可以用阿里云的slb、Haproxy等其他做负载均衡

原文地址:https://www.cnblogs.com/cheyunhua/p/9961953.html