玩转Rabbitmq集群

Rabbitmq集群模式

  1. 集群模式
  • 单一模式:即单机情况不做集群,就单独运行一个rabbitmq而已。

  • 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),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. 节点类型
  • RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
  • Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

一、单机模式

二、主从模式

以下为执行脚本,在Docker Desktop上测试

PS D:\DockerWorkSpace\Rabbitmq> docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.9-management
Unable to find image 'rabbitmq:3.8.9-management' locally
3.8.9-management: Pulling from library/rabbitmq
f22ccc0b8772: Pull complete
3cf8fb62ba5f: Pull complete
e80c964ece6a: Pull complete
c1d2d6c5864b: Pull complete
0adcf6f8f5f2: Pull complete
6d7425e3abe0: Pull complete
b03e46685eee: Pull complete
f83c4b83a829: Pull complete
fab4bdeccdff: Pull complete
02221abafa2c: Pull complete
dc99d1ab69f5: Pull complete
1cda7b9728bf: Pull complete
3e49b6421e30: Pull complete
Digest: sha256:4ed4f6471c52b1e79250cf019e8c49bb1548021df85b203fbbb637caf44bfddc
Status: Downloaded newer image for rabbitmq:3.8.9-management
0c66e7e322eacc153811725a11cbdfae658500174a8dbd8b75b86f24338ade9d
PS D:\DockerWorkSpace\Rabbitmq> docker run -d --hostname rabbit2 --name myrabbit2 -p 15673:15672 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.9-management
2d2913b69b17ec75951f8eb16c3fa2ee1d88997e2240ed7771aedd8abe0d643a
PS D:\DockerWorkSpace\Rabbitmq> docker run -d --hostname rabbit3 --name myrabbit3 -p 15674:15672 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.9-management
f6970a05ac2fb00829a6e6ea51a18bff04d6ee40cc6edcb2b96ccb117d2fd23d
PS D:\DockerWorkSpace\Rabbitmq> docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                PORTS                                                                                                         NAMES
c0f9267f821e   rabbitmq:3.8.9-management   "docker-entrypoint.s…"   About a minute ago   Up About a minute     4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, 0.0.0.0:15674->15672/tcp   myrabbit3
e1c9c63ffb07   rabbitmq:3.8.9-management   "docker-entrypoint.s…"   About a minute ago   Up About a minute     4369/tcp, 5671/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp   myrabbit2
ce90868fc1b9   rabbitmq:3.8.9-management   "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes          4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   myrabbit1
2f5057d9d4cf   daprio/dapr:1.8.0           "./placement"            3 months ago         Up 4 days             0.0.0.0:6050->50005/tcp                                                                                       dapr_placement
278db8178145   openzipkin/zipkin           "start-zipkin"           3 months ago         Up 4 days (healthy)   9410/tcp, 0.0.0.0:9411->9411/tcp                                                                              dapr_zipkin
a8d95871d082   redis                       "docker-entrypoint.s…"   3 months ago         Up 4 days             0.0.0.0:6379->6379/tcp                                                                                        dapr_redis
PS D:\DockerWorkSpace\Rabbitmq> docker exec -it myrabbit1 bash
root@rabbit1:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@rabbit1 ...
root@rabbit1:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@rabbit1 ...
root@rabbit1:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@rabbit1 ...
root@rabbit1:/# rabbitmqctl status
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Status of node rabbit@rabbit1 ...
Runtime

OS PID: 329
OS: Linux
Uptime (seconds): 359
Is under maintenance?: false
RabbitMQ version: 3.8.9
Node name: rabbit@rabbit1
Erlang configuration: Erlang/OTP 23 [erts-11.1.6] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:96]
Erlang processes: 559 used, 1048576 limit
Scheduler run queue: 1
Cluster heartbeat timeout (net_ticktime): 60

Plugins

Enabled plugin file: /etc/rabbitmq/enabled_plugins
Enabled plugins:

 * rabbitmq_prometheus
 * prometheus
 * rabbitmq_management
 * amqp_client
 * rabbitmq_web_dispatch
 * cowboy
 * cowlib
 * rabbitmq_management_agent

Data directory

Node data directory: /var/lib/rabbitmq/mnesia/rabbit@rabbit1
Raft data directory: /var/lib/rabbitmq/mnesia/rabbit@rabbit1/quorum/rabbit@rabbit1

Config files

 * /etc/rabbitmq/rabbitmq.conf

Log file(s)

 * <stdout>

Alarms

(none)

Memory

Total memory used: 0.1336 gb
Calculation strategy: rss
Memory high watermark setting: 0.4 of available memory, computed to: 5.3123 gb

code: 0.0326 gb (24.39 %)
other_proc: 0.0313 gb (23.46 %)
other_system: 0.027 gb (20.23 %)
allocated_unused: 0.0262 gb (19.63 %)
plugins: 0.0087 gb (6.54 %)
other_ets: 0.0032 gb (2.38 %)
reserved_unallocated: 0.0024 gb (1.81 %)
atom: 0.0015 gb (1.09 %)
metrics: 0.0002 gb (0.16 %)
mgmt_db: 0.0002 gb (0.12 %)
binary: 0.0001 gb (0.08 %)
mnesia: 0.0001 gb (0.06 %)
quorum_ets: 0.0 gb (0.04 %)
msg_index: 0.0 gb (0.02 %)
connection_other: 0.0 gb (0.0 %)
connection_channels: 0.0 gb (0.0 %)
connection_readers: 0.0 gb (0.0 %)
connection_writers: 0.0 gb (0.0 %)
queue_procs: 0.0 gb (0.0 %)
queue_slave_procs: 0.0 gb (0.0 %)
quorum_queue_procs: 0.0 gb (0.0 %)

File Descriptors

Total: 2, limit: 1048479
Sockets: 0, limit: 943629

Free Disk Space

Low free disk space watermark: 0.05 gb
Free disk space: 234.6574 gb

Totals

Connection count: 0
Queue count: 0
Virtual host count: 1

Listeners

Interface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
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
root@rabbit1:/# exit
exit
PS D:\DockerWorkSpace\Rabbitmq> docker exec -it myrabbit2 bash
root@rabbit2:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@rabbit2 ...
root@rabbit2:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@rabbit2 ...
root@rabbit2:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node rabbit@rabbit2 with rabbit@rabbit1
root@rabbit2:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@rabbit2 ...
root@rabbit2:/# exit
exit
PS D:\DockerWorkSpace\Rabbitmq> docker exec -it myrabbit3 bash
root@rabbit3:/# rabbitmqctl stop_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Stopping rabbit application on node rabbit@rabbit3 ...
root@rabbit3:/# rabbitmqctl reset
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Resetting node rabbit@rabbit3 ...
root@rabbit3:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Clustering node rabbit@rabbit3 with rabbit@rabbit1
root@rabbit3:/# rabbitmqctl start_app
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Starting node rabbit@rabbit3 ...
root@rabbit3:/# rabbitmqctl status
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Status of node rabbit@rabbit3 ...
Runtime

OS PID: 329
OS: Linux
Uptime (seconds): 718
Is under maintenance?: false
RabbitMQ version: 3.8.9
Node name: rabbit@rabbit3
Erlang configuration: Erlang/OTP 23 [erts-11.1.6] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:96]
Erlang processes: 561 used, 1048576 limit
Scheduler run queue: 1
Cluster heartbeat timeout (net_ticktime): 60

Plugins

Enabled plugin file: /etc/rabbitmq/enabled_plugins
Enabled plugins:

 * rabbitmq_prometheus
 * prometheus
 * rabbitmq_management
 * amqp_client
 * rabbitmq_web_dispatch
 * cowboy
 * cowlib
 * rabbitmq_management_agent

Data directory

Node data directory: /var/lib/rabbitmq/mnesia/rabbit@rabbit3
Raft data directory: /var/lib/rabbitmq/mnesia/rabbit@rabbit3/quorum/rabbit@rabbit3

Config files

 * /etc/rabbitmq/rabbitmq.conf

Log file(s)

 * <stdout>

Alarms

(none)

Memory

Total memory used: 0.1338 gb
Calculation strategy: rss
Memory high watermark setting: 0.4 of available memory, computed to: 5.3123 gb

other_proc: 0.0343 gb (25.61 %)
code: 0.0326 gb (24.35 %)
other_system: 0.0271 gb (20.27 %)
allocated_unused: 0.0193 gb (14.43 %)
reserved_unallocated: 0.0095 gb (7.13 %)
plugins: 0.0056 gb (4.21 %)
other_ets: 0.0032 gb (2.39 %)
atom: 0.0015 gb (1.09 %)
metrics: 0.0002 gb (0.16 %)
mgmt_db: 0.0002 gb (0.12 %)
binary: 0.0002 gb (0.11 %)
mnesia: 0.0001 gb (0.06 %)
quorum_ets: 0.0 gb (0.04 %)
msg_index: 0.0 gb (0.02 %)
connection_other: 0.0 gb (0.0 %)
connection_channels: 0.0 gb (0.0 %)
connection_readers: 0.0 gb (0.0 %)
connection_writers: 0.0 gb (0.0 %)
queue_procs: 0.0 gb (0.0 %)
queue_slave_procs: 0.0 gb (0.0 %)
quorum_queue_procs: 0.0 gb (0.0 %)

File Descriptors

Total: 2, limit: 1048479
Sockets: 0, limit: 943629

Free Disk Space

Low free disk space watermark: 0.05 gb
Free disk space: 234.5894 gb

Totals

Connection count: 0
Queue count: 0
Virtual host count: 1

Listeners

Interface: [::], port: 15672, protocol: http, purpose: HTTP API
Interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
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
root@rabbit3:/# rabbitmqctl cluster_status
RABBITMQ_ERLANG_COOKIE env variable support is deprecated and will be REMOVED in a future version. Use the $HOME/.erlang.cookie file or the --erlang-cookie switch instead.
Cluster status of node rabbit@rabbit3 ...
Basics

Cluster name: rabbit@rabbit3

Disk Nodes

rabbit@rabbit1

RAM Nodes

rabbit@rabbit2
rabbit@rabbit3

Running Nodes

rabbit@rabbit1
rabbit@rabbit2
rabbit@rabbit3

Versions

rabbit@rabbit1: RabbitMQ 3.8.9 on Erlang 23.2.2
rabbit@rabbit2: RabbitMQ 3.8.9 on Erlang 23.2.2
rabbit@rabbit3: RabbitMQ 3.8.9 on Erlang 23.2.2

Maintenance status

Node: rabbit@rabbit1, status: not under maintenance
Node: rabbit@rabbit2, status: not under maintenance
Node: rabbit@rabbit3, status: not under maintenance

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@rabbit1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbit1, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
Node: rabbit@rabbit1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbit2, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
Node: rabbit@rabbit2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbit3, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbit3, interface: [::], port: 15692, protocol: http/prometheus, purpose: Prometheus exporter API over HTTP
Node: rabbit@rabbit3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbit3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0

Feature flags

Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
root@rabbit3:/# exit
exit
PS D:\DockerWorkSpace\Rabbitmq>

访问http://localhost:15672/#/或http://localhost:15673/#/或http://localhost:15674/#/,用户名密码均为guest

三、镜像模式

posted @ 2022-11-07 10:01  Nine4酷  阅读(104)  评论(0编辑  收藏  举报