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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2020//7/6学习记录

    2020//7/6学习记录1.微信小程序圆角样式border-radius:20rpx;2.微信小程序横向布局display: flex;/*row 横向 column 列表 */flex-direction: row;/* 左右居中 */justify-content: center;/* 上下居中 */align-items: center;3.文字左右布局父元素用到:justify-content:space-between;子元素:<viewstyle…

    2022年8月18日
  • Mqtt开发笔记:Mqtt服务器搭建

    Mqtt开发笔记:Mqtt服务器搭建若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062本文章博客地址:各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门

    2022年4月29日
  • 动态调整线程池参数实践

    动态调整线程池参数实践欢迎大家关注我的微信公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。一、线程池遇到的挑战我们上一篇《一文读懂线程池的实现原理》已经从线程池如何维护自身状态、线程池如何管理任务、线程池如何管理线程三个维度来深入剖析线程池的底层原理与源码剖析,这让我们对线程池的原理有了较为深入的理解。这对我们多线程编程有很大的帮助,但在使用线程池时还是会面临几个棘手的问题。开发人员个人经验与水平参差不齐,配置线程池参数都是按照自己想法来,没有统一.

    2022年6月5日
  • pytorch中resnet_通过Pytorch实现ResNet18

    pytorch中resnet_通过Pytorch实现ResNet18对于像我这样刚刚入门深度学习的同学来说,可能接触学习了一个开发工具,却没有通过运用来熟练的掌握它。而ResNet是深度学习里面一个非常重要的backbone,并且ResNet18实现起来又足够简单,所以非常适合拿来练手。我们这里的开发环境是:python3.6.10pytorch1.5.0torchvision0.6.0cudatoolkit10.2.89cudnn7.6.5首先,我们需…

    2022年5月26日
  • 什么是是JAVA构造函数

    什么是是JAVA构造函数每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在被创建时就完成了所有的初始工作,将是简单的和简洁的。因此,Java在类里提供了一个特殊的成员函数,叫做构造函数(Constructor)。一个构造函数是对象被创建时初始对象的成员函数。它具有和它所在的类完全一样的名字。一旦定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,即使是void类型也没有。这是因为…

    2022年7月8日
  • PhpStorm 2021.2 x64 激活码(已测有效)

    PhpStorm 2021.2 x64 激活码(已测有效),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日

发表回复

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

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