通过自建镜像方式搭建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创建新用户,并给用户添加角色和授权

相关推荐
Microsoft Word40 分钟前
分布式数据库HBase
数据库·分布式·hbase
shepherd1111 小时前
从零搭建高可用Kafka集群与EFAK监控平台:全流程实战总结
分布式·后端·kafka
CXH7282 小时前
hadoop伪分布式部署
大数据·hadoop·分布式
敏君宝爸2 小时前
prometheus整合jmx_exporter 使用jmx_exporter监控Kafka
分布式·kafka·prometheus
IT成长日记3 小时前
【Kafka基础】生产者命令行操作指南:从基础到高级配置
分布式·kafka·生产者命令行
Familyism3 小时前
消息中间件篇——RabbitMQ,Kafka
分布式·kafka·rabbitmq
杰克逊的日记3 小时前
Kafka的生产者和消费者的关系
分布式·kafka
一切皆有迹可循10 小时前
SpringBoot整合MinIO快速入门:实现分布式文件存储与管理
spring boot·分布式·后端
朴拙数科11 小时前
gevent 高并发、 RabbitMQ 消息队列、Celery 分布式的案例和说明
分布式·rabbitmq·ruby
2401_8242568613 小时前
Spark Core编程
大数据·分布式·spark