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

相关推荐
优秀的颜1 小时前
计算机基础知识(第五篇)
java·开发语言·分布式
棠十一8 小时前
Rabbitmq
分布式·docker·rabbitmq
陈暗暗8 小时前
rabbitMQ初入门
rabbitmq
懒虫虫~9 小时前
基于SpringBoot解决RabbitMQ消息丢失问题
spring boot·rabbitmq
Lansonli9 小时前
大数据Spark(六十一):Spark基于Standalone提交任务流程
大数据·分布式·spark
Theodore_102210 小时前
大数据(2) 大数据处理架构Hadoop
大数据·服务器·hadoop·分布式·ubuntu·架构
G探险者15 小时前
《深入理解 Nacos 集群与 Raft 协议》系列五:为什么集群未过半,系统就不可用?从 Raft 的投票机制说起
分布式·后端
G探险者15 小时前
《深入理解 Nacos 集群与 Raft 协议》系列一:为什么 Nacos 集群必须过半节点存活?从 Raft 协议说起
分布式·后端
G探险者15 小时前
《深入理解 Nacos 集群与 Raft 协议》系列四:日志复制机制:Raft 如何确保提交可靠且幂等
分布式·后端
G探险者15 小时前
《深入理解 Nacos 集群与 Raft 协议》系列三:日志对比机制:Raft 如何防止数据丢失与错误选主
分布式·后端