通过自建镜像方式搭建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 节点之间进行安全通信的共享秘钥文件。它的要求如下:
权限要求: 文件权限应该设置为只有对应用户可以读取和写入,通常设置为 400 或 600。
内容要求: 文件中应包含一个随机生成的字符串,通常是由系统生成的随机字符。这个字符串必须在集群中的所有节点上保持一致。
位置要求: 在运行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创建新用户,并给用户添加角色和授权