通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群

  • [1. 应用准备](#1. 应用准备)
    • [1.1 应用目录结构](#1.1 应用目录结构)
    • [1.2 配置文件](#1.2 配置文件)
      • [1.2.1 .erlang.cookie](#1.2.1 .erlang.cookie)
      • [1.2.2 hosts](#1.2.2 hosts)
      • [1.2.3 rabbitmq.conf](#1.2.3 rabbitmq.conf)
      • [1.2.4 rabbitmq-env.conf](#1.2.4 rabbitmq-env.conf)
  • [2. 编写DockerFile](#2. 编写DockerFile)
    • [2.1 将所有本地文件拷贝到工作目录](#2.1 将所有本地文件拷贝到工作目录)
    • [2.2 拷贝文件到源目录&增加执行权限](#2.2 拷贝文件到源目录&增加执行权限)
    • [2.3 安装Erlang & rabbitmq-server](#2.3 安装Erlang & rabbitmq-server)
    • [2.4 暴露rabbitmq端口](#2.4 暴露rabbitmq端口)
    • [2.5 设置entrypoint](#2.5 设置entrypoint)
  • [3. 执行脚本](#3. 执行脚本)
    • [3.1 update_hosts.sh](#3.1 update_hosts.sh)
    • [3.2 start_rabbitmq.sh](#3.2 start_rabbitmq.sh)
      • [3.2.1 获取本机hostname](#3.2.1 获取本机hostname)
      • [3.2.2 设置环境变量](#3.2.2 设置环境变量)
      • [3.2.3 启动rabbitmq-server和rabbitmq_management](#3.2.3 启动rabbitmq-server和rabbitmq_management)
  • [4. 构建集群](#4. 构建集群)
    • [4.1 将node2,node3加入node1](#4.1 将node2,node3加入node1)
    • [4.2 创建用户、授权远程访问](#4.2 创建用户、授权远程访问)
  • [5. 验证](#5. 验证)
  • 参考

1. 应用准备

  • 需考虑rabbitmq-server和erlang版本的兼容性。参考which-erlang
  • Centos建议使用Centos8

1.1 应用目录结构

1.2 配置文件

1.2.1 .erlang.cookie

.erlang.cookie的要求

.erlang.cookie 文件是用于 Erlang 节点之间进行安全通信的共享秘钥文件。它的要求如下:

  1. 权限要求: 文件权限应该设置为只有对应用户可以读取和写入,通常设置为 400 或 600。

  2. 内容要求: 文件中应包含一个随机生成的字符串,通常是由系统生成的随机字符。这个字符串必须在集群中的所有节点上保持一致。

  3. 位置要求: 在运行RabbitMQ的每个节点上,.erlang.cookie 文件都必须位于相同的位置,并且文件内容必须相同。

确保这些要求可以确保Erlang节点之间的通信是安全的,同时也可以防止未经授权的节点加入集群。

对随机字符串的长度有要求吗?

对于 .erlang.cookie 文件中的随机字符串,Erlang

并没有明确规定其长度的要求。然而,建议生成一个足够长的随机字符串,通常建议长度在 20 到 40

个字符之间,以确保安全性。更长的字符串长度可以提供更高的安全性,但同时也需要确保在集群中所有节点上保持一致。

示例:

java 复制代码
ABCDEABCDEABCDEABCDE

1.2.2 hosts

该hosts文件内容会追加到容器的/etc/hosts文件,示例

java 复制代码
172.16.100.10  rabbitmq-node1
172.16.100.20  rabbitmq-node2
172.16.100.30  rabbitmq-node3

1.2.3 rabbitmq.conf

该配置文件用于rabbitmq集群的节点配置,示例

bash 复制代码
cluster_formation.classic_config.nodes.1=rabbit@rabbitmq-node1
cluster_formation.classic_config.nodes.2=rabbit@rabbitmq-node2
cluster_formation.classic_config.nodes.3=rabbit@rabbitmq-node3

1.2.4 rabbitmq-env.conf

该配置文件用于配置rabbitmq的环境变量配置,示例

bash 复制代码
# Specifies new style config file location
CONFIG_FILE=/export/App/rabbitmq/conf/rabbitmq.conf
# 日志文件根目录
RABBITMQ_LOG_BASE=/export/Logs/rabbitmq
# 默认用户
DEFAULT_USER=admin
# 默认密码
DEFAULT_PASS=your_password

2. 编写DockerFile

2.1 将所有本地文件拷贝到工作目录

bash 复制代码
# 文件拷贝:将所有本地文件拷贝到工作目录
COPY ./rabbitmq ${WORK_DIR}/rabbitmq

2.2 拷贝文件到源目录&增加执行权限

bash 复制代码
# 拷贝文件到源目录&增加执行权限
RUN mkdir ${SRC_APP_DIR}/rabbitmq && \
    cp -r ${WORK_DIR}/rabbitmq/* ${SRC_APP_DIR}/rabbitmq && \
    chmod +x ${SRC_APP_DIR}/rabbitmq/bin/start_rabbitmq.sh && \
    chmod +x ${SRC_APP_DIR}/rabbitmq/bin/update_host.sh && \
    chmod +x ${SRC_APP_DIR}/rabbitmq/app/rabbitmq-server-3.13.0-1.el8.noarch.rpm && \

2.3 安装Erlang & rabbitmq-server

bash 复制代码
# 安装Erlang & rabbitmq-server
	yum -y install epel-release && \
	yum -y install socat && \
	yum -y localinstall ${SRC_APP_DIR}/rabbitmq/app/erlang-26.2.3-1.el8.x86_64.rpm && \
	yum -y localinstall ${SRC_APP_DIR}/rabbitmq/app/rabbitmq-server-3.13.0-1.el8.noarch.rpm

2.4 暴露rabbitmq端口

bash 复制代码
# 暴露RabbitMQ端口
EXPOSE 5672 15672 25672

2.5 设置entrypoint

bash 复制代码
# 将SRC拷贝到TARGET目录
ENV COPY_EXPORT="cp -r -t $TGT_DIR $SRC_DIR/*"
# CHOWN
ENV CHOWN_ADMIN="chown -R $SYS_USER_GROUP:$SYS_USER $TGT_DIR $SRC_DIR"
# 增加hosts配置
ENV UPDATE_HOSTS="$TGT_APP_DIR/rabbitmq/bin/update_host.sh"
# 启动脚本
ENV START_RABBITMQ="$TGT_APP_DIR/rabbitmq/bin/start_rabbitmq.sh"

# 启动 RabbitMQ 服务
# 进入容器时默认执行的命令
ENTRYPOINT /usr/sbin/sshd && \
 /usr/sbin/crond && \
 echo $COPY_EXPORT && $COPY_EXPORT && \
 echo $CHOWN_ADMIN && $CHOWN_ADMIN && \
 echo $UPDATE_HOSTS && $UPDATE_HOSTS && \
 echo $START_RABBITMQ && $START_RABBITMQ && \
 sleep 9999999d

3. 执行脚本

3.1 update_hosts.sh

bash 复制代码
cat $TGT_APP_DIR/rabbitmq/conf/hosts >> /etc/hosts &

3.2 start_rabbitmq.sh

3.2.1 获取本机hostname

bash 复制代码
# 获取ip
container_ip=$(hostname -i)
echo container_ip:"$container_ip"
# 获取域名
container_domain_name=$(grep -w "$container_ip" $TGT_APP_DIR/rabbitmq/conf/hosts | awk '{print $2}')
# 如果域名不为空,设置变更域名
if [ -n "$container_domain_name" ]; then
  echo "IP $container_ip domain name: $container_domain_name"
  sudo hostname $container_domain_name
  domain_name=$container_domain_name
else
  # 如果域名为空,使用原先域名
  domain_name=$(hostname)
fi

3.2.2 设置环境变量

bash 复制代码
# RABBITMQ环境变量
export RABBITMQ_NODENAME=rabbit@$domain_name
export HOSTNAME=$domain_name
export RABBITMQ_CONFIG_FILE=$TGT_APP_DIR/rabbitmq/conf/rabbitmq.conf
export RABBITMQ_CONF_ENV_FILE=$TGT_APP_DIR/rabbitmq/conf/rabbitmq-env.conf

3.2.3 启动rabbitmq-server和rabbitmq_management

bash 复制代码
cp -f $TGT_APP_DIR/rabbitmq/conf/.erlang.cookie /var/lib/rabbitmq/
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
/usr/sbin/rabbitmq-server &
sleep 5
rabbitmq-plugins enable rabbitmq_management &

4. 构建集群

4.1 将node2,node3加入node1

bash 复制代码
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app

4.2 创建用户、授权远程访问

bash 复制代码
rabbitmqctl add_user <用户名> <密码>
rabbitmqctl set_user_tags <用户名> <角色>

支持的角色列表

  • administrator
  • management
  • policymaker
  • monitoring
  • none

5. 验证

访问 http://172.16.100.10:15672,输入用户名、密码。

参考

Clustering Guide
Cluster Formation and Peer Discovery
RabbitMQ Configuration
rabbitmq.conf.example
Environment Variable Interpolation in rabbitmq.conf
安装包下载地址
rabbitMQ配置文件
java rabbitmq新建项目 rabbitmq如何搭建集群 转载
RabbitMQ创建新用户,并给用户添加角色和授权

相关推荐
Bug退退退1235 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
prince056 小时前
Kafka 生产者和消费者高级用法
分布式·kafka·linq
菜萝卜子7 小时前
【Project】基于kafka的高可用分布式日志监控与告警系统
分布式·kafka
幼稚园的山代王14 小时前
RabbitMQ 4.1.1初体验-队列和交换机
分布式·rabbitmq·ruby
小新学习屋14 小时前
Spark从入门到熟悉(篇三)
大数据·分布式·spark
沉着的码农18 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
ZHOU_WUYI1 天前
一个简单的分布式追踪系统
分布式
码不停蹄的玄黓1 天前
MySQL分布式ID冲突详解:场景、原因与解决方案
数据库·分布式·mysql·id冲突
王小王-1231 天前
基于Hadoop的公共自行车数据分布式存储和计算平台的设计与实现
大数据·hive·hadoop·分布式·hadoop公共自行车·共享单车大数据分析·hadoop共享单车
要开心吖ZSH1 天前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring