RabbitMQ集群部署
简介
- 消息中间件RabbitMQ,一般以集群方式部署, 主要提供消息的接受和发送,实现各微服务之间的消息异步。 以下将介绍RabbitMQ+HA方式进行部署。
原理介绍
- cookie
- 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消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
环境要求
-
1、所有节点需要再同一个局域网内;
-
2、所有节点需要有相同的 erlang cookie,否则不能正常通信,为了实现cookie内容一致,采用scp的方式进行。
-
3、准备三台虚拟机,配置相同
- 192.168.145.11 设置主机名 rabbitmq1
- 192.168.145.12 设置主机名 rabbitmq2
- 192.168.145.13 设置主机名 rabbitmq3
- 操作系统:centos7.2以上
-
4、集群中所有节点都需要hosts文件解析
-
[root@rabbitmq1 ~]# cat /etc/hosts 192.168.229.11 rabbitmq1 192.168.229.12 rabbitmq2 192.168.229.13 rabbitmq3
-
部署过程(每个节点都配置)
-
1、所有节点配置 vim /etc/hosts
- 192.168.145.11 rabbitmq1
- 192.168.145.12 rabbitmq2
- 192.168.145.13 rabbitmq3
-
2、所有节点安装erLang和rabbitmq
- 见linux系统中单机部署rabbitmq
yum -y install erlang
yum install -y rabbitmq-server
cp /usr/share/doc/rabbitmq-server-3.3.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
vim /etc/rabbitmq/rabbitmq.config
53行解注释
{loopback_users, []}
-
3、导入rabbitmq 的管理界面
- rabbitmq-plugins enable rabbitmq_management
- systemctl restart rabbitmq-server
-
4、设置erlang运行节点
-
一定要保证三台机器的cookie内容一致
-
找到erlang cookie文件的位置,
- 源码包部署一般会存在.erlang.cookie文件;
- rpm包部署一般是在/var/lib/rabbitmq/.erlang.cookie。
- 将 rabbitmq1 的该文件使用rsync或者是scp复制到 rabbitmq2、rabbitmq3,文件权限需要是400。
-
[root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
-
cat /var/lib/rabbitmq/.erlang.cookie
-
-
systemctl restart rabbitmq-server
-
rabbitmq2和rabbitmq3
- #rabbitmqctl stop
- 关闭rabbitmq2和rabbitmq3的服务(不要关rabbitmq1) 如果2,3节点没有启动服务,会提示关闭错误。
- 也就是,确保所有的活动任务和连接都被正常处理和关闭
- #rabbitmqctl stop
-
rabbitmq2和rabbitmq3
- #rabbitmq-server -detached
- 2、3 独立运行节点,warning提示不用理会
- Warning: PID file not written; -detached was passed.
- #rabbitmq-server -detached
-
rabbitmqctl cluster_status
- 查看各个节点状态。(下图是node1节点)
-
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1]}]},
{running_nodes,[rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]},
{alarms,[{rabbit@rabbitmq1,[]}]}]
-
Cluster status of node rabbit@rabbitmq1
- 每台主机看到的只有一个的server信息。目前尚未组合成集群
-
5、添加用户并设置密码
- 由于guest这个用户,只能在本地访问,所以我们要在每个节点上,新增一个用户并赋予对/的所有权限,然后添加到管理员组中,让此用户能够远程访问
- 三个主机都操作
- rabbitmqctl add_user admin admin
- rabbitmqctl set_permissions -p “/” admin “.*” “.*” “.*”
- rabbitmqctl set_user_tags admin administrator
- 命令行添加用户,设置tags
(开发者)查看所有的队列:rabbitmqctl list_queues
(开发者)清除所有的队列:rabbitmqctl reset
添加用户:rabbitmqctl add_user username password
username 换掉 passwd 换掉
分配角色:rabbitmqctl set_user_tags username administrator
# 删除用户命令
rabbitmqctl delete_user testuser
- 新增虚拟主机:rabbitmqctl add_vhost vhost_name
[root@rabbitmq1 ~]# rabbitmqctl add_vhost iphone
Creating vhost "iphone" ...
...done.
-
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username “.*” “.*” “.*”(后面三个”*”代表用户拥有配置、写、读全部权限)
-
6、访问测试
- http://ip:15672
- 默认账号密码:guest/guest
-
客户端介绍
- 1、界面介绍
- 1、界面介绍
-
2、设置虚拟主机与添加用户
- 添加用户
- 添加用户
组成集群
-
简介
- rabbitmq-server 启动时,会一起启动:节点和应用,它预先设置RabbitMQ应用为standalone(脱机)模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。(停应用,不停止节点)
-
1、将node2、node3加入到node1中组成集群
-
磁盘节点
- 第二台节点
-
node2# rabbitmqctl stop_app
仅停止应用,不关闭节点(注意是节点2)
node2# rabbitmqctl join_cluster rabbit@rabbitmq1
集群名字一定不要写错(查看rabbitmq1 的节点状态)
node2# rabbitmqctl start_app
- 如果此时查看节点1,会发现集群节点信息增加
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]}]},
{running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]}]
...done.
- 第三台节点
node3# rabbitmqctl stop_app
node3# rabbitmqctl join_cluster rabbit@rabbitmq1 ##集群名字一定不要写错
node3# rabbitmqctl start_app
- 如果此时查看节点1,会发现集群节点信息增加
[root@rabbitmq1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]},
{running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq2,rabbit@rabbitmq1]},
{cluster_name,<<"rabbit@rabbitmq1">>},
{partitions,[]}]
...done.
- 内存节点(了解)
#使用内存节点加入集群
node2 # rabbitmqctl join_cluster --ram rabbit@rabbitmq1
- 2、在任意节点上查看集群状态
node3# rabbitmqctl cluster_status
-
输出信息
[root@rabbitmq2 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq2 ... [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]}, {running_nodes,[rabbit@rabbitmq3,rabbit@rabbitmq1,rabbit@rabbitmq2]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}] ...done.
[root@rabbitmq3 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq3 ... [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]}, {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}] ...done.
-
3、在任意节点上设置镜像队列策略
- 在web界面登陆,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);
-
- 然后在linux中设置镜像队列策略:
- 语法介绍
- rabbitmqctl set_policy -p vhost1 ha-all “^” ‘{“ha-mode”:“all”}’
- 案例中的命令
- rabbitmqctl set_policy -p jinlongyu ha-all “^” ‘{“ha-mode”:“all”}’
- 注释
- “coresystem”
- vhost名称,此处应该填写“jinlongyu”
- ha-all
- 策略名称
- “^”
- queue的匹配模式为匹配所有的队列
- { }
- 为镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
- ha-mode
- 指明镜像队列的模式,有效值为 all/exactly/nodes
- all
- 表示在集群中所有的节点上进行镜像,包含新增节点
- exactly
- (可选)表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
- nodes
- (可选)表示在指定的节点上进行镜像,节点名称通过ha-params指定
- ha-sync-mode
- (可选)进行队列中消息的同步方式,有效值为automatic和manual
- 提示
- 此时镜像队列设置成功。队列会被复制到各个节点,各个节点状态保持一致(这里的虚拟主机vhost1 。是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息队列进行隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。
- “coresystem”
- 语法介绍
- 然后在linux中设置镜像队列策略: