单实例 RabbitMQ 切换高可用(镜像)队列模式
RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
在蓝鲸组件中,以下产品依赖 RabbitMQ 服务:
- PaaS 平台(需要注册 RabbitMQ 服务,提供给通过 PaaS 平台部署的 SaaS 用)
- 后台 Django 工程使用 celery 任务的 (节点管理、用户管理、监控平台等)
- 作业平台(job)
- 蓝盾(bkci)
本教程描述了如何在单机部署的蓝鲸社区版中将单点部署的 Rabbitmq 切换至高可用(镜像)队列模式。
1. 数据备份
1 | pcmd -m rabbitmq '(data_dir=$( rabbitmq-diagnostics status --formatter json | jq -r .data_directory ); mkdir -p /data/backup; cd ${data_dir%/*}; tar -czf /data/backup/rabbitmq-${LAN_IP}-backup-$(date +"%F-%H-%M-%S").tgz ${data_dir##*/}; ls -l /data/backup/rabbitmq-*tgz)' |
2. RabbitMQ 扩容
2.1. 存量节点启用集群发现(基于 Consul)
登陆 RabbitMQ 机器
1
ssh $BK_RABBITMQ_IP
启用集群发现插件(基于 Consul)
1
rabbitmq-plugins enable --offline rabbitmq_peer_discovery_consul
配置 Consul 集群发现
1
2
3
4
5
6
7
8
9
10
11
12cat <<EOF > /etc/rabbitmq/rabbitmq.conf
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_consul
cluster_formation.consul.host = localhost
cluster_formation.consul.port = 8500
cluster_formation.consul.scheme = http
cluster_formation.consul.svc = rabbitmq
cluster_formation.consul.svc_ttl = 40
cluster_formation.consul.deregister_after = 90
cluster_formation.consul.svc_addr_auto = true
cluster_formation.consul.svc_addr_use_nodename = true
cluster_formation.consul.use_longname = true
EOF重启服务
1
systemctl restart rabbitmq-server.service
确认服务状态
1
2
3
4systemctl status rabbitmq-server.service
dig +short rabbitmq.service.consul
## 预期输出为:已经部署 rabbitmq 机器的 ip
2.2. 准备机器:新增并初始化机器
- 机器准备
- 建议新增机器配置不低于 2C4G
以下初始化步骤以单个机器为例,如有多台扩容机器,请多次重复执行,注意替换机器 IP
以下操作在中控机执行,默认在 /data/install 下执行
配置新机器免密
1
ssh-copy-id <ip>
同步蓝鲸的 yum repo
1
rsync -av /etc/yum.repos.d/Blueking.repo root@<ip>:/etc/yum.repos.d/
在 install.config 中增加扩容的机器和模块定义
1
2
3cat >> install.config <<EOF
<ip> rabbitmq
EOF执行蓝鲸的机器初始化操作
1
2
3
4
5
6
7
8# 同步脚本至新机器
./bkcli sync common
# 执行初始化脚本
pcmd -H <ip>'/data/install/bin/init_new_node.sh'
# 确认新机器成功加入了 consul 集群,如果没有输出,可以再次重试
consul members | grep "<ip>:"
2.3. 模块扩容操作
如有多台扩容机器,一下操作请多次重复执行,注意替换机器 IP
以下操作在新增机器上执行,默认在 /data/install 下执行
登陆新增机器
1
ssh <ip>
安装 RabbitMQ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 安装rabbitmq及依赖
if ! rpm -ql rabbitmq-server-3.8.3 &>/dev/null; then
yum -q -y install socat
yum -q -y install rabbitmq-server-3.8.3
fi
# 创建目录并设置权限
install -o rabbitmq -g rabbitmq -d /data/bkce/public/rabbitmq
install -o rabbitmq -g rabbitmq -d /data/bkce/logs/rabbitmq
# 调整limits,根据:https://www.rabbitmq.com/configure.html#kernel-limits
install -d -m 755 -o root -g root /etc/systemd/system/rabbitmq-server.service.d/
echo '[Service]' > /etc/systemd/system/rabbitmq-server.service.d/limits.conf
echo 'LimitNOFILE=102400' >> /etc/systemd/system/rabbitmq-server.service.d/limits.conf
# 生成环境变量配置文件(主要用于重新定义各种路径)
cat <<EOF > /etc/rabbitmq/rabbitmq-env.conf
NODENAME=rabbit@${HOSTNAME%%.*}.node.consul
MNESIA_BASE=/data/bkce/public/rabbitmq
LOG_BASE=/data/bkce/logs/rabbitmq
USE_LONGNAME=true
EOF新增节点配置更新并启动服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 复制现有配置
rsync -av <存量节点IP>:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
rsync -av <存量节点IP>:/etc/logrotate.d/rabbitmq-server /etc/logrotate.d/rabbitmq-server
rsync -av <存量节点IP>:/etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
# 设置权限
chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie
# 启用集群发现
rabbitmq-plugins enable --offline rabbitmq_peer_discovery_consul
# 启动服务
systemctl enable --now rabbitmq-server
# 确认服务状态
systemctl status rabbitmq-server.service注册 Consul,在中控机上执行
1
2
3
4
5
6cd /data/install ; source utils.fc; source tools.sh
reg_consul_svc rabbitmq 5672 ${BK_RABBITMQ_IP_COMMA}
# 检查
dig +short rabbitmq.service.consul
## 预期输出所有部署了 rabbitmq 机器的 ip返回新增机器,确认集群状态
1
2
3
4
5
6
7# 检查集群节点数量
rabbitmqctl --longnames cluster_status --formatter json | jq -r .running_nodes[]
## 预期输出所有部署 rabbitmq 机器的主机名
# 检查存量数据是否存在:例如:vhost
rabbitmqctl list_vhosts
## 预期输出为:job、prod_bk_sops 等 vhosts 名称启用 ha policy
1
2
3for v in $( rabbitmqctl list_vhosts -q -s | xargs -n1 | sort -u ); do
rabbitmqctl set_policy ha-all '^' '{"ha-mode": "all","ha-sync-mode":"automatic"}' -p $v || echo $v
done
2.4. 注册蓝鲸业务拓扑
以 “Kafka” 为例:
- 打开“配置平台” > “蓝鲸” 业务 > 选中新增的机器 > 点击“追加至” > “业务模块”

- 选择“公共组件” > “kafka” > “下一步”

- 确认变更内容 > “确认追加”

3. 验证服务可用
例如:
- 作业平台 > 快速执行 > 脚本执行
- 标准运维 > 执行一个测试流程
单实例 RabbitMQ 切换高可用(镜像)队列模式