通過自建鏡像方式搭建RabbitMQ集群
- 1. 應用準備
- 1.1 應用目錄結構
- 1.2 配置文件
- 1.2.1 .erlang.cookie
- 1.2.2 hosts
- 1.2.3 rabbitmq.conf
- 1.2.4 rabbitmq-env.conf
- 2. 編寫DockerFile
- 2.1 將所有本地文件拷貝到工作目錄
- 2.2 拷貝文件到源目錄&增加執行權限
- 2.3 安裝Erlang & rabbitmq-server
- 2.4 暴露rabbitmq端口
- 2.5 設置entrypoint
- 3. 執行腳本
- 3.1 update_hosts.sh
- 3.2 start_rabbitmq.sh
- 3.2.1 獲取本機hostname
- 3.2.2 設置環境變量
- 3.2.3 啟動rabbitmq-server和rabbitmq_management
- 4. 構建集群
- 4.1 將node2,node3加入node1
- 4.2 創建用戶、授權遠程訪問
- 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
個字符之間,以確保安全性。更長的字符串長度可以提供更高的安全性,但同時也需要確保在集群中所有節點上保持一致。
示例:
ABCDEABCDEABCDEABCDE
1.2.2 hosts
該hosts文件內容會追加到容器的/etc/hosts文件,示例
172.16.100.10 rabbitmq-node1
172.16.100.20 rabbitmq-node2
172.16.100.30 rabbitmq-node3
1.2.3 rabbitmq.conf
該配置文件用于rabbitmq集群的節點配置,示例
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的環境變量配置,示例
# 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 將所有本地文件拷貝到工作目錄
# 文件拷貝:將所有本地文件拷貝到工作目錄
COPY ./rabbitmq ${WORK_DIR}/rabbitmq
2.2 拷貝文件到源目錄&增加執行權限
# 拷貝文件到源目錄&增加執行權限
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
# 安裝Erlang & rabbitmq-serveryum -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端口
# 暴露RabbitMQ端口
EXPOSE 5672 15672 25672
2.5 設置entrypoint
# 將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
cat $TGT_APP_DIR/rabbitmq/conf/hosts >> /etc/hosts &
3.2 start_rabbitmq.sh
3.2.1 獲取本機hostname
# 獲取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" ]; thenecho "IP $container_ip domain name: $container_domain_name"sudo hostname $container_domain_namedomain_name=$container_domain_name
else# 如果域名為空,使用原先域名domain_name=$(hostname)
fi
3.2.2 設置環境變量
# 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
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
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app
4.2 創建用戶、授權遠程訪問
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創建新用戶,并給用戶添加角色和授權