前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >reading recovery_the common reader

reading recovery_the common reader

作者头像
全栈程序员站长
发布2022-11-01 16:26:55
9660
发布2022-11-01 16:26:55
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

BookKeeper AutoRecovery

背景

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

Manual Recovery

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

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

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

代码语言:javascript
复制
./bin/bookkeeper shell recover bookiehostname:3181

恢复指定ledger的数据;

代码语言:javascript
复制
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
代码语言:javascript
复制
$ bin/bookkeeper shell autorecovery -disable
  1. 开启AutoRecovery
代码语言:javascript
复制
$ bin/bookkeeper shell autorecovery -enable

配置

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

测试AutoRecovery

  1. 查看当前集群中可用的bookie列表。
代码语言:javascript
复制
[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(命令输出节选)。
代码语言:javascript
复制
[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的元数据。
代码语言:javascript
复制
[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。
代码语言:javascript
复制
./bin/pulsar-daemon stop bookie
  1. 再次观察ledger485的元数据。发现还为发生变化。
代码语言:javascript
复制
[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)
代码语言:javascript
复制
[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的元数据。
代码语言:javascript
复制
我们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为

代码语言:javascript
复制
ensembles={ 
0=[mq8:3181, mq6:3181]},

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

代码语言:javascript
复制
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》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BookKeeper AutoRecovery
    • 背景
      • Manual Recovery
        • AutoRecovery简介
          • 关闭AutoRecovery
            • 配置
            • 测试AutoRecovery
              • 参考
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档