单实例 RabbitMQ 切换高可用(镜像)队列模式

RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

在蓝鲸组件中,以下产品依赖 RabbitMQ 服务:

  • PaaS 平台(需要注册 RabbitMQ 服务,提供给通过 PaaS 平台部署的 SaaS 用)
  • 后台 Django 工程使用 celery 任务的 (节点管理、用户管理、监控平台等)
  • 作业平台(job)
  • 蓝盾(bkci)

本教程描述了如何在单机部署的蓝鲸社区版中将单点部署的 Rabbitmq 切换至高可用(镜像)队列模式。

1. 数据备份

1
2
3
4
5
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)'

## 预期的输出为:
# [1] 19:31:44 [SUCCESS] 10.0.32.13
# -rw-r--r-- 1 root root 2514989 Apr 19 19:31 /data/backup/rabbitmq-10.0.32.13-backup-2023-04-19-19-31-41.tgz

2. RabbitMQ 扩容

2.1. 存量节点启用集群发现(基于 Consul)

  1. 登陆 RabbitMQ 机器

    1
    ssh $BK_RABBITMQ_IP
  2. 启用集群发现插件(基于 Consul)

    1
    rabbitmq-plugins enable --offline rabbitmq_peer_discovery_consul
  3. 配置 Consul 集群发现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cat <<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
  4. 重启服务

    1
    systemctl restart rabbitmq-server.service
  5. 确认服务状态

    1
    2
    3
    4
    systemctl status rabbitmq-server.service

    dig +short rabbitmq.service.consul
    ## 预期输出为:已经部署 rabbitmq 机器的 ip

2.2. 准备机器:新增并初始化机器

  1. 机器准备
  • 建议新增机器配置不低于 2C4G

以下初始化步骤以单个机器为例,如有多台扩容机器,请多次重复执行,注意替换机器 IP

以下操作在中控机执行,默认在 /data/install 下执行

  1. 配置新机器免密

    1
    ssh-copy-id <ip>
  2. 同步蓝鲸的 yum repo

    1
    rsync -av /etc/yum.repos.d/Blueking.repo root@<ip>:/etc/yum.repos.d/
  3. 在 install.config 中增加扩容的机器和模块定义

    1
    2
    3
    cat >> install.config <<EOF
    <ip> rabbitmq
    EOF
  4. 执行蓝鲸的机器初始化操作

    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. 登陆新增机器

    1
    ssh <ip>
  2. 安装 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
  3. 新增节点配置更新并启动服务

    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
  4. 注册 Consul,在中控机上执行

    1
    2
    3
    4
    5
    6
    cd /data/install ; source utils.fc; source tools.sh
    reg_consul_svc rabbitmq 5672 ${BK_RABBITMQ_IP_COMMA}

    # 检查
    dig +short rabbitmq.service.consul
    ## 预期输出所有部署了 rabbitmq 机器的 ip
  5. 返回新增机器,确认集群状态

    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 名称
  6. 启用 ha policy

    1
    2
    3
    for 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” 为例:

  1. 打开“配置平台” > “蓝鲸” 业务 > 选中新增的机器 > 点击“追加至” > “业务模块”
  2. 选择“公共组件” > “kafka” > “下一步”
  3. 确认变更内容 > “确认追加”

3. 验证服务可用

例如:

  1. 作业平台 > 快速执行 > 脚本执行
  2. 标准运维 > 执行一个测试流程

单实例 RabbitMQ 切换高可用(镜像)队列模式

https://1.not.icu/Scale-up-Rabbitmq-cluster/

作者

Sony Dog

发布于

2023-04-18

更新于

2023-12-26

许可协议

CC BY-NC-SA 4.0