微服务架构师封神之路13-RabbitMQ集群与高可用|RabbitMQ clustering and HA

2024-02-23 09:44

本文主要是介绍微服务架构师封神之路13-RabbitMQ集群与高可用|RabbitMQ clustering and HA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

几个关键技术点

节点间相互验证,.erlang.cookie

nodename的唯一性

port冲突与配置

Management UI plugin安装

Queue(message)replicas

Queue leader strategy

配置文件详细

Node 1

Installation path

.erlang.cookie

rabbitmq-env.conf

rabbitmq.conf

enabled_plugins

Node 2

 Installation path

.erlang.cookie

rabbitmq-env.conf

rabbitmq.conf

enabled_plugins

Node 3

 Installation path

.erlang.cookie

rabbitmq-env.conf

rabbitmq.conf

enabled_plugins

Springboot连接与编程

application.yml

Queue and AnonymousQueue

Queue

AnonymousQueue


本文利用一台Linux示范三节点RabbitMQ集群。RabbitMQ版本:3.12.11.

重点:

  1. 关键技术点
    1. 节点间相互验证,.erlang.cookie
    2. nodename的唯一性
    3. port冲突与配置
    4. Management UI plugin安装
    5. Queue replicas
    6. Queue leader strategy
  2. 配置文件详细
  3. Springboot连接与编程

几个关键技术点

节点间相互验证,.erlang.cookie

.erlang.cookie是erlang框架实现分布式的必要文件。三节点集群需要每个节点的.erlang.cookie文件相同。文件的位置:$home/.erlang.cookie.

erlang安装之后文件就已经存在,如果使用三台不同的机器,需要将其中一台的文件拷贝三份。用一台机器做示范,我们不需要再做额外的动作。

nodename的唯一性

RabbitMQ的nodename有固定的格式<prefix>@<hostname>。hostname可以通过操作系统的hostname命令获得。prefix可以自己决定。但是集群中的nodename必须是唯一的。

如果是部署在不同的机器上,所有的hostname需要明确配置在/etc/hosts文件中。

nodename配置在rabbitmq-env.conf文件中。

port冲突与配置

部署在同一台机器上,需要解决三个端口的冲突。

  1. amqp通信端口5672 - 相关配置文件rabbitmq.conf or rabbitmq-env.conf
  2. management UI端口15672 - 相关配置文件rabbitmq.conf
  3. 内部管理Command Line Interface端口25672 - 相关配置文件rabbitmq-env.conf

Management UI plugin安装

信息要放在enabled_plugin文件中。这个文件要手工添加,插件在RabbitMQ第一次启动的时候初始化。

Queue(message)replicas

高可用需要同一条消息要同时复制到三个节点上面,这样应用连接的当前节点下线后,还可以从其它另外两个节点读取还未消费完的消息。没有replica,虽然Rabbitmq依然可用,但会有消息丢失的情况。

要实现消息node间复制,需要创建Queue的时候, queue type设置成Quorum。

两种方式:

  • 通过管理界面创建Queue

  • Java应用在启动的时候配置Queue
        Map QUEUE_ARGS = new HashMap<String,Object>();    QUEUE_ARGS.put("x-queue-type", "quorum");new Queue("queue_name", true, false, false, QUEUE_ARGS);

对于匿名Queue不能配置这个属性,当一个node down以后,应用会在新的节点重新创建临时Queue。可能产生message丢失的情况。

Queue leader strategy

在rabbitmq.conf中配置,两种client-local(by default)和balanced.

配置文件详细

Download rabbitmq package, rabbitmq-server-generic-unix-3.12.11.tar.xz. 解压后拷贝三份,作为三个node。

下面的文件除了.erlang.cookie都需要手动添加。

Node 1

Installation path

/opt/rabbitmq/rabbitmq-node-1

.erlang.cookie

$home/.erlang.cookie

rabbitmq-env.conf

File path: /opt/rabbitmq/rabbitmq-node-1/etc/rabbitmq/rabbitmq-env.conf

# Example rabbitmq-env.conf file entries. Note that the variables
# do not have the RABBITMQ_ prefix.
#
# Overrides node name
RABBITMQ_NODENAME=rabbitmq-node-1@DESKTOP-B5WANG# Specifies new style config file location
RABBITMQ_CONFIG_FILE=/opt/rabbitmq/rabbitmq-node-1/etc/rabbitmq/rabbitmq.conf# Specifies advanced config file location
# RABBITMQ_ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config# CLI port
RABBITMQ_DIST_PORT=25672

rabbitmq.conf

File path: /opt/rabbitmq/rabbitmq-node-1/etc/rabbitmq/rabbitmq.conf

# port
listeners.tcp.default = 5672
# listeners.tcp.1 = 0.0.0.0:5672# default user
default_vhost = /
default_user = admin
default_pass = admin
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write = .*
default_user_tags.administrator = true
default_user_tags.management = true
default_user_tags.custom_tag = true# management plugin
management.tcp.port = 15672
management.tcp.ip   = 0.0.0.0# cluster
cluster_name = rabbitmq-cluster
cluster_keepalive_interval = 10000
cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbitmq-node-1@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.2 = rabbitmq-node-2@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.3 = rabbitmq-node-3@DESKTOP-B5WANG# queue location strategy
queue_master_locator = client-local

enabled_plugins

File path: /opt/rabbitmq/rabbitmq-node-1/etc/rabbitmq/enabled_plugins

[rabbitmq_management].

Node 2

 Installation path

/opt/rabbitmq/rabbitmq-node-2

.erlang.cookie

$home/.erlang.cookie

rabbitmq-env.conf

File path: /opt/rabbitmq/rabbitmq-node-2/etc/rabbitmq/rabbitmq-env.conf

# Example rabbitmq-env.conf file entries. Note that the variables
# do not have the RABBITMQ_ prefix.
#
# Overrides node name
RABBITMQ_NODENAME=rabbitmq-node-2@DESKTOP-B5WANG# Specifies new style config file location
RABBITMQ_CONFIG_FILE=/opt/rabbitmq/rabbitmq-node-2/etc/rabbitmq/rabbitmq.conf# Specifies advanced config file location
# RABBITMQ_ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config# CLI port
RABBITMQ_DIST_PORT=25673

rabbitmq.conf

File path: /opt/rabbitmq/rabbitmq-node-2/etc/rabbitmq/rabbitmq.conf

# port
listeners.tcp.default = 5673
# listeners.tcp.1 = 0.0.0.0:5673# default user
default_vhost = /
default_user = admin
default_pass = admin
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write = .*
default_user_tags.administrator = true
default_user_tags.management = true
default_user_tags.custom_tag = true# management plugin
management.tcp.port = 15673
management.tcp.ip   = 0.0.0.0# cluster
cluster_name = rabbitmq-cluster
cluster_keepalive_interval = 10000
cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbitmq-node-1@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.2 = rabbitmq-node-2@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.3 = rabbitmq-node-3@DESKTOP-B5WANG# queue location strategy
queue_master_locator = client-local

enabled_plugins

File path: /opt/rabbitmq/rabbitmq-node-2/etc/rabbitmq/enabled_plugins

[rabbitmq_management].

Node 3

 Installation path

/opt/rabbitmq/rabbitmq-node-3

.erlang.cookie

$home/.erlang.cookie

rabbitmq-env.conf

File path: /opt/rabbitmq/rabbitmq-node-3/etc/rabbitmq/rabbitmq-env.conf

# Example rabbitmq-env.conf file entries. Note that the variables
# do not have the RABBITMQ_ prefix.
#
# Overrides node name
RABBITMQ_NODENAME=rabbitmq-node-3@DESKTOP-B5WANG# Specifies new style config file location
RABBITMQ_CONFIG_FILE=/opt/rabbitmq/rabbitmq-node-3/etc/rabbitmq/rabbitmq.conf# Specifies advanced config file location
# RABBITMQ_ADVANCED_CONFIG_FILE=/etc/rabbitmq/advanced.config# CLI port
RABBITMQ_DIST_PORT=25674

rabbitmq.conf

File path: /opt/rabbitmq/rabbitmq-node-3/etc/rabbitmq/rabbitmq.conf

# port
listeners.tcp.default = 5674
# listeners.tcp.1 = 0.0.0.0:5674# default user
default_vhost = /
default_user = admin
default_pass = admin
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write = .*
default_user_tags.administrator = true
default_user_tags.management = true
default_user_tags.custom_tag = true# management plugin
management.tcp.port = 15674
management.tcp.ip   = 0.0.0.0# cluster
cluster_name = rabbitmq-cluster
cluster_keepalive_interval = 10000
cluster_formation.peer_discovery_backend = classic_config
cluster_formation.classic_config.nodes.1 = rabbitmq-node-1@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.2 = rabbitmq-node-2@DESKTOP-B5WANG
cluster_formation.classic_config.nodes.3 = rabbitmq-node-3@DESKTOP-B5WANG# queue location strategy
queue_master_locator = client-local

enabled_plugins

File path: /opt/rabbitmq/rabbitmq-node-3/etc/rabbitmq/enabled_plugins

[rabbitmq_management].

Springboot连接与编程

application.yml

spring:rabbitmq:# Connect rabbitmq clusteraddresses: localhost:5672,localhost:5673,localhost:5674username: adminpassword: admin

Queue and AnonymousQueue

Queue

        Map arg = new HashMap<String,Object>();arg.put("x-queue-type", "quorum");arg.put("x-queue-leader-locator", "client-local");new Queue(QUEUE_NAME_TEXT_MESSAGE, true, false, false, arg);

AnonymousQueue

AnonymousQueue aq = new AnonymousQueue(new Base64UrlNamingStrategy("queue-prefix-"));

AnonymousQueue本质上还是Queue,只是属性不同。所以不需要配置quorum,否则应用会报错。

public class AnonymousQueue extends Queue {public AnonymousQueue() {this((Map)null);}public AnonymousQueue(Map<String, Object> arguments) {this(Base64UrlNamingStrategy.DEFAULT, arguments);}public AnonymousQueue(NamingStrategy namingStrategy) {this(namingStrategy, (Map)null);}public AnonymousQueue(NamingStrategy namingStrategy, Map<String, Object> arguments) {super(namingStrategy.generateName(), false, true, true, arguments);if (!this.getArguments().containsKey("x-queue-master-locator")) {this.setLeaderLocator("client-local");}}
}

这篇关于微服务架构师封神之路13-RabbitMQ集群与高可用|RabbitMQ clustering and HA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738222

相关文章

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,