bookie重启后报错

Bookie 启动报错分析与解决

从你提供的 BookKeeper 启动日志来看,Bookie 启动失败的原因是 Cookie 不匹配,具体的错误信息如下:

复制代码
2025-04-08T06:03:22,839 - ERROR - [main:Main@218] - Failed to build bookie server
org.apache.bookkeeper.bookie.BookieException$InvalidCookieException: Cookie [5
bookieHost: "10.244.105.46:3181"
journalDir: "/data/bookkeeper/journal"
ledgerDirs: "1\t/data/bookkeeper/ledgers"
instanceId: "67fe1c93-6e1a-40d2-be77-feac8d3a0853"
indexDirs: "1\t/data/bookkeeper/ledgers"
] is not matching with [5
bookieHost: "10.244.105.19:3181"
journalDir: "/data/bookkeeper/journal"
ledgerDirs: "1\t/data/bookkeeper/ledgers"
instanceId: "67fe1c93-6e1a-40d2-be77-feac8d3a0853"
indexDirs: "1\t/data/bookkeeper/ledgers"
]

问题分析

1. 错误原因

  • BookKeeper 使用 Cookie 来标识和验证 Bookie 的身份。Cookie 文件存储在 Bookie 的元数据目录(通常是 journalDir 和 ledgerDirs 中),并记录了 Bookie 的主机地址(bookieHost)、存储目录等信息。
  • 启动时,BookKeeper 会将当前配置生成的 Cookie 与存储在磁盘上的 Cookie 进行对比。如果两者不匹配,就会抛出 InvalidCookieException。
  • 从日志中可以看到:
    • 磁盘上的 Cookie :bookieHost: "10.244.105.46:3181"
    • 当前配置的 Cookie :bookieHost: "10.244.105.19:3181"
    • 两个 Cookie 的 bookieHost 地址不同(10.244.105.46 vs 10.244.105.19),导致验证失败。

2. 可能的触发场景

  • IP 地址变更 :Bookie 之前运行在 10.244.105.46,现在运行在 10.244.105.19(可能是由于网络配置更改、容器重启、Pod 迁移等)。
  • 数据目录复用 :你尝试在新节点上使用旧节点的存储目录(/data/bookkeeper/journal 和 /data/bookkeeper/ledgers),但没有更新 Cookie。
  • 配置错误 :bookkeeper.conf 中的 bookiePort 或 advertisedAddress 与之前记录的不一致。

3. 影响

  • BookKeeper 要求 Cookie 一致,以确保数据的完整性和避免同一存储目录被多个 Bookie 实例误用。由于 Cookie 不匹配,Bookie 无法启动。

解决步骤

1. 确认问题来源

  • 检查当前 Bookie 的运行环境:

    bash 复制代码
    hostname -i

    或:

    bash 复制代码
    ip addr

    确认当前节点的 IP 是否为 10.244.105.19。

  • 检查 bookkeeper.conf 中的配置:

    • bookiePort:默认是 3181。
    • advertisedAddress:是否明确指定了 10.244.105.19。
    • ledgerDir 和 journalDir:是否复用了其他节点的存储目录。

2. 解决方法

根据实际情况选择以下方案:

如果存储目录(/data/bookkeeper/journal 和 /data/bookkeeper/ledgers)需要继续使用,且数据是有效的,可以手动更新 Cookie 文件:

  1. 找到 Cookie 文件 :

    • Cookie 文件通常位于 journalDir 和 ledgerDirs 中的 current/VERSION 文件。

    • 示例路径:

      复制代码
      /data/bookkeeper/journal/current/VERSION
      /data/bookkeeper/ledgers/current/VERSION
  2. 备份现有 Cookie :

    bash 复制代码
    cp /data/bookkeeper/journal/current/VERSION /data/bookkeeper/journal/current/VERSION.bak
    cp /data/bookkeeper/ledgers/current/VERSION /data/bookkeeper/ledgers/current/VERSION.bak
  3. 删除旧 Cookie :

    bash 复制代码
    rm /data/bookkeeper/journal/current/VERSION
    rm /data/bookkeeper/ledgers/current/VERSION
  4. 重新启动 Bookie :

    bash 复制代码
    bin/bookkeeper bookie

    Bookie 启动时会自动生成新的 Cookie,基于当前配置(10.244.105.19:3181)。

Asc 2:清空并重新初始化存储目录

如果存储目录中的数据可以丢弃(例如测试环境或数据已备份),可以清空目录并重新初始化:

  1. 停止 Bookie(如果仍在运行)。

  2. 清空存储目录 :

    bash 复制代码
    rm -rf /data/bookkeeper/journal/*
    rm -rf /data/bookkeeper/ledgers/*
  3. 重新启动 Bookie :

    bash 复制代码
    bin/bookkeeper bookie

    Bookie 会创建一个新的 Cookie 并初始化存储目录。

如果需要保留旧数据,且希望当前 Bookie 使用 10.244.105.46:3181 的身份:

  1. 修改 bookkeeper.conf :
    添加或修改:

    conf 复制代码
    advertisedAddress=10.244.105.46
    bookiePort=3181
  2. 重启 Bookie :

    bash 复制代码
    bin/bookkeeper bookie

    确保当前节点的网络配置允许绑定 10.244.105.46(可能需要调整网络设置)。

方案 4:格式化 Bookie(谨慎使用)

如果需要彻底重置 Bookie,可以使用 bookieformat 命令格式化:

  1. 格式化命令 :

    bash 复制代码
    bin/bookkeeper shell bookieformat -nonInteractive -force
  2. 重启 Bookie :

    bash 复制代码
    bin/bookkeeper bookie

    警告:此操作会删除所有 Ledger 数据,仅适用于不需要保留数据的情况。


推荐方案

  • 如果你在 Kubernetes 或容器化环境中运行 BookKeeper(如日志中的 my-zk.default.svc.cluster.local 表明可能是 Kubernetes),IP 地址变化很常见(Pod 重启后 IP 可能变化)。建议:

    1. 使用 方案 1(更新 Cookie),保留数据并适应新 IP。
    2. 在 bookkeeper.conf 中设置固定的 advertisedAddress(如果环境允许),避免 IP 变化导致的问题。
  • 如果是全新环境或数据不重要,直接使用 方案 2(清空目录)最简单。


预防措施

  1. 固定 advertisedAddress :

    在 bookkeeper.conf 中明确指定 advertisedAddress,避免依赖动态 IP:

    conf 复制代码
    advertisedAddress=<stable-hostname-or-ip>

    例如:

    conf 复制代码
    advertisedAddress=my-bookie-0.my-bookie-headless.default.svc.cluster.local
  2. 持久化存储 :

    在容器化环境中,使用持久卷(Persistent Volume)存储 journalDir 和 ledgerDirs,并确保每个 Bookie 实例有唯一的存储路径。

  3. 检查 ZooKeeper :

    确保 ZooKeeper 中的 Bookie 注册信息与当前实例一致:

    bash 复制代码
    bin/bookkeeper shell meta

验证启动

成功启动后,日志中应看到:

复制代码
2025-04-08TXX:XX:XX,XXX - INFO - [main:Bookie@XXX] - Bookie started successfully

可以通过以下命令验证:

bash 复制代码
bin/bookkeeper shell bookieinfo

如果仍有问题,请提供 bookkeeper.conf 的内容或更详细的日志,我可以进一步协助你排查!

相关推荐
谢亮_vipxieliang2 小时前
Kubernetes 的“操作系统化”:从容器编排到 AI 基础设施控制平面
人工智能·平面·kubernetes
sbjdhjd5 小时前
云安全 | Docker 容器逃逸复盘(三):docker.sock 挂载与 Docker-in-Docker 风险
经验分享·网络安全·docker·云原生·容器·kubernetes·云安全
热爱Liunx的丘丘人5 小时前
1、什么是K8s
云原生·容器·kubernetes
小匠石钧知13 小时前
07_在k8s集群中安装ingress-nginx
nginx·容器·kubernetes·ingress
谢亮_vipxieliang1 天前
Kubernetes 1.36 深度解读:从 kubelet 安全到 GPU 原生调度的 70 项改进
安全·kubernetes·kubelet
wzq11_6661 天前
kubernetes集群——灰度发布
云原生·容器·kubernetes
vipxieliang1 天前
Kubernetes 的“操作系统化”:从容器编排到 AI 基础设施控制平面
kubernetes
Zhu7582 天前
在k8s环境中,离线部署与使用Topograph
云原生·容器·kubernetes
ToddyBear2 天前
从 Pod 编排到数据互联:基于 K8s 与 Snowflake 打造下一代异构查询桥梁实践
云原生·容器·kubernetes
A-刘晨阳2 天前
GitLab + ArgoCD 实现 Kubernetes GitOps 自动化部署
运维·人工智能·git·kubernetes·自动化·云计算·argocd