【Elasticsearch源码】CCR源码分析(一)

本文介绍了Elasticsearch的跨集群复制(CCR)特性,包括CCR的基本概念、使用场景及操作。接着详细探讨了CCR的源码实现,主要分为全量复制和增量复制两个部分,涉及快照恢复和shard级别的数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 CCR的基本概念

什么是CCR?

CCR( cross-cluster replication):跨集群复制是ES 6.5发布的一个新的特性:可以将两个集群中的数据进行远程复制。

集群复制类似于数据订阅的方式,一个集群的数据可以被多个集群订阅,也就是可以被复制到多个集群上面去。

CCR 有两个角色,一个是 Leader,表示数据的源头,另外一个Follower,表示数据的订阅方,得到的是数据副本。
CCR 工作在索引层面,使用 Pull 的模式,Follower 索引主动的去 Pull Leader 的数据。

为什么需要CCR?

CCR可以解决下面的几个场景的问题:

  1. 集群高可用以及灾难恢复,在不同的地域部署多套ES集群,通过CCR实时同步数据。
  2. 实现数据的就近访问(地理),数据的就近访问,提升访问速度。
  3. 集中式的报告集群,通过多个备集群的处理,主集群可以进行分析处理。

2 CCR的使用

CCR是怎么使用的呢?

1. 本地集群连接远程集群

通过远程集群的节点进行连接,使用transport端口,命令如下:

PUT /_cluster/settings
{
   
  "persistent" : {
   
    "cluster" : {
   
      "remote" : {
   
        "leader" : {
   
          "seeds" : [
            "127.0.0.1:9300" 
          ]
        }
      }
    }
  }
}

2. 在远程集群创建leader索引

远程集群创建leader索引,和正常创建索引操作一样,需要开启soft_deletes,不过在7.x版本之后,已经默认开启了。

3. 在本地集群创建follower索引

创建follower索引有两种方式:手动创建和自动跟随方式。

手动创建:需要指定远程集群和复制的远程索引

PUT /<follower_index>/_ccr/follow?wait_for_active_shards=1
{
   
  "remote_cluster" : "<remote_cluster>",
  "leader_index" : "<leader_index>"
}

自动跟随创建:通过auto_follow API建立自动跟随的模板

PUT /_ccr/auto_follow/<auto_follow_pattern_name>
{
   
  "remote_cluster" : "<remote_cluster>",
  "leader_index_patterns" :
  [
    "<leader_index_pattern>"
  ],
  "follow_index_pattern" : "<follow_index_pattern>"
}

这里不详细介绍CCR的使用,更多API请参考官网链接:Cross-cluster replication APIs

3 CCR的源码分析

CCR的底层是怎么实现的呢?如何将远程集群的数据实时同步到本地集群呢?

主要涉及两部分:全量复制和增量复制

CCR是以plugins插件的形式:入口类在Ccr,继承了ActionPlugin(注册action),PersistentTaskPlugin(注册持久性任务),EnginePlugin(engine引擎接口),RepositoryPlugin(自定义快照接口)。
在这里插入图片描述
主要注册了下面几类action。
内部请求action: 内部的核心实现,用于处理数据的同步复制;状态请求action:用于获取follow和ccr的状态;follow actions:开启,暂停以及恢复follow的处理;auto-follow actions:自动跟随follow的处理action。
而且实现了FollowingEngine用于follow shard,实现了CcrRepository依靠远程集群快照用于还原数据。如下所示:

    public List<ActionHandler<? extends ActionRequest, ? extends ActionResponse>> getActions() {
   
        return Arrays.asList(
                // internal actions
                new ActionHandler<>(BulkShardOperationsAction.INSTANCE, TransportBulkShardOperationsAction.class),
                new ActionHandler<>(ShardChangesAction.INSTANCE, ShardChangesAction.TransportAction.class),
                new ActionHandler<>(PutInternalCcrRepositoryAction.INSTANCE,
                    PutInternalCcrRepositoryAction.TransportPutInternalRepositoryAction.class)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值