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 的元数据目录(通常是 journalDirledgerDirs 中),并记录了 Bookie 的主机地址(bookieHost)、存储目录等信息。
  • 启动时,BookKeeper 会将当前配置生成的 Cookie 与存储在磁盘上的 Cookie 进行对比。如果两者不匹配,就会抛出 InvalidCookieException
  • 从日志中可以看到:
    • 磁盘上的 CookiebookieHost: "10.244.105.46:3181"
    • 当前配置的 CookiebookieHost: "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 中的 bookiePortadvertisedAddress 与之前记录的不一致。

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
    • ledgerDirjournalDir:是否复用了其他节点的存储目录。

2. 解决方法

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

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

  1. 找到 Cookie 文件

    • Cookie 文件通常位于 journalDirledgerDirs 中的 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)存储 journalDirledgerDirs,并确保每个 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 的内容或更详细的日志,我可以进一步协助你排查!

相关推荐
Blockchain5 小时前
从头开始使用 Go 构建 Orchestrator(第十部分:重构)
kubernetes
Blockchain5 小时前
从头开始使用 Go 构建 Orchestrator(第 六部分:指标)
后端·kubernetes
Blockchain5 小时前
从头开始使用 Go 构建 Orchestrator(第 八部分:Manager API)
kubernetes
Blockchain5 小时前
从头开始使用 Go 构建 Orchestrator(第五部分:Worker 的 API)
后端·kubernetes
程序员果子9 小时前
Kubernetes 节点摘除指南
云原生·容器·kubernetes
Gold Steps.9 小时前
K8S运维实战之集群证书升级与容器运行时更换全记录
运维·容器·kubernetes
dessler12 小时前
Kubernetes(k8s)-服务目录(ServiceCatalog)介绍(二)
linux·运维·kubernetes
Pasregret12 小时前
07-云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固
安全·云原生·kubernetes