Elasticsearch CCR源码分析(补充)

2023-10-27

接上篇TODO

Elasticsearch CCR源码分析

上篇TODO:

http请求(ccr/follow)接收到后,follow集群节点开始全量同步,是以snapshot的模式去拉leader集群数据的,那么是在什么时候将leader集群伪装成snapshot的repository的?理论上应该是在Node初始化的时候...还未验证,后续再补充该逻辑...
 

如何加载ccr repositoryService

1.node启动:

进入构造方法:

org.elasticsearch.node.Node#Node(org.elasticsearch.env.Environment, java.util.Collection<java.lang.Class<? extends org.elasticsearch.plugins.Plugin>>, boolean)

2.CcrRepositoryManager在节点启动的时候通过调用为每一个remoteCluster注册了名为 “_ccr_” + remoteCluster 的ccrRepository

Collection<Object> pluginComponents = pluginsService.filterPlugins(Plugin.class).stream()
                .flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService,
                                                 scriptModule.getScriptService(), xContentRegistry, environment, nodeEnvironment,
                                                 namedWriteableRegistry).stream())
                .collect(Collectors.toList());

在createComponents方法(org.elasticsearch.xpack.ccr.Ccr#createComponents)中,调用了

new CcrRepositoryManager(settings, clusterService, (NodeClient) client)

继续加载其他...

开始调用org.elasticsearch.xpack.ccr.CcrRepositoryManager.RemoteSettingsUpdateListener#updateRemoteCluster

@Override
protected void updateRemoteCluster(String clusterAlias, List<String> addresses, String proxy, boolean compressionEnabled,
                                           TimeValue pingSchedule) {
            String repositoryName = CcrRepository.NAME_PREFIX + clusterAlias;
            if (addresses.isEmpty()) {
                deleteRepository(repositoryName);
            } else {
                putRepository(repositoryName);
            }
        }

经历一系列方法:

 最终--->org.elasticsearch.xpack.ccr.CcrRepositoryManager#putRepository

3.加载snapshot/restore的module

modules.add(new RepositoriesModule(this.environment, pluginsService.filterPlugins(RepositoryPlugin.class), transportService,
                clusterService, threadPool, xContentRegistry));

4.进入RepositoriesModule构造方法:

Map<String, Repository.Factory> newRepoTypes = repoPlugin.getInternalRepositories(env, namedXContentRegistry);

5.进入getInternalRepositories实现类:

执行重写的 getInternalRepositories方法

org.elasticsearch.xpack.ccr.Ccr#getInternalRepositories

@Override
public Map<String, Repository.Factory> getInternalRepositories(Environment env, NamedXContentRegistry namedXContentRegistry) {
        Repository.Factory repositoryFactory =
            (metadata) -> new CcrRepository(metadata, client, ccrLicenseChecker, settings, ccrSettings.get(), threadPool.get());
        return Collections.singletonMap(CcrRepository.TYPE, repositoryFactory);
    }

6.org.elasticsearch.repositories.RepositoriesModule#RepositoriesModule构造了repositoriesService

 

 7.开始注入初始化的一些bean或者service(相当于Spring的单例池)

injector = modules.createInjector();

8.node初始化的最后,暴露rest API

if (NetworkModule.HTTP_ENABLED.get(settings)) {
                logger.debug("initializing HTTP handlers ...");
                actionModule.initRestHandlers(() -> clusterService.state().nodes());
            }

9.小结

Node初始化的时候会将很多handler、service初始化完成(包括CCR相关service,repository),并且直接为每一个remoteCluster注册了名为 “_ccr_” + remoteCluster的ccrRepository

等到触发全量同步的时候(API触发或者auto API自动触发,检测是否是开启了Ccr且是Ccr的Restore流程,则会走到CcrRepository,否则走正常的repository),会走到org.elasticsearch.xpack.ccr.repository.CcrRepository的逻辑开始restore(即将leader集群视为一个仓库,leader数据视为名为“_latest_”的一个snapshot,获取元数据 & 数据)

void restoreFiles() throws IOException {
            ArrayList<FileInfo> fileInfos = new ArrayList<>();
            for (StoreFileMetaData fileMetaData : sourceMetaData) {
                ByteSizeValue fileSize = new ByteSizeValue(fileMetaData.length());
                fileInfos.add(new FileInfo(fileMetaData.name(), fileMetaData, fileSize));
            }
            SnapshotFiles snapshotFiles = new SnapshotFiles(LATEST, fileInfos);
            // 获取数据的核心方法
            restore(snapshotFiles);
        }

TODO

到此CCR的逻辑已经完全通了,CCR借助snapshot的逻辑进行restore的细节仍然不明朗,例如,把leader集群视为一个repository,将leader集群的数据作为snapshot,是如何进行恢复的?直接拷贝文件到follow集群本地,follow集群的shard逐一开始恢复?增量复制的时候直接读取leader集群的operations(translog),是直接读取在内存中直接回放(bulk写入follow集群shard)?还是其他逻辑?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch CCR源码分析(补充) 的相关文章

随机推荐

  • 无法解析的外部符号__imp__AlphaBlend@44

    使用Win32 API函数AlphaBlend编译时出现一个错误 无法解析的外部符号 imp AlphaBlend 44 解决办法是在使用得地方包含Msimg32 lib 具体是在文件头部添加代码 pragma comment lib Ms
  • 利用PyQt5制作本地音乐播放器

    介绍 本文是对之前的音乐播放器的一些改进和功能实现 只写了有变化的部分 具体部分请看上一篇博客 利用PyQt5和QSS制作本地音乐播放器 初稿 https blog csdn net weixin 44343083 article deta
  • PHP版今日头条算法面试题(持续更新)

    1 现在有一个字符串 你要对这个字符串进行 n 次操作 每次操作给出两个数字 p l 表示当前字符串中从下标为 p 的字符开始的长度为 l 的一个子串 你要将这个子串左右翻转后插在这个子串原来位置的正后方 求最后得到的字符串是什么 字符串的
  • mysql 字符串主键效率,字符串作为主键的性能损失?

    What would be the performance penalty of using strings as primary keys instead of bigints etc String comparison is much
  • .360勒索病毒数据恢复

    导言 在当今数字时代 随着我们对计算机和互联网的依赖不断增加 威胁网络安全的因素也日益猖獗 其中 360 勒索病毒是一股咄咄逼人的黑暗力量 它能够迅速加密您的数据文件 并以比特币等加密货币的形式勒索您的财产 本文91数据恢复将深入介绍这一极
  • 在Linux中使用VSCode进行PyQt开发

    在Linux中使用VSCode进行PyQt开发 需要进行以下步骤 步骤一 安装Anaconda 在Anaconda官网上下载相应版本的Anaconda安装包 然后执行以下命令进行安装 bash Anaconda XXX Linux x86
  • 【SHOI2017】寿司餐厅【最大权闭合子图】

    题目链接 说实话 这道题从前天开始敲 然后不断的加优化 今晨才过了它 但是却对于最大权闭合子图有了很深的了解 题意 有N种寿司 我们可以吃连续的一段寿司 讲 将得到一系列的贡献 譬如说吃了1 2 3三个寿司 将得到 这么多的贡献值 当然 每
  • 机器学习:你需要多少训练数据?

    摘自 PPTV课堂 作者为Google 软件工程师 美国西北大学电子信息工程博士 擅长大规模分布式系统 编译器和数据库 从谷歌的机器学习代码中得知 目前需要一万亿个训练样本 训练数据的特性和数量是决定一个模型性能好坏的最主要因素 一旦你对一
  • 004.设计原则与思想:设计原则

    设计原则 一 理论一 对于单一职责原则 如何判定某个类的职责是否够 单一 1 如何理解单一职责原则 SRP 二 如何做到 对扩展开放 修改关闭 扩展和修改各指什么 三 里式替换 LSP 跟多态有何区别 哪些代码违背了LSP 四 接口隔离原则
  • IDEA实现远程Debug调试(附上Demo代码)

    目录 一 前提 二 IDEA中如何实现远程Debug模式 1 创建demo项目 2 引入依赖 3 创建启动类和创建demo 4 配置idea 二 IDEA的Debug的优缺点 二 Demo的源代码地址 总结 一 前提 需要准备JDK1 8环
  • C#实现查询MySql数据信息在DataViewGrid控件中显示

    具体的实现步骤如下 1 新建Windows窗体应用程序 添加DataGridView控件 不对DataGridView控件做任何处理 只做拉伸 防止看不到数据 2 为 查看记录 按钮添加事件 代码如下 1 数据库操作类 class DBCo
  • 《机器学习实战》第五章 Python3代码-(亲自修改测试可成功运行)

    由于Peter Harrington所著的这本 机器学习实战 中的官方代码是Python2版本的且有一些勘误 使用Python3的朋友运行起来会有很多问题 所以我将自己在学习过程中修改好的Python3版本代码分享给大家 以供大家交流学习
  • 电力电子中的Boost电路实现PFC功能-介绍与仿真

    今天也是个自习的日子 翻了些资料 觉得自己也是落后了 最新的单级PFC Power Factor Compensation 有Boost Flyback Boost Forward Buck Flyback变流器 和传统的PFC变流器 DC
  • J2EE/JAVA——HTMLform表单中action的‘/’路径问题

    1 HTML中的form表单简单介绍 HTML中的form表单在JAVA企业级开发中拥有十分重要的地位 HTML表单用于收集用户输入的信息 并将收集到的用户信息发送到web服务器中 在初级阶段 form表单常常使用在设计用户登录 用户反馈和
  • 机器学习(中)-投票法原理+思路+案例

    一 投票法的原理 投票法 voting 是集成学习里面针对分类问题的一种结合策略 是一种遵循少数服从多数原则的集成学习模型 通过多个模型的集成降低方差 从而提高模型的 鲁棒性 算法对数据变化的容忍度有多高 在理想情况下 投票法的预测效果应当
  • 认证、加密及数字签名的区别

    前几天 被一个猎头推荐到某世界500强企业 职位是安全测试 由于之前接触过一点点 但是并没有太多经验 奈何 最后的终面 就 尴尬 但是这次 却让我对测试路程 有了一个更清晰的认知 做过 需求 开发 测试 功能 自动化 接口 性能 唯独安全测
  • 第八章numpy之统计相关+练习题

    统计相关 次序统计 计算最小值 numpy amin a axis None out None keepdims np NoValue initial np NoValue where np NoValue Return the minim
  • 聊聊银行的信息科技岗(含各大银行薪资)

    大家好 今天跟大家聊聊薪资问题 作为技术岗 除了可以选择去互联网工作 还有一些同学会选择银行信息科技岗 我周围就有同学到工行 农行软开工作的 也有大佬去了竞争很大的总行 关于银行信息科技岗 看到这篇文章介绍的很不错 来分享给大家 这两天看了
  • 鼠标悬停改变内容-react

    用onMouseEnter onMouseLeave onMouseOver和onMouseOut属性 由于支持冒泡导致不稳定 后来更改为只经过自身触发 经过子元素不触发事件的onMouseEnter和onMouseLeave div is
  • Elasticsearch CCR源码分析(补充)

    接上篇TODO Elasticsearch CCR源码分析 上篇TODO http请求 ccr follow 接收到后 follow集群节点开始全量同步 是以snapshot的模式去拉leader集群数据的 那么是在什么时候将leader集