Spring3-RabbitMQ集群搭建

rabbitmq集群搭建

基础环境准备(所有机器)

[root@mq1 ~]# cat /etc/hosts
192.168.1.11 mq1
192.168.1.12 mq2
192.168.1.13 mq3
//#关闭selinux以及firewalld

安装环境依赖erlange以及rabbitmq(3台主机都装,只是另外2台没有配置admin用户)

[root@mq1 ~]# wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_23.2.1-1~centos~7_amd64.rpm
//依赖的语言
[root@mq1 ~]# yum -y install esl-erlang_23.2.1-1_centos_7_amd64.rpm
[root@mq1 ~]# wget  https://bintray.com/rabbitmq/rpm/download_file?file_path=rabbitmq-server%2Fv3.8.x%2Fel%2F7%2Fnoarch%2Frabbitmq-server-3.8.9-1.el7.noarch.rpm
[root@mq1 ~]# yum -y install rabbitmq-server-3.8.9-1.el7.noarch.rpm
启动rabbitmq以及rabbitmq_manage
[root@mq1 ~]# systemctl enable --now rabbitmq-server
[root@mq1 ~]# rabbitmq-plugins enable rabbitmq_management

仅mq1上操作

[root@mq1 ~]# rabbitmqctl  add_user admin 123456
//因为默认guest不能远程登陆,所以分别创建登陆用户,并授予admin权限
[root@mq1 ~]# rabbitmqctl  set_user_tags  admin administrator
[root@mq1 ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
//配置admin用户拥有所有的权限。/是默认的vhost,你也可以登录后创建新的vhost

直接访问192.168.1.11:15672 admin 123456 即可登录。5672为内部通信端口,15672为web访问端口,25672为集群节点通信

[root@mq1 ~]# rabbitmqctl status
Interface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

搭建rabbitmq集群

普通模式:

默认模式,以两个节点(rabbit01、rabbit02)为例来说明。对于 queue 来说,消息实体只存在于其中一个节点,rabbit01 和 rabbit02 两个节点仅有相同的元数据,及队列的结构。当消息进入 rabbit01 节点的 queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 queue。否则无论 consumer 连 rabbit01 或者 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么等rabbit01 节点恢复,然后才可被消费;如果没有持久化,就会产生消息丢失的现象。

镜像模式:
把需要的队列做成镜像队列,与多个节点属于 RabbitMQ 的 HA 方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

1.普通模式集群

安装完rabbitmq之后,路径在$HOME中或者在/var/lib/rabbitmq中,文件名称为.erlang.cookie,rabbitMQ的集群是依赖erlang集群,而erlang集群是通过这个cookie进行通信认证的,因此我们做集群就要让cookie一致

[root@mq1 ~]# ls -a /var/lib/rabbitmq/
.  ..  .erlang.cookie  mnesia

统一erlang.cookie文件中的cookie值

[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie  mq2:/var/lib/rabbitmq/
[root@mq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie  mq3:/var/lib/rabbitmq/
[root@mq1 ~]# date
Sat Apr  2 21:08:05 CST 2022
[root@mq2 ~]# ls -l /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 20 Apr  2 21:08 /var/lib/rabbitmq/.erlang.cookie

所有机器重启rabbitmq后,查看集群状态

[root@mq1 ~]# systemctl restart rabbitmq-server
[root@mq2 ~]# systemctl restart rabbitmq-server
[root@mq3 ~]# systemctl restart rabbitmq-server
[root@mq1 ~]# rabbitmqctl status
Status of node rabbit@mq1 ...
Runtime
...

将节点加入集群,在mq2/mq3上执行

[root@mq2 ~]# systemctl restart rabbitmq-server
[root@mq2 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq2 ...
[root@mq2 ~]# rabbitmqctl join_cluster --ram  rabbit@mq1
//加入到主节点mq1上去
Clustering node rabbit@mq2 with rabbit@mq1
[root@mq2 ~]# rabbitmqctl start_app
Starting node rabbit@mq2 ...
[root@mq1 ~]# rabbitmqctl status
Status of node rabbit@mq1 ...
Runtime
...

访问 192.168.1.17:15672,登陆后,可以看到
在这里插入图片描述

2 .镜像模式的集群

实际上镜像模式就是配置一个同步策略

镜像模式需要依赖policy模块
需要设置exchanges或者queue的数据需要复制同步,如何复制同步
[root@mq1 ~]# rabbitmqctl -n rabbit@mq1 list_policies
Listing policies for vhost "/" ...
[root@mq1 ~]#  rabbitmqctl set_policy xixi ^rabbitmq '{"ha-mode":"all"}'
Setting policy "xixi" for pattern "^rabbitmq" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
参数意思:
- ha-all 集群策略名称,自定义
- ^ : 匹配符。只有一个^代表匹配所有,^rabbitmq 为匹配名称为rabbitmq的exchanges或者queue
- ha-mode 为匹配类型,固定名,分为3种模式
      - all 所有queue
      - exctly 部分(需要配置ha-params参数,此参数为int类型,比如3,众多集群中的随机3台机器)
      - node 指定(需要配置ha-params参数,此参数为数组类型,比如[“rabbit@mq1”,”rabbit@mq2”]
[root@mq1 ~]# rabbitmqctl -n rabbit@mq1 list_policies
Listing policies for vhost "/" ...
vhost   name    pattern apply-to        definition      priority
/       xixi    ^rabbitmq       all     {"ha-mode":"all"}       0

配置好后,可以再web界面上看到。当然,也可以再web端配置策略
在这里插入图片描述
默认的目录结构

//数据目录
[root@mq1 ~]# tree /var/lib/rabbitmq/mnesia/rabbit@mq1
/var/lib/rabbitmq/mnesia/rabbit@mq1
├── msg_stores
 └── vhosts
//日志目录
[root@mq1 ~]# tree /var/log/rabbitmq/
/var/log/rabbitmq/
├── log
│   └── crash.log
├── rabbit@mq1.log
└── rabbit@mq1_upgrade.log
//配置目录
[root@mq1 ~]# tree /etc/rabbitmq/
/etc/rabbitmq/
└── enabled_plugins

自定义目录配置

Rabbitmq的配置文件有三个,位于/etc/rabbitmq/

(1)enabled_plugins

设置允许的插件列表,该配置文档的格式为erlang的列表格式,了解下
	[rabbitmq_management,rabbitmq_visualiser]

(2)rabbitmq.conf
设置rabbitmq的运行参数。该配置文件中的每个参数为一个erlang的 tuple,结构为{Key,Value}, Key为atom类型, Value为一个term。其中几个关键参数为:

tcp_listerners :设置rabbimq的监听端口,默认为[5672]。
disk_free_limit :磁盘低水位线,若磁盘容量低于指定值则停止接收数据,默认值为
{mem_relative, 1.0},即与内存相关联1:1,也可定制为多少byte.
vm_memory_high_watermark:内存低水位线,缺省0.4,即总内存的40%,若低于该水位线,则开启流控机制。
hipe_compile :将部分rabbimq代码用HighPerformance Erlang compiler编译,可提升性能,该参数是实验性,若出现erlang vm segfaults,应关掉。
force_fine_statistics, 该参数属于rabbimq_management,若为true则进行精细化的统计,但会影响性能。

(3)rabbitmq-env.conf rabbitmq的环境参数配置

RABBITMQ_NODE_PORT    端口设置,默认为5672
RABBITMQ_NODENAME     节点名称,默认为rabbit
RABBITMQ_MNESIA_BASE=/usr/local/rabbitmq/mnesia   后端存储目录
RABBITMQ_LOG_BASE=/usr/local/rabbitmq/log    日志目录
RABBITMQ_DEFAULT_USER=admin     登录的账号 
RABBITMQ_DEFAULT_PASS=123321    登录的密码
[root@mq1 ~]# mkdir /data  /log
[root@mq1 ~]# chown  -R rabbitmq:rabbitmq /data
[root@mq1 ~]# chown  -R rabbitmq:rabbitmq /log
[root@mq1 ~]# systemctl restart rabbitmq-server.service
[root@mq1 ~]# systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
   Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2022-04-02 23:22:56 CST; 19s ago

UI界面上界面上能做大部分查看或配置。你也可通过man帮助,跟–help 了解更多指令

[root@mq1 ~]# man rabbitmqctl
...
OPTIONS
     -n node
             Default node is "rabbit@target-hostname", where target-hostname is the local host.  On a host named
             "myserver.example.com", the node name will usually be "rabbit@myserver" (unless RABBITMQ_NODENAME has been
             overridden).  The output of "hostname -s" is usually the correct suffix to use after the "@" sign.  See
             rabbitmq-server(8) for details of configuring a RabbitMQ node.
     -q, --quiet
             Quiet output mode is selected.  Informational messages are reduced when quiet mode is in effect.
     -s, --silent
             Silent output mode is selected.  Informational messages are reduced and table headers are suppressed when
             silent mode is in effect.
     --no-table-headers
[root@mq1 ~]# rabbitmqctl set_policy --help
Usage

rabbitmqctl [--node <node>] [--longnames] [--quiet] set_policy [--vhost <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
Sets or updates a policy.
Arguments and Options
<name>
        policy name (identifier)
<pattern>
        regular expression pattern that will be used to match queues, exchanges, etc
<definition>
        policy definition (arguments). Must be a valid JSON document
--priority <priority>
        policy priority

集群常用命令了解

1、加入集群[--ram添加内存模式 默认disk模式]
[root@mq1 ~]# rabbitmqctl join_cluster --ram rabbit@mq1

2、查看集群状态
[root@mq1 ~]# rabbitmqctl cluster_status
Running Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3

3、更改节点模式[顺序 关闭运用-〉更改类型->开启运用]
[root@mq1 ~]# rabbitmqctl stop_app  –停止运用服务
[root@mq1 ~]# rabbitmqctl start_app –开启运用服务
[root@mq1 ~]# rabbitmqctl change_cluster_node_type disc/ram –更改节点为磁盘或内存节点

4、创建策略(集群同步策略……)
[root@mq1 ~]# set_policy [-p vhostpath] {name} {pattern} {definition} [priority]

5、查看策略
[root@mq1 ~]# rabbitmqctl list_policies

6、移除远程offline的节点
1.节点2停掉应用
[root@mq1 ~]# rabbitmqctl stop_app 
2.节点1执行删除
[root@mq1 ~]# rabbitmqctl forget_cluster_node rabbit@mq2

7、设置集群名称
[root@mq1 ~]# rabbitmqctl set_cluster_name cluster_name

8、设置镜像模式
Rabbit提供镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为 
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
rabbitmqctl set_policy ha-all "^ha." "{""ha-mode"":""all""}"
rabbitmqctl set_policy ha-all "^" "{""ha-mode"":""all"",""ha-sync-mode"":""automatic""}"
rabbitmqctl set_policy -p demo  ha-all "^" "{""ha-mode"":""all"",""ha-sync-mode"":""automatic""}"

9、手动同步queue
[root@mq1 ~]# rabbitmqctl sync_queue name

10、取消queue同步
[root@mq1 ~]# rabbitmqctl cancel_sync_queue name

11、查看所有队列信息
[root@mq1 ~]# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name    messages
test1   0

12、获取队列信息
rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...]
Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,messages_unacknowledged,messages,consumers,memory。

13、获取Exchange信息
rabbitmqctl list_exchanges[-p vhostpath] [exchangeinfoitem ...]
Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments。
[root@mq1 ~]# rabbitmqctl list_exchanges -p / type     //    "/"默认的 vhost
Listing exchanges for vhost / ...
type
topic
headers
direct
direct
headers
topic
fanout

14、获取Binding信息
rabbitmqctl list_bindings[-p vhostpath] [bindinginfoitem ...] 
Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments。
[root@mq1 ~]# rabbitmqctl list_bindings
Listing bindings for vhost /...
source_name     source_kind     destination_name        destination_kind        routing_key     arguments
        exchange        test1   queue   test1   []

15、获取Connection信息
rabbitmqctl list_connections [connectioninfoitem ...]
Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。

16、获取Channel信息
rabbitmqctl list_channels[channelinfoitem ...]
Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值