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 的内容或更详细的日志,我可以进一步协助你排查!

相关推荐
终端行者12 小时前
k8s之Ingress服务接入控制器
云原生·容器·kubernetes
学Linux的语莫17 小时前
k8s的nodeport和ingress
网络·rpc·kubernetes
aashuii1 天前
k8s通过NUMA亲和分配GPU和VF接口
云原生·容器·kubernetes
Most661 天前
kubesphere安装使用
kubernetes
Kentos(acoustic ver.)1 天前
云原生 —— K8s 容器编排系统
云原生·容器·kubernetes·云计算·k8s
哈里谢顿2 天前
Kubernetes 简介
kubernetes
__Smile°2 天前
k8s-MongoDB 副本集部署
云原生·容器·kubernetes
Jy_06222 天前
k8s 中的 deployment,statefulset,daemonset 控制器的区别
云原生·容器·kubernetes
果子⌂2 天前
Kubernetes 服务发布进阶
linux·运维·服务器·云原生·容器·kubernetes·云计算
Gold Steps.2 天前
K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
云原生·容器·kubernetes