通过CCR跨集群复制解决跨集群容灾场景

Elasticsearch(简称ES)集群出现灾难性事件,例如,硬件故障、软件错误、数据中心故障、自然灾害或其他导致服务中断的情况,可使用跨集群复制CCR(Cross Cluster Replication)实现跨地域或跨资源的容灾能力,本文分别介绍新老网络架构下ES实现CCR的过程。

背景信息

CCR是开源ES在platinum版本中发布的一个商业特性。购买阿里云ES实例后,您无需额外付费,只需要简单配置,即可使用CCR功能。

CCR用于容灾恢复场景,对于分布在同VPC下不同可用区的ES集群,可以通过CCR进行数据备份。当其中一个集群(如远程集群)发生故障时,通过访问其他集群(本地集群)来获取故障集群的数据进行恢复,保证数据不丢失。

使用CCR功能,需要准备两种类型的集群。一个是远程集群,即提供源数据(Leader index)的集群;一个是本地集群,即订阅数据(Follower index)的集群。该功能为被动复制,即所有复制任务都是由本地集群执行。同时支持批量实时迁移数据,更多详情请参见Cross-cluster replication

场景应用

依据您的业务场景选择解决方案:

实例环境

场景应用

两个阿里云ES集群均创建于新网络架构下。

说明

仅支持7.7版本以上的阿里云ES实例。

通过NLB和PrivateLink实现跨集群CCR

两个阿里云ES集群均创建于旧网络架构下,且处于同一VPC。

说明

仅支持6.7.0及以上版本的单可用区的阿里云ES实例。

通过配置实例网络互通实现跨集群CCR

说明
  • CCR在不同实例网络环境的使用方案也适用于CCS功能在类似场景下的应用。更多信息,请参见modules-cross-cluster-search

  • 阿里云ES实例不支持与自建ES实例进行跨集群复制。

  • 2020年10月之前创建的ES集群属于旧网络架构,2020年10月及之后创建的ES集群属于新网络架构。

通过NLB和PrivateLink实现跨集群CCR

准备工作

  • 创建两个7.7及以上版本的阿里云ES实例,且两个ES实例在相同地域和可用区下。

    说明

    两个ES实例分别作为:

    • 远程集群Leader Cluster: 指原始数据所在的集群。

    • 本地集群Follower Cluster: 从Leader cluster中的一个或多个索引复制数据。

  • 实现两个ES实例间私网互通。具体操作,请参见通过NLB和PrivateLink实现阿里云ES实例间私网互通

    说明

    通过NLB挂载Leader集群的域名IP,将Follower通过私网连接到Leader集群。

  • 在Leader集群中创建待迁移的索引。

    1. 登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台

    2. 在页面左上角单击菜单.png图标,选择Management > 开发工具Dev Tools

    3. 执行以下命令,在Leader集群中创建待迁移的索引。

      PUT /leader-new
      {
        "settings": {
          "number_of_shards": 1,
          "number_of_replicas": 0
        },
        "mappings": {
          "properties": {
            "name": {
              "type": "text"
            },
            "age": {
              "type": "integer"
            }
          }
        }
      }

场景一:针对具体索引实现跨集群复制

步骤一:连接Leader集群

  1. 登录Follower集群的Kibana控制台。具体操作,请参见登录Kibana控制台

  2. 在页面左上角单击菜单.png图标,选择Management > Stack Management

  3. 管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。

  4. 单击添加远程集群(Add a remote cluster)。

  5. 在添加远程集群页面中,输入Leader集群信息。

    • 名称(Name):Leader集群的名称,不可重复。

    • 连接模式(Connection mode):打开使用代理模式(Use proxy mode)开关。

    • 代理地址(Proxy address):代理服务器地址,格式为终端节点域名:9300,终端节点域名即PrivateLink终端节点服务下的终端节点ID的域名。

      说明

      由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。

  6. 单击保存

    保存后,系统会自动连接Leader集群。连接成功后,连接状态显示连接(Connected)

API示例

PUT /_cluster/settings 
{
	"persistent": {
		"cluster": {
			"remote": {
				"<remote_cluster>": {
					"mode": "PROXY",
					"proxy_address": "终端节点域名:9300"
				}
			}
		}
	}
}

参数

说明

persistent

设置会持久保存,即使在集群重启后也会保留。

<remote_cluster>

替换为想要连接的远程集群的名称。

mode

仅支持proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。

proxy_address

代理服务器地址,格式为PrivateLink终端节点服务下的终端节点ID的域名:9300

说明

本文CCR/CCS使用的是Elasticsearch的传输层(Transport layer),需要使用9300端口进行通讯。

步骤二:配置跨集群复制

  1. 在Follower集群Kibana控制台的管理(Management)页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。

  2. 单击创建Follower索引(Create a follower index)。

  3. 配置跨集群复制。

    参数

    说明

    Remote cluster

    选择您已连接的远程集群。

    Leader index

    待迁移的索引。

    Follower index

    迁移数据生成的索引。索引名称不可重复。

  4. 单击创建(Create)。

    创建成功后,索引状态显示为Active

API示例:

创建Follower集群索引时,必须引用Leader集群以及在Leader集群中创建的领导者索引。

PUT /leader-old-copy/_ccr/follow
{
  "remote_cluster": "es-leader",
  "leader_index": "leader-old"
}

参数

说明

remote_cluster

连接的Follower集群的名称,与步骤一的参数对应。

leader_index

Leader集群索引名称。

步骤三:验证数据备份结果

  1. 在Leader集群的Kibana控制台,执行如下命令,在Leader集群的索引中插入数据。

    POST leader-new/_doc/
    {
      "name":"Jack",
      "age":40
    }
  2. 在Follower集群的Kibana控制台,执行如下命令,验证数据是否迁移成功。

    GET leader-new-copy/_search

    返回结果如下,Leader集群的Leader索引(leader-new)中的数据,已通过CCR功能复制到了Follower集群的Follower索引(leader-new-copy)中。image.png

  3. 在Leader集群中,重新插入一条数据,验证增量数据是否实时同步。

    POST leader-new/_doc/
    {
      "name":"Pony",
      "age":50
    }
  4. 数据插入后,在Follower集群中执行如下命令。

    GET leader-new-copy/_search

    从查询结果可以看到,通过CCR可以实现增量数据的实时同步。image.png

场景二:指定索引模式实现批量跨集群复制

步骤一:连接Leader集群

  1. 登录Follower集群的Kibana控制台。具体操作,请参见登录Kibana控制台

  2. 在页面左上角单击菜单.png图标,选择Management > Stack Management

  3. 管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。

  4. 单击添加远程集群(Add a remote cluster)。

  5. 在添加远程集群页面中,输入Leader集群信息。

    • 名称(Name):Leader集群的名称,不可重复。

    • 连接模式(Connection mode):打开使用代理模式(Use proxy mode)开关。

    • 代理地址(Proxy address):代理服务器地址,格式为终端节点域名:9300,终端节点域名即PrivateLink终端节点服务下的终端节点ID的域名。

      说明

      由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。

  6. 单击保存

    保存后,系统会自动连接Leader集群。连接成功后,连接状态显示连接(Connected)

API示例

PUT /_cluster/settings 
{
	"persistent": {
		"cluster": {
			"remote": {
				"<remote_cluster>": {
					"mode": "PROXY",
					"proxy_address": "终端节点域名:9300"
				}
			}
		}
	}
}

参数

说明

persistent

设置会持久保存,即使在集群重启后也会保留。

<remote_cluster>

替换为想要连接的远程集群的名称。

mode

仅支持proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。

proxy_address

代理服务器地址,格式为PrivateLink终端节点服务下的终端节点ID的域名:9300

说明

本文CCR/CCS使用的是Elasticsearch的传输层(Transport layer),需要使用9300端口进行通讯。

步骤二:配置跨集群复制

  1. 在Follower集群Kibana控制台的管理(Management)页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。

  2. 单击自动跟随模式(Auto-follow patterns)页签。

  3. 单击创建自动跟随模式(Create auto-follow pattern)。

    配置跨集群复制。

    参数

    说明

    Remote cluster

    选择您已连接的远程集群。

    Index patterns

    远程集群中待迁移的索引模式。

API示例

PUT /_ccr/auto_follow/beats 
{
	"remote_cluster": "es-leader",
	"leader_index_patterns": 
	[
		"leader-*"
	],
	"follow_index_pattern": "{{leader_index}}-copy"
}

参数

说明

remote_cluster

连接的远程集群的名称,与步骤一参数对应。

leader_index_patterns

匹配远程集群中哪些索引需要被复制。

follow_index_pattern

指定在Follower集群中创建的索引的名称模式,CCR将依据之后按照索引模式创建的新索引进行跨集群复制。

步骤三:验证数据备份结果

  1. 在Leader集群的Kibana控制台,执行以下命令,在Leader集群中添加索引。

    PUT /leader-new
    {
      "settings": {
        "number_of_shards": 1,
        "number_of_replicas": 0
      },
      "mappings": {
        "properties": {
          "name": {
            "type": "text"
          },
          "age": {
            "type": "integer"
          }
        }
      }
    }
  2. 在Follower集群的Kibana控制台,执行如下命令,验证新索引是否成功迁移到Follower集群中。

    get _cat/indices?v

    image.png

通过配置实例网络互通实现跨集群CCR

准备工作

  1. 准备两个相同版本(6.7及以上)的阿里云ES实例,且两个ES实例在同一专有网络和虚拟交换机下。

    说明
    • 两个ES实例分别作为:

      • 远程集群Leader Cluster:原始数据所在的集群。

      • 本地集群Follower Cluster:从Leade集群中的一个或多个索引复制数据。

    • 如果远程集群上已经上传了同义词文件,本地集群中也需要上传一致的同义词文件。

  2. 在远程集群中添加需要进行网络互通的本地集群。具体操作,请参见通过配置实例网络互通使用跨集群搜索功能

  3. 在Leader集群中创建待迁移的索引。

    1. 登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台

    2. 在页面左上角单击菜单.png图标,选择Management > 开发工具Dev Tools

    3. 执行以下命令,在Leader集群中创建待迁移的索引。

      PUT myindex
      {
        "settings": {
          "index.soft_deletes.retention.operations": 1024,
          "index.soft_deletes.enabled": true
        }
      }
      说明
      • 对于7.0及以下版本的Elasticsearch实例,在创建索引时,需要开启soft_deletes属性,否则会报错。您可以通过GET /<yourIndexName>/_settings?pretty命令,查看是否开启了soft_deletes属性。开启时,您可以在返回结果中看到soft_deletes属性的配置。

      • 如果您需要迁移已创建的索引,需要通过重建索引来开启soft_deletes属性。

  4. 关闭待迁移的索引的物理复制功能。

    说明

    对于6.7.0版本的阿里云Elasticsearch实例,系统会默认为新建索引开启物理复制功能。使用CCR功能时,需要先关闭物理复制功能。

    1. 关闭索引。

      POST myindex/_close
    2. 更新索引settings,关闭物理复制功能。

      PUT myindex/_settings
      {
      "index.replication.type" : null
      }
    3. 打开索引。

      POST myindex/_open

步骤一:连接远程集群

  1. 登录本地集群的Kibana控制台。具体操作,请参见登录Kibana控制台

  2. 在页面左上角单击菜单.png图标,选择Management > Stack Management

  3. 管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。

  4. 单击添加远程集群(Add a remote cluster)。

  5. 在添加远程集群页面中,输入Leader集群信息。

    • 名称(Name):远程集群的名称,不可重复。

    • 代理地址(Proxy address):需要配置为远程集群的节点的IP地址:9300。远程集群的节点的IP地址,可在远程集群的Kibana控制台中,使用GET /_cat/nodes?v命令获取。所配置的节点中必须包含主节点,建议您配置多个子节点,确保当主节点不可用时,可以继续使用跨集群复制功能。

      说明

      由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。

  6. 单击保存

    保存后,系统会自动连接远程集群。连接成功后,连接状态显示连接(Connected)

步骤二:配置跨集群复制

  1. 在本地集群Kibana控制台的Management页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。

  2. 单击创建Follower索引(Create a follower index)。

  3. 配置跨集群复制。

    参数

    说明

    Remote cluster

    选择您已连接的远程集群。

    Leader index

    待迁移的索引。本文使用准备工作中创建的myindex索引。

    Follower index

    迁移数据生成的索引。索引名称不可重复。

  4. 单击创建(Create)。

    创建成功后,索引状态显示为Active

步骤三:验证数据备份结果

  1. 在远程集群的Kibana控制台,执行如下命令,在远程集群中插入数据。

    POST myindex/_doc/
    {
      "name":"Jack",
      "age":40
    }
  2. 在本地集群的Kibana控制台,执行如下命令,验证数据是否迁移成功。

    GET myindex_follow/_search

    返回结果如下。远程集群的Leader索引(myindex)中的数据,已通过CCR功能复制到了本地集群的Follower索引(myindex_follow)中。数据同步结果

    说明

    Follower索引为只读状态,如果需要和普通索引一样写入数据,需要先转换成普通索引。详细信息,请参见使用Elasticsearch跨集群复制进行跨数据中心复制

  3. 在远程集群中,重新插入一条数据,验证增量数据是否实时同步。

    POST myindex/_doc/
    {
      "name":"Pony",
      "age":50
    }
  4. 数据插入后,在本地集群中进行查看,结果如下。验证数据同步的实时性

    从以上结果可以看到,通过CCR可以实现增量数据的实时同步。

    说明

    您也可以通过CCR功能的API,进行跨集群复制相关操作。详细信息,请参见Cross-cluster replication APIs

常见问题

  • Q:为什么在添加远程集群时,可以使用9300端口。但是通过域名访问Elasticsearch集群时,只能使用9200端口?

    A:9300端口实际上是开放的。因为涉及到产品的安全策略,在SLB端口校验过程中,外网访问Elasticsearch域名的时候,只开放了9200端口。

  • Q:如何查看CCR同步状态?

    A:在Kibana中执行命令GET /_ccr/stats,查看failed分片数量,即number_of_failed_follow_indices的值。

    • 如果failed分片数量为0,则同步是正常的。

    • 如果failed分片数量不是0,可在follow集群执行以下命令恢复同步:

      POST /<follower_index>/_ccr/pause_follow
      POST /<follower_index>/_ccr/resume_follow