目录
消息中间件RabbitMQ,一般以集群方式部署,主要提供消息的接受和发送,实现各微服务之间的消息异步。
原理介绍
RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证,所以部署Rabbitmq分布式集群时要先安装Erlang,并把其中一个服务的cookie复制到另外的节点,确保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集群
环境要求
1、所有节点需要在同一个局域网内;
2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。
3、准备三台干净的虚拟机,要修改主机名且不能一样,配置要相同
相互解析
所有的机器都要相互做解析
# vim /etc/hosts
10.3.145.200 rabbit-1
10.3.145.201 rabbit-2
10.3.145.202 rabbit-3
所有的节点都要安装 erlang 和 rabbitmq
安装前先查看 erlang和rabbitmq版本对应关系!!!
地址: https://www.rabbitmq.com/which-erlang.html
编译安装erlang
安装依赖包
# yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
获取erlang安装包
# wget http://erlang.org/download/otp_src_21.3.tar.gz
# tar -zxvf otp_src_21.3.tar.gz
# cd otp_src_21.3
# ./configure --prefix=/usr/local/bin/erlang --without-javac
# make && make install
设置环境变量
# vim /etc/profile.d/erlang.sh
ERLANG_HOME=/usr/local/bin/erlang
PATH=$PATH:$ERLANG_HOME/bin
export ERLANG_HOME PATH
# source /etc/profile.d/erlang.sh
当出现"erl"命令 说明erlang 安装安装成功
编译安装rabbitmq
1.获取rabbitmq安装包
# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.0/rabbitmq-server-generic-unix-3.8.0.tar.xz
2.解包
# yum install -y xz
# xz -d rabbitmq-server-generic-unix-3.7.9.tar.xz
# tar -xvf rabbitmq-server-generic-unix-3.7.9.tar -C /usr/local/
3.设置环境变量
法一:
# vim /etc/profile.d/rabbit.sh
RABB_HOME=/usr/local/rabbitmq_server-3.7.14
PATH=$PATH:$RABB_HOME/sbin
export RABB_HOME PATH
# source /etc/profile.d/rabbit.sh
法二:
# echo "export PATH=$PATH:/usr/local/bin/erlang/bin:/usr/local/bin/rabbitmq_server-3.7.9/sbin" >> /etc/profile
# source /etc/profile
4.导入rabbitmq 的管理界面
# rabbitmq-plugins enable rabbitmq_management
5.设置erlang
找到erlang cookie文件的位置
# find / -name *.cookie
将master机器上的cookie 通过scp的方式拷贝到其他机器,设置erlang的目的是要保证集群内的cookie内容一致。
# cat /root/.erlang.cookie
统一使用主节点的erlang cookie,否则服务起不来
使用-detached参数运行各节点。 !!要确保三台机器上的cookie是一致的,再启动服务
# rabbitmq-server -detached #放在后台运行
查看节点状态
# rabbitmqctl cluster_status
6.创建用户
由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限。
添加用户并设置密码
# rabbitmqctl add_user admin admin123
添加权限(使admin用户对虚拟主机“/” 具有所有权限)
# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
修改用户角色(加入administrator用户组)
# rabbitmqctl set_user_tags admin administrator
!!到此可以通过http://ip:15672 使用 用户:admin; 密码:admin123 进行登陆了。
!!此时每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了
组成集群
rabbitmq-server 启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。
要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。
如果使用 ./rabbitmqctl stop,应用和节点都将被关闭。
所以使用 rabbitmqctl stop_app 仅仅关闭应用。
将rabbit-2、rabbit-3和rabbit-1组成集群,这里以rabbit-2为例
rabbit-2# rabbitmqctl stop_app
rabbit-2# rabbitmqctl join_cluster rabbit@rabbit-1 ##这里集群的名字一定不要写错了
rabbit-2# rabbitmqctl start_app
将rabbit-3重复上述操作,也加入rabbit-1的集群。
查看集群的状态
[root@rabbit-3 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit-3 ...
Basics
Cluster name: rabbit@rabbit-1
Disk Nodes
rabbit@rabbit-1
rabbit@rabbit-2
rabbit@rabbit-3
Running Nodes
rabbit@rabb-1
rabbit@rabb-2
rabbit@rabbit-3
Versions
rabbit@rabbit-1: RabbitMQ 3.8.0 on Erlang 21.3
rabbit@rabbit-2: RabbitMQ 3.8.0 on Erlang 21.3
rabbit@rabbit-3: RabbitMQ 3.8.0 on Erlang 21.3
......略
可通过web访问查看