Centos7.x安装RabbitMQ集群


RabbitMQ集群

消息中间件rabbitmq,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。本篇将以rabbitmq+HA方式进行部署。

一、原理介绍

rabbitmq是依据erlang的分布式特性(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的,所以部署rabbitmq分布式集群时要先安装erlang,并把其中一个服务的cookie复制到另外的节点。

rabbitmq集群中,各个rabbitmq为对等节点,即每个节点均提供给客户端连接,进行消息的接收和发送。节点分为内存节点和磁盘节点,一般的,均应建立为磁盘节点,为了防止机器重启后的消息消失;

RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。消息队列通过rabbitmq HA镜像队列进行消息队列实体复制。

普通模式下,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。

镜像模式下,将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

二、部署方案

本方案中是在多台机器之间部署rabbitmq的cluster,要求如下:这几个节点需要再同一个局域网内;这几个节点需要有相同的erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。

1、环境介绍

CentOS Linux release 7.5.1804 (Core)

192.168.0.170 ZFVM-APP-0-170
192.168.0.171 ZFVM-APP-0-171
192.168.0.172 ZFVM-APP-0-172

首先在/etc/hosts中,绑定三台机器的ip和主机名

在三台主机上安装所需依赖的安装包

# yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

先下载安装RabbitMQ所需的的依赖软件erlang

# wget http://distfiles.macports.org/erlang/otp_src_20.3.tar.gz

# tar zxvf otp_src_20.3.tar.gz

# mkdir -p /data/local/erlang

# cd otp_src_20.3

# ./configure --prefix=/data/local/erlang --with-ssl --enable-threads --enable-smmp-support --enable-kernel-poll --enable-hipe --without-javac

# make && make install

# echo "export PATH=$PATH:/data/local/erlang/bin" >> /etc/profile

# source /etc/profile

# erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 9.3

下载安装RabbitMQ二进制包

# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-generic-unix-3.7.7.tar.xz

# xz -d rabbitmq-server-generic-unix-3.7.7.tar.xz

# tar xvf rabbitmq-server-generic-unix-3.7.7.tar -C /data/local/

# cd /data/local/

# mv rabbitmq_server-3.7.7 /data/local/rabbitmq-3.7.7

# echo "export PATH=$PATH:/data/local/rabbitmq-3.7.7/sbin" >> /etc/profile

# source /etc/profile

# rabbitmq-plugins enable rabbitmq_management    ---------打开管理界面插件

# vim .erlang.cookie        --------node2和node3与node1的一致

# rabbitmq-server -detached    -------–后台启动服务 

# rabbitmqctl add_user  admin 123456    --------添加用户,密码

# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

# rabbitmqctl set_user_tags admin administrator

将节点node2连接到节点node1上

# rabbitmqctl stop_app          ------关闭服务

# rabbitmqctl join_cluster rabbit@ZFVM-APP-0-170

# rabbitmqctl cluster_status           ------查看状态

在node3上重复上述动作,也连接到node1上

另外更改节点属性可以用一下命令

# rabbitmqctl stop_app      ------停止rabbitmq服务

# rabbitmqctl change_cluster_node_type disc/ram     ----更改节点为磁盘或内存节点

# rabbitmqctl start_app     -----开启rabbitmq服务

 

分别在3台主机上查看连接的状态

[root@ZFVM-APP-0-170 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@ZFVM-APP-0-170'
[{nodes,[{disc,['rabbit@ZFVM-APP-0-170','rabbit@ZFVM-APP-0-171',
                'rabbit@ZFVM-APP-0-172']}]},
 {running_nodes,['rabbit@ZFVM-APP-0-172','rabbit@ZFVM-APP-0-171',
                 'rabbit@ZFVM-APP-0-170']},
 {cluster_name,<<"rabbit@ZFVM-APP-0-170">>},
 {partitions,[]},
 {alarms,[{'rabbit@ZFVM-APP-0-172',[]},
          {'rabbit@ZFVM-APP-0-171',[]},
          {'rabbit@ZFVM-APP-0-170',[]}]}]


[root@ZFVM-APP-0-171 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@ZFVM-APP-0-171'
[{nodes,[{disc,['rabbit@ZFVM-APP-0-170','rabbit@ZFVM-APP-0-171',
                'rabbit@ZFVM-APP-0-172']}]},
 {running_nodes,['rabbit@ZFVM-APP-0-172','rabbit@ZFVM-APP-0-170',
                 'rabbit@ZFVM-APP-0-171']},
 {cluster_name,<<"rabbit@ZFVM-APP-0-170">>},
 {partitions,[]},
 {alarms,[{'rabbit@ZFVM-APP-0-172',[]},
          {'rabbit@ZFVM-APP-0-170',[]},
          {'rabbit@ZFVM-APP-0-171',[]}]}]


[root@ZFVM-APP-0-172 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@ZFVM-APP-0-172'
[{nodes,[{disc,['rabbit@ZFVM-APP-0-170','rabbit@ZFVM-APP-0-171',
                'rabbit@ZFVM-APP-0-172']}]},
 {running_nodes,['rabbit@ZFVM-APP-0-170','rabbit@ZFVM-APP-0-171',
                 'rabbit@ZFVM-APP-0-172']},
 {cluster_name,<<"rabbit@ZFVM-APP-0-170">>},
 {partitions,[]},
 {alarms,[{'rabbit@ZFVM-APP-0-170',[]},
          {'rabbit@ZFVM-APP-0-171',[]},
          {'rabbit@ZFVM-APP-0-172',[]}]}]
可以删除默认guest用户   
# rabbitmqctl delete_user guest

集群已搭建完成

镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案,在任意节点上执行

# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

# rabbitmqctl list_policies

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM