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

相关推荐
Xua30551 小时前
MQ高级:RabbitMQ小细节
rabbitmq
极客先躯3 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
Yvemil74 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
niu_sama4 小时前
仿RabbitMQ实现消息队列三种主题的调试及源码
分布式·rabbitmq
鸡c4 小时前
rabbitMq------客户端模块
分布式·rabbitmq·ruby
Dylanioucn5 小时前
【分布式微服务云原生】探索Redis:数据结构的艺术与科学
数据结构·redis·分布式·缓存·中间件
路上^_^5 小时前
00_概览_kafka
分布式·kafka
极客先躯12 小时前
Hadoop krb5.conf 配置详解
大数据·hadoop·分布式·kerberos·krb5.conf·认证系统
CopyLower13 小时前
Kafka 消费者状态及高水位(High Watermark)详解
分布式·kafka
2301_7869643614 小时前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase