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。