reading recovery_the common reader

reading recovery_the common readerBookKeeperAutoRecovery背景版本:BookKeeper版本为4.12.0(Pulsar2.7.0的内置版本)Recovery主要针对的场景是:当集群中有部分bookie节点因异常原因宕机,此时我们恢复该节点上存储的数据。BookKeeper提供了两种数据恢复方式,一种是手动恢复(Manualrecovery),一种是自动恢复(AutoRecovery)。ManualRecovery如果集群中未开启AutoRecovery的功能,则用户可用手动恢复。手动恢复

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

BookKeeper AutoRecovery

背景

  1. 版本:BookKeeper版本为4.12.0(Pulsar 2.7.0的内置版本)

  2. Recovery主要针对的场景是:当集群中有部分bookie节点因异常原因宕机,此时我们恢复该节点上存储的数据。BookKeeper提供了两种数据恢复方式,一种是手动恢复(Manual recovery),一种是自动恢复(AutoRecovery)。

Manual Recovery

如果集群中未开启AutoRecovery的功能,则用户可用手动恢复。

手动恢复有两种方式,一是恢复指定bookie节点的数据;二是恢复指定ledger的数据。

  1. 恢复指定bookie节点的数据(该命令可以在下线节点执行,也可以在正常bookie节点执行);

    ./bin/bookkeeper shell recover bookiehostname:3181
    

    Jetbrains全家桶1年46,售后保障稳定

  2. 恢复指定ledger的数据;

    bin/bookkeeper shell recover \
      192.168.1.10:3181 \    # IP and port for the failed bookie
      --ledger ledgerID      # ledgerID which you want to recover 
    

AutoRecovery简介

AutoRecovery有三种部署模式。

  1. 与bookie节点集成。将bookie节点的bookkeeper.conf文件中将配置项autoRecoveryDaemonEnabled设置为true即可(此部署方式在一台节点上只包含一个进程,AutoRecovery作为附属线程运行于进程中)。
  2. 与bookie节点集成,但是作为单独的进程。即一台节点上有两个进程,一个为Bookie的主进程Main,一个为AutoRecovery进程。(此时需要关闭bookie节点的autoRecoveryDaemonEnabled选项,否则,bookie节点也会参与replication的工作)
  3. 在专门的recovery node上执行。(这里需要注意的是,此时需要关闭bookie节点的autoRecoveryDaemonEnabled选项,否则,bookie节点也会参与replication的工作)
  4. 部分在bookie节点执行,部分在专门的recovery node执行。

备注:Pulsar默认开启AutoRecovery的功能,且也是采用第一种部署方式。

  1. 本文主要介绍第1中部署方式,即将AutoRecovery作为bookie的附属线程执行。下文的相关说明也是只针对第一种方式。
  2. 其中第2种部署方式中,需要为Bookie和AutoRecovery进程分别给予配置文件,否则会导致端口冲突。(主要是prometheus的端口冲突,可将bookkeeper.conf拷贝一份为autorecovery.conf,并将其中的promethues端口更改)。
  3. (第3种和第4中方式笔者还未尝试)。

关闭AutoRecovery

You can disable AutoRecovery for the whole cluster at any time, for example during maintenance. Disabling AutoRecovery ensures that bookies’ data isn’t unnecessarily rereplicated when the bookie is only taken down for a short period of time, for example when the bookie is being updated or the configuration if being changed.

  1. 关闭AutoRecovery
$ bin/bookkeeper shell autorecovery -disable
  1. 开启AutoRecovery
$ bin/bookkeeper shell autorecovery -enable

配置

  1. 确保bookkeeper.conf中autoRecoveryDaemonEnabled为true即可。
  2. 更多配置参考。BookKeeper AutoRecovery

测试AutoRecovery

  1. 查看当前集群中可用的bookie列表。
[test@mq5 middleware]$ ./bin/bookkeeper shell listbookies -rw
JMX enabled by default
16:18:19.118 [main] INFO  org.apache.bookkeeper.tools.cli.commands.bookies.ListBookiesCommand - ReadWrite Bookies :
16:18:19.133 [main] INFO  org.apache.bookkeeper.tools.cli.commands.bookies.ListBookiesCommand - BookieID:mq8:3181, IP:xxx, Port:3181, Hostname:mq8
16:18:19.134 [main] INFO  org.apache.bookkeeper.tools.cli.commands.bookies.ListBookiesCommand - BookieID:mq7:3181, IP:xxx, Port:3181, Hostname:mq7
16:18:19.134 [main] INFO  org.apache.bookkeeper.tools.cli.commands.bookies.ListBookiesCommand - BookieID:mq5:3181, IP:xxx, Port:3181, Hostname:mq5
16:18:19.134 [main] INFO  org.apache.bookkeeper.tools.cli.commands.bookies.ListBookiesCommand - BookieID:mq6:3181, IP:xxx, Port:3181, Hostname:mq6
16:18:19.240 [Thread-1] WARN  org.apache.zookeeper.Login - TGT renewal thread has been interrupted and will exit.


  1. 查看当前集群中的ledger(命令输出节选)。
[test@mq5 middleware]$ ./bin/bookkeeper shell listledgers
# 以下节选部分输出
...
JMX enabled by default
org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 480
16:21:33.704 [main-EventThread] INFO  org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 481
16:21:33.704 [main-EventThread] INFO  org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 482
16:21:33.704 [main-EventThread] INFO  org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 483
16:21:33.704 [main-EventThread] INFO  org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 484
16:21:33.704 [main-EventThread] INFO  org.apache.bookkeeper.tools.cli.commands.bookie.ListLedgersCommand - ledgerID: 485
...
  1. 查看ledger 485的元数据。
[test@mq5 middleware]$ ./bin/bookkeeper shell ledgermetadata -l 485
JMX enabled by default
17:19:47.521 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - ledgerID: 488
17:19:47.532 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - LedgerMetadata{ 
   formatVersion=3, ensembleSize=2, writeQuorumSize=2, ackQuorumSize=2, state=OPEN, digestType=CRC32C, password=base64:, ensembles={ 
   0=[mq8:3181, mq6:3181]}, customMetadata={ 
   component=base64:bWFuYWdlZC1sZWRnZXI=, pulsar/managed-ledger=base64:cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC90ZXN0Mg==, application=base64:cHVsc2Fy}}
17:19:47.639 [Thread-1] WARN  org.apache.zookeeper.Login - TGT renewal thread has been interrupted and will exit.

  • 观察该数据可知,该ledger存储在mq8和mq6节点上。
  • 该ledger的E,W,A为(2,2,2)
  • 该ledger存储的是public/default/persistent/test2的数据。通过命令echo "cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC90ZXN0Mg=="| base64 -d得到
  1. 现在我们停止mq8上的bookie。
./bin/pulsar-daemon stop bookie
  1. 再次观察ledger485的元数据。发现还为发生变化。
[test@mq5 middleware]$ ./bin/bookkeeper shell ledgermetadata -l 485
JMX enabled by default
17:19:47.521 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - ledgerID: 488
17:19:47.532 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - LedgerMetadata{ 
   formatVersion=3, ensembleSize=2, writeQuorumSize=2, ackQuorumSize=2, state=OPEN, digestType=CRC32C, password=base64:, ensembles={ 
   0=[mq8:3181, mq6:3181]}, customMetadata={ 
   component=base64:bWFuYWdlZC1sZWRnZXI=, pulsar/managed-ledger=base64:cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC90ZXN0Mg==, application=base64:cHVsc2Fy}}
17:19:47.639 [Thread-1] WARN  org.apache.zookeeper.Login - TGT renewal thread has been interrupted and will exit.
  1. 查看当前在复制的ledger(如果ledger数据较小,则复制过程会比较快,可能看不到正在复制的ledger)
[test@mq5 middleware]$ ./bin/bookkeeper shell listunderreplicated
JMX enabled by default
15:58:23.932 [main] INFO  org.apache.bookkeeper.tools.cli.commands.autorecovery.ListUnderReplicatedCommand - 485
15:58:23.938 [main] INFO  org.apache.bookkeeper.tools.cli.commands.autorecovery.ListUnderReplicatedCommand -    Cti
15:58:24.045 [Thread-1] WARN  org.apache.zookeeper.Login - TGT renewal thread has been interrupted and will exit.
[test@mq5 middleware]$ ./bin/bookkeeper shell listunderreplicated
JMX enabled by default
  1. 再次查看ledger485的元数据。
我们xxxxxxxxxx [test@mq5 middleware]$ ./bin/bookkeeper shell ledgermetadata -l 485JMX enabled by default17:22:52.300 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - ledgerID: 48817:22:52.311 [main] INFO  org.apache.bookkeeper.tools.cli.commands.client.LedgerMetaDataCommand - LedgerMetadata{ 
   formatVersion=3, ensembleSize=2, writeQuorumSize=2, ackQuorumSize=2, state=OPEN, digestType=CRC32C, password=base64:, ensembles={ 
   0=[mq7:3181, mq6:3181], 13=[mq5:3181, mq6:3181]}, customMetadata={ 
   pulsar/managed-ledger=base64:cHVibGljL2RlZmF1bHQvcGVyc2lzdGVudC90ZXN0Mg==, component=base64:bWFuYWdlZC1sZWRnZXI=, application=base64:cHVsc2Fy}}17:22:52.419 [Thread-1] WARN  org.apache.zookeeper.Login - TGT renewal thread has been interrupted and will exit.shell

我们可以观察下ledger位置的变化。

在停掉bookie8之前,元数据显示ensemble为

ensembles={ 
   0=[mq8:3181, mq6:3181]},

在停掉之后,元数据显示ensemble为:

ensembles={ 
   0=[mq7:3181, mq6:3181], 13=[mq5:3181, mq6:3181]}

解释:该现象说明:

  • 开始时,ledger放置在mq8和mq6上;
  • 在Recovery之后,该ledger的entryId为【0,12】的entry放置在mq7和mq6上,entryId大于等于13的entry放置在mq5和mq6上。
  • Recovery体现在哪里?因为节点8挂掉了,所以原本entryid范围为【0,12】的数据,又拷贝了一份放置在了mq7上。

参考

  1. BookKeeper Auto Recovery 文档
  2. 《深入理解Apache Pulsar》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206809.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vscode 配置C语言编译环境(完美版)_C语言环境安装

    vscode 配置C语言编译环境(完美版)_C语言环境安装基本步骤要在VSCode中配置C语言环境,我们首先可能要一个VSCode(废话),所以先下载安装一个VSCode;然后肯定需要相关插件,因为VSCode不能直接拿来写C;然后任何语言的程序在运行前都需要编译,那还需要一个编译器,很可惜VSCode插件里面不自带,所以要自己下载然后配置;最后在VSCode中进行相关配置,就可以下载并安装VSCodevscode下载地址安装相关插件打卡后进入如下界面,选择这个C/C++的,然后点击install进行安装,大概几秒钟就好了,安装完成后in

    2025年12月8日
    2
  • 计算机网络体系结构及其简单通信技术_简述计算机网络体系结构的概念

    计算机网络体系结构及其简单通信技术_简述计算机网络体系结构的概念(一)通信的基本概念:我们知道,通信的目的是快速、有效地传递信息。下面我们先来简单地介绍一点通信的基本知识:现代信息的表达方式有文字、符号、声音、图像数据等多种形式。为了实现信息传递,通常以光、电等信号作为信息的载体。信号:信息的表达形式信道:信号传输的通道,是信号传输媒介的总称。信源:发出信息的地方信宿:信息传送的终点根据传送信息的信道(信号传输媒介)不同,通信可分为有线通信和无线

    2025年11月21日
    5
  • 信息收集8——masscan,nbtscan「建议收藏」

    信息收集8——masscan,nbtscan「建议收藏」目录masscannbtscanmasscan大规模地址范围扫描器默认每秒100包,可提升至约25,000,000包每秒 理论_上全球地址范围指定一个端口的打描可在3分钟完成命令格式masscan<ipaddresses/ranges>-pportsoptions地址范围1.1.1.1-1.1.1.10、1.0.0.0/8–exclude排除IP地址段–excludefile排除文件中IP地址端口-p80,20-25 -pU:1

    2025年11月10日
    2
  • nfc手机与手机数据传输_iphone数据传输已取消

    nfc手机与手机数据传输_iphone数据传输已取消我正在尝试为医院开发Android应用程序.在该系统中,需要使用NFC技术将存储在Android手机中的数据库中的患者信息获取到台式计算机中.无论如何我在哪里可以使用NFCUSB读取设备(ACR122UNFC智能卡读卡器RFID编写器5MifareUSB)将数据从手机传输到我的台式电脑?真实情况是,在医院,当一个人想要获得一些测试结果时,他将到达柜台并将移动设备放置在安装在柜台上的NFC读…

    2025年12月11日
    2
  • 软引用 SoftReference

    软引用 SoftReferenceimportjava lang ref SoftReferenc 软引用 demo 和使用 redis 缓存类似 先查内存中是否缓存 有则直接内存获取 反之则重新创建 再装载入内存中缓存起来 在一些开源框架中经常使用 author tiger create 2021 09 1220 34 publicclassS publicstatic String args Tigerti

    2025年6月6日
    5
  • windows下面安装Python和pip终极教程「建议收藏」

    windows下面安装Python和pip终极教程「建议收藏」在大二的时候接触过一段时间的Python,最近又开始玩起了这门语言。总的来说,个人很喜欢Python的语言风格,但是这门语言对于windows并不算很友好,因为如果是初学者在windows环境下安装,

    2022年7月5日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号