ZooKeeper 单点切换至集群

Apache ZooKeeper 是 Apache 软件基金会的一个软件项目,为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。

蓝鲸后台产品中,使用到 Zookeeper 的有:

  • cmdb 用作服务发现
  • gse 用作服务发现和 dataid 数据存储
  • 蓝鲸监控 metadata 后台 读取 gse 的 dataid 数据部分

本教程描述了如何在单机部署的蓝鲸社区版中将单点部署的 Zookeeper 切换至集群模式。一个 Zookeeper 集群至少需要三台机器,所以新增节点数必须为偶数,至少增加两台机器。

1. 备份

1
2
3
4
5
6
7
pcmd -m zk '(mkdir -p /data/backup; cd /var/lib; tar -czf /data/backup/zk-${LAN_IP}-backup-$(date +"%F-%H-%M-%S").tgz zookeeper; ls -l /data/backup/zk*tgz)'

# 输出如:
# pcmd -m zk '(mkdir -p /data/backup; cd /var/lib; tar -czf /data/backup/zk-${LAN_IP}-backup-$(date +"%F-%H-%M-%S").tgz zookeeper; ls -l /data/backup/zk*tgz)'
# [1] 16:17:57 [SUCCESS] 10.0.32.13
# -rw-r--r-- 1 root root 9882539 Apr 1 16:12 /data/backup/zk-10.0.32.13-backup-2023-04-01-16-12-47.tgz

2. zookeeper 单点切换至集群

  • 该标准运维流程适用于:单/多节点副本集集群新增节点

2.1. 使用标准运维流程扩容

  • 该标准运维流程适用于:单/多节点副本集集群新增节点

2.1.1. 前置准备

  1. 机器准备
  • 建议新增机器配置不低于 2C4G
  1. 实现免密
    开始部署前,请确保新增主机跟中控机已实现免密。

    1
    ssh-copy-id <ip>
  2. 请先前往节点管理,对新增主机进行 agent 安装

  3. 将需要部署产品的标准运维流程模版导入至标准运维
    标准运维流程模版 下载
    详细步骤: 打开标准运维 -> 流程 -> 项目流程 -> 导入YAML -> 点击上传 -> 导入

2.1.2. 执行扩容操作

  1. 选择流程 “[ce][scale]zookeeper” 流程模版进行新建任务,根据提示填写相关信息。确认填写信息无误后,开始执行任务。
  2. 点击下一步进入到“参数信息”填写页,按需填入参数

2.2. 手动单步扩容

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

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

以下初始化步骤以单个机器为例,如有多台扩容机器,请多次重复执行,注意替换机器 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> zk(config)
    EOF
  4. 执行蓝鲸的机器初始化操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 同步脚本至新机器
    ./bkcli sync common

    # 执行初始化脚本
    pcmd -H <ip>'/data/install/bin/init_new_node.sh'

    # 确认新机器成功加入了 consul 集群,如果没有输出,可以再次重试
    consul members | grep "<ip>:"

    # 同步 java8 安装包
    ./sync.sh zk /data/src/java8.tgz /data/src

2.2.2. 模块扩容

如有多台扩容机器,一下操作请多次重复执行,注意替换机器 IP
以下操作在新增机器上执行,默认在 /data/install 下执行

  1. 登陆新增机器

    1
    ssh <ip>
  2. 安装 JAVA

    1
    /data/install/bin/install_java.sh -p /data/install -f /data/src/java8.tgz
  3. 安装 zookeeper

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 默认数据目录
    DATA_DIR="/var/lib/zookeeper"

    # 安装 zookeeper
    if ! rpm -ql zookeeper &>/dev/null; then
    yum -y install zookeeper
    fi

    # 创建 data_dir
    install -d -m 755 -o zookeeper -g zookeeper "$DATA_DIR"

    # 修改JMX监听本地回环地址
    if [[ -f /etc/sysconfig/zookeeper ]]; then
    sed -i '/^JMXLOCALONLY/s/false/true/' /etc/sysconfig/zookeeper
    fi

    # 复制现有 zk 的 zookeeper 配置
    rsync -av <现有 zk 的 ip>:/etc/zookeeper/zoo.cfg /etc/zookeeper/zoo.cfg

    # 删除配置中 server.<n> 定义
    sed -i '/^server.*/d' /etc/zookeeper/zoo.cfg

    # 更新 zoo.cfg 中的数据目录
    sed -i '#^dataDir#s#^dataDir=.*#'"dataDir=$DATA_DIR"'#' /etc/zookeeper/zoo.cfg

    chown root.zookeeper -R /etc/zookeeper
    chmod 750 /etc/zookeeper/*
  4. 节点配置更新

    以下操作在新增节点上执行,默认在 /data/install 下执行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # zookeeper peer port
    PEER_PORT=2888

    # zookeeper election port
    ELECTION_PORT=3888

    # update bind address
    source /etc/blueking/env/local.env
    sed -i '/^clientPortAddress=/s/^clientPortAddress=.*/clientPortAddress='"$LAN_IP"'/' /etc/zookeeper/zoo.cfg

    # 编辑 zoo.cfg 文件并写入 server.<n> 定义
    ## 将输出写入 /etc/zookeeper/zoo.cfg 底部
    X=(<现有 zk 的 ip> <新增 zk 的 ip1> <新增 zk 的 ip2>)
    for ((i=0; i<${#X[@]}; i++)); do
    id=$((i+1))
    printf "server.%d=%s:%d:%d\n" "$id" "${X[$i]}" "$PEER_PORT" "$ELECTION_PORT"
    done

    # 编辑 myid 文件并写入 server id
    ## 手动获取 id ,执行第一个命令,输出规则为: server.id=host:port:port,人工找出与本机 ip 相关联的 id,并写入 myid 文件中
    grep '^server' /etc/zookeeper/zoo.cfg
    echo -n "<id>" > "$DATA_DIR"/myid
    chown root.zookeeper "$DATA_DIR"/myid

2.2.3. 旧节点配置更新

以下操作在旧节点上执行,默认在 /data/install 下执行

  1. 配置更新
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # zookeeper peer port
    PEER_PORT=2888

    # zookeeper election port
    ELECTION_PORT=3888

    # update bind address
    source /etc/blueking/env/local.env
    sed -i '/^clientPortAddress=/s/^clientPortAddress=.*/clientPortAddress='"$LAN_IP"'/' /etc/zookeeper/zoo.cfg

    # 编辑 zoo.cfg 文件并写入 server.<n> 定义
    ## 将输出写入 /etc/zookeeper/zoo.cfg 底部
    X=(<现有 zk 的 ip> <新增 zk 的 ip1> <新增 zk 的 ip2>)
    for ((i=0; i<${#X[@]}; i++)); do
    id=$((i+1))
    printf "server.%d=%s:%d:%d\n" "$id" "${X[$i]}" "$PEER_PORT" "$ELECTION_PORT"
    done

2.2.4. 重启 zk 服务

  1. 先重启现有节点的 zk 服务,加载其他新增节点信息,避免数据丢失

    1
    2
    3
    4
    systemctl restart zookeeper

    # 确认服务状态
    systemctl status zookeeper
  2. 逐台启动新增节点的 zk 服务

    1
    2
    3
    4
    systemctl enable --now zookeeper

    # 确认服务状态
    systemctl status zookeeper

2.2.5. 注册 consul:zk.service.consul

1
2
3
4
5
6
cd /data/install ; source utils.fc; source tools.sh
reg_consul_svc zk 2181 "${BK_ZK_IP_COMMA}"

# 检查
dig +short zk.service.consul
## 预期输出所有部署了 zookeeper 机器的 ip

3. 同步变更项

  • 使用、涉及到 zookeeper 的蓝鲸模块有:gse-server、gse-agent、cmdb、bknodeman(接入点配置)
  • 如何同步变更:
    1. gse-server、cmdb:配置中默认渲染 zk host 为 zk.service.consul,如果没有手动设置过 zk host 无需变更
    2. bknodeman(接入点配置):打开节点管理 SaaS -> 全局配置 -> 修改接入点配置
    3. gse-agent:理论上无影响,可以不更新配置。如需更新,请前往节点管理:选中需要更新配置的 agent,选择重载配置

4. 注册蓝鲸业务拓扑

以 “Kafka” 为例:

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

ZooKeeper 单点切换至集群

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

作者

Sony Dog

发布于

2023-04-11

更新于

2023-12-26

许可协议

CC BY-NC-SA 4.0