Elasticsearch(简称ES)集群出现灾难性事件,例如,硬件故障、软件错误、数据中心故障、自然灾害或其他导致服务中断的情况,可使用跨集群复制CCR(Cross Cluster Replication)实现跨地域或跨资源的容灾能力,本文分别介绍不同管控部署模式下ES实现CCR的过程。
背景信息
CCR是开源ES在Enterprise版本中发布的一个商业特性。购买阿里云ES实例后,您无需额外付费,只需要简单配置,即可使用CCR功能。
CCR用于容灾恢复场景,对于分布在同VPC下不同可用区的ES集群,可以通过CCR进行数据备份。当其中一个集群(如远程集群)发生故障时,通过访问其他集群(本地集群)来获取故障集群的数据进行恢复,保证数据不丢失。
使用CCR功能,需要准备两种类型的集群。一个是远程集群,即提供源数据(Leader index)的集群;一个是本地集群,即订阅数据(Follower index)的集群。该功能为被动复制,即所有复制任务都是由本地集群执行。同时支持批量迁移数据,更多详情请参见Cross-cluster replication。
ES 集群存在三种管控部署模式,分别为基础管控(v1架构)、基础管控(v2架构)和云原生新管控(v3架构),通过集群基本信息页查看集群架构。

场景应用
依据您的业务场景选择解决方案:
| 实例环境 | 场景应用 | 
| 两个集群的管控部署架构均为云原生新管控架构(v3架构)。 说明  集群为7.7及以上版本,且未开启OpenStore。 | |
| 两个集群的管控部署架构均为v2基础管控架构,且处于同一VPC。 说明  
 | 该方式下,如果待互通的集群为v2架构,互通集群数量限制规则需满足: 所有互通集群 示例说明:A集群需同时连通B、C集群:每个集群含3种角色(Master/协调/数据)、每个集群部署在3个可用区 计算总和: | 
| 
 | 不支持CCR功能。 | 
受证书限制,阿里云ES实例通常不支持与自建ES实例进行跨集群复制,更多信息,请参见modules-cross-cluster-search 。
通过NLB和PrivateLink实现跨集群CCR
准备工作
- 创建两个7.7及以上版本的阿里云ES实例,且两个ES实例在相同地域和可用区下。 说明- 两个ES实例分别作为: - 远程集群Leader Cluster: 指原始数据所在的集群。 
- 本地集群Follower Cluster: 从Leader cluster中的一个或多个索引复制数据。 
 
- 实现两个ES实例间私网互通。具体操作,请参见通过NLB和PrivateLink实现阿里云ES实例间私网互通。 说明- 通过NLB挂载Leader集群的域名IP,将Follower通过私网连接到Leader集群。 
- 在Leader集群中创建待迁移的索引。 - 登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台。 
- 在页面左上角单击  图标,选择Management > 开发工具(Dev Tools)。 图标,选择Management > 开发工具(Dev Tools)。
- 执行以下命令,在Leader集群中创建待迁移的索引。 - PUT /leader-new { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" } } } }
 
场景一:针对具体索引实现跨集群复制
步骤一:连接Leader集群
- 登录Follower集群的Kibana控制台。具体操作,请参见登录Kibana控制台。 
- 在页面左上角单击  图标,选择。 图标,选择。
- 在管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。 
- 单击添加远程集群(Add a remote cluster)。 
- 在添加远程集群页面中,输入Leader集群信息。 - 名称(Name):Leader集群的名称,不可重复。 
- 连接模式(Connection mode):打开使用代理模式(Use proxy mode)开关。 
- 代理地址(Proxy address):代理服务器地址,格式为 - 终端节点域名:9300,终端节点域名即PrivateLink终端节点服务下的终端节点ID的域名。说明- 由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。 
 
- 单击保存。 - 保存后,系统会自动连接Leader集群。连接成功后,连接状态显示已连接(Connected)。 
API示例
PUT /_cluster/settings 
{
	"persistent": {
		"cluster": {
			"remote": {
				"<remote_cluster>": {
					"mode": "PROXY",
					"proxy_address": "终端节点域名:9300"
				}
			}
		}
	}
}| 参数 | 说明 | 
| persistent | 设置会持久保存,即使在集群重启后也会保留。 | 
| <remote_cluster> | 替换为想要连接的远程集群的名称。 | 
| mode | 仅支持Proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。 | 
| proxy_address | 代理服务器地址,格式为 说明  本文CCR/CCS使用的是Elasticsearch的传输层(Transport layer),需要使用9300端口进行通讯。 | 
步骤二:配置跨集群复制
- 在Follower集群Kibana控制台的管理(Management)页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。 
- 单击创建Follower索引(Create a follower index)。 
- 配置跨集群复制。 - 参数 - 说明 - 远程集群(Remote cluster) - 选择您已连接的远程集群。 - Leader索引(Leader index) - 待迁移的索引。 - Follower索引(Follower index) - 迁移数据生成的索引。索引名称不可重复。 
- 单击创建(Create)。 - 创建成功后,索引状态显示为活动(Active)。 
API示例:
创建Follower集群索引时,必须引用Leader集群以及在Leader集群中创建的领导者索引。
本文代码仅为示例,实际使用时,请替换为您自己的集群及索引名称。
# 示例leader-new-copy为创建的Follower集群索引名称,用于接收从Leader集群索引中复制的数据。
PUT /leader-new-copy/_ccr/follow
{
  "remote_cluster": "es-leader",
  "leader_index": "leader-old"
}| 参数 | 说明 | 
| remote_cluster | 连接的Leader集群名称,与步骤一的 | 
| leader_index | Leader集群索引名称。用于控制从远程集群的哪个索引复制数据。 | 
步骤三:验证数据备份结果
- 在Leader集群的Kibana控制台,执行如下命令,在Leader集群的索引中插入数据。 - POST leader-new/_doc/ { "name":"Jack", "age":40 }
- 在Follower集群的Kibana控制台,执行如下命令,验证数据是否迁移成功。 - GET leader-new-copy/_search- 返回结果如下,Leader集群的Leader索引(leader-new)中的数据,已通过CCR功能复制到了Follower集群的Follower索引(leader-new-copy)中。  
- 在Leader集群中,重新插入一条数据,验证增量数据是否同步。 - POST leader-new/_doc/ { "name":"Pony", "age":50 }
- 数据插入后,在Follower集群中执行如下命令。 - GET leader-new-copy/_search- 从查询结果可以看到,通过CCR可以实现增量数据的同步。  
场景二:指定索引模式实现批量跨集群复制
步骤一:连接Leader集群
- 登录Follower集群的Kibana控制台。具体操作,请参见登录Kibana控制台。 
- 在页面左上角单击  图标,选择。 图标,选择。
- 在管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。 
- 单击添加远程集群(Add a remote cluster)。 
- 在添加远程集群页面中,输入Leader集群信息。 - 名称(Name):Leader集群的名称,不可重复。 
- 连接模式(Connection mode):打开使用代理模式(Use proxy mode)开关。 
- 代理地址(Proxy address):代理服务器地址,格式为 - 终端节点域名:9300,终端节点域名即PrivateLink终端节点服务下的终端节点ID的域名。说明- 由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。 
 
- 单击保存。 - 保存后,系统会自动连接Leader集群。连接成功后,连接状态显示已连接(Connected)。 
API示例
PUT /_cluster/settings 
{
	"persistent": {
		"cluster": {
			"remote": {
				"<remote_cluster>": {
					"mode": "PROXY",
					"proxy_address": "终端节点域名:9300"
				}
			}
		}
	}
}| 参数 | 说明 | 
| persistent | 设置会持久保存,即使在集群重启后也会保留。 | 
| <remote_cluster> | 替换为想要连接的远程集群的名称。 | 
| mode | 仅支持Proxy模式。本地集群通过配置的代理地址来访问远程集群。所有的远程请求都会发送到这个代理地址,并由代理服务器转发到远程集群的合适节点。 | 
| proxy_address | 代理服务器地址,格式为 说明  本文CCR/CCS使用的是Elasticsearch的传输层(Transport layer),需要使用9300端口进行通讯。 | 
步骤二:配置跨集群复制
- 在Follower集群Kibana控制台的管理(Management)页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。 
- 单击自动跟随模式(Auto-follow patterns)。 
- 单击创建自动跟随模式(Create auto-follow pattern)。 - 配置跨集群复制,核心参数如下。 - 参数 - 说明 - 远程集群(Remote cluster) - 选择您已连接的远程集群。 - 索引模式(Index patterns) - 远程集群中待迁移的索引模式。 说明- 索引模式是用于匹配一组索引名称的规则或模板(例如,leader-*)。通常,这些索引的命名规则可通过通配符或正则表达式定义,符合规则的索引将被自动复制到Follower集群中。 
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将按照索引模式创建的新索引进行跨集群复制。 | 
步骤三:验证数据备份结果
- 在Leader集群的Kibana控制台,执行以下命令,在Leader集群中添加索引。 - PUT /leader-new { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" } } } }
- 在Follower集群的Kibana控制台,执行如下命令,验证新索引是否成功迁移到Follower集群中。 - get _cat/indices?v 
通过配置实例网络互通实现跨集群CCR
准备工作
- 准备两个相同版本(6.7及以上)的阿里云ES实例,且两个ES实例在同一专有网络和虚拟交换机下。 说明- 两个ES实例分别作为: - 远程集群Leader Cluster:原始数据所在的集群。 
- 本地集群Follower Cluster:从Leade集群中的一个或多个索引复制数据。 
 
- 如果远程集群上已经上传了同义词文件,本地集群中也需要上传一致的同义词文件。 
 
- 在远程集群中添加需要进行网络互通的本地集群。具体操作,请参见v2集群间通过配置实例网络互通实现跨集群搜索。 
- 在Leader集群中创建待迁移的索引。 - 登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台。 
- 在页面左上角单击  图标,选择Management > 开发工具(Dev Tools)。 图标,选择Management > 开发工具(Dev Tools)。
- 执行以下命令,在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属性。 
 
 
- 关闭待迁移的索引的物理复制功能。 说明- 对于6.7.0版本的阿里云Elasticsearch实例,系统会默认为新建索引开启物理复制功能。使用CCR功能时,需要先关闭物理复制功能。 - 关闭索引。 - POST myindex/_close
- 更新索引settings,关闭物理复制功能。 - PUT myindex/_settings { "index.replication.type" : null }
- 打开索引。 - POST myindex/_open
 
步骤一:连接远程集群
- 登录本地集群的Kibana控制台。具体操作,请参见登录Kibana控制台。 
- 在页面左上角单击  图标,选择。 图标,选择。
- 在管理(Management)页面的左侧导航栏,单击远程集群(Remote Clusters)。 
- 单击添加远程集群(Add a remote cluster)。 
- 在添加远程集群页面中,输入Leader集群信息。 - 名称(Name):远程集群的名称,不可重复。 
- 代理地址(Proxy address):需要配置为 - 远程集群的节点的IP地址:9300。远程集群的节点的IP地址,可在远程集群的Kibana控制台中,使用- GET /_cat/nodes?v命令获取。所配置的节点中必须包含主节点,建议您配置多个子节点,确保当主节点不可用时,可以继续使用跨集群复制功能。说明- 由于CCR功能是Kibana通过数据节点之间的TCP端口(9300)访问数据节点IP的形式来进行网络互通,因此不支持HTTP端口(9200)访问。 
 
- 单击保存。 - 保存后,系统会自动连接远程集群。连接成功后,连接状态显示连接(Connected)。 
步骤二:配置跨集群复制
- 在本地集群Kibana控制台的Management页面,在左侧导航栏单击跨集群复制(Cross-Cluster Replication)。 
- 单击创建Follower索引(Create a follower index)。 
- 配置跨集群复制。 - 参数 - 说明 - Remote cluster - 选择您已连接的远程集群。 - Leader index - 待迁移的索引。本文使用准备工作中创建的myindex索引。 - Follower index - 迁移数据生成的索引。索引名称不可重复。 
- 单击创建(Create)。 - 创建成功后,索引状态显示为Active。 
步骤三:验证数据备份结果
- 在远程集群的Kibana控制台,执行如下命令,在远程集群中插入数据。 - POST myindex/_doc/ { "name":"Jack", "age":40 }
- 在本地集群的Kibana控制台,执行如下命令,验证数据是否迁移成功。 - GET myindex_follow/_search- 返回结果如下。远程集群的Leader索引(myindex)中的数据,已通过CCR功能复制到了本地集群的Follower索引(myindex_follow)中。  说明 说明- Follower索引为只读状态,如果需要和普通索引一样写入数据,需要先转换成普通索引。详细信息,请参见使用Elasticsearch跨集群复制进行跨数据中心复制。 
- 在远程集群中,重新插入一条数据,验证增量数据是否同步。 - POST myindex/_doc/ { "name":"Pony", "age":50 }
- 数据插入后,在本地集群中进行查看,结果如下。  - 从以上结果可以看到,通过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