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实例。 | |
两个阿里云ES集群均创建于旧网络架构下,且处于同一VPC。 说明 仅支持6.7.0及以上版本的单可用区的阿里云ES实例。 |
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集群中创建待迁移的索引。
登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台。
在页面左上角单击图标,选择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 index
待迁移的索引。
Follower index
迁移数据生成的索引。索引名称不可重复。
单击创建(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集群索引名称。 |
步骤三:验证数据备份结果
在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
远程集群中待迁移的索引模式。
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集群中的一个或多个索引复制数据。
如果远程集群上已经上传了同义词文件,本地集群中也需要上传一致的同义词文件。
在远程集群中添加需要进行网络互通的本地集群。具体操作,请参见通过配置实例网络互通使用跨集群搜索功能。
在Leader集群中创建待迁移的索引。
登录Leader集群的Kibana控制台。具体操作,请参见登录Kibana控制台。
在页面左上角单击图标,选择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