本文涉及官网文章地址
跨集群复制是在逐个索引的基础上完成的。 复制关系是在索引级别配置的。 对于每个配置的复制关系,都有一个称为leader index的复制源索引和一个称为follower index的复制目标索引。
复制是主动-被动的。 这意味着虽然leader索引可以直接写入,但follower索引不能直接接收写入。
复制是基于拉模式的。 这意味着复制是由关注者索引驱动的。 这简化了leader索引的状态管理,并且意味着跨集群复制不会干扰leader索引上的索引写入。
为了方便理解,将Leader索引和follower索引定义为主从索引。
可以通过两种方式配置主从关系:
还必须配置主索引。
当您手动或通过自动跟踪模式启动复制时,将在本地集群上创建从索引。 创建从索引后,远程恢复进程会从远程集群把主索引的所有 Lucene 分段文件复制到本地集群。
默认情况下,如果您手动启动关注,则恢复过程与创建关注者请求是异步的。 该请求在远程恢复过程完成之前返回。 如果您想等待该过程完成,可以使用wait_for_active_shards
参数。
主从复制关系是在索引级别管理的,而复制是在分片级别执行的。 创建从索引时,它会自动配置为具有与主索引相同数量的分片。从索引中的分片任务通过发送新操作的读取请求来从主索引中相应的分片中拉取。 这些读取请求可以从领导分片的任何副本(主分片或副本)提供服务。
对于从索引的分片任务发送的每个读取请求,如果主索引分片上有可用的新操作,则主索引分片将使用受在配置从索引时建立的读取参数限制的操作进行响应。 如果主索引分片上没有可用的新操作,则主索引分片将等待新操作的配置超时。 如果在该超时时间内发生新操作,主索引分片会立即响应这些新操作。 否则,如果超时,从索引的分片会回复没有新操作。 从索引分片任务更新一些统计数据,并立即向主索引分片发送另一个读取请求。 这确保了远程集群和本地集群之间的网络连接持续被使用,以避免被外部源(例如防火墙)强制终止。
如果读取请求失败,则检查失败的原因。 如果故障原因被认为是可以恢复的故障(例如网络故障),则从索引分片任务进入重试循环。 否则,从索引分片任务将暂停并需要用户干预,然后才能使用 恢复 follower API。
当从索引分片任务接收到操作时,它们被放置在写入缓冲区中。 从索引分片任务管理此写入缓冲区并将批量写入请求从此写入缓冲区提交到从索引分片。 写入缓冲区和这些写入请求由您在配置从索引索引时建立的写入参数进行管理。 写缓冲区充当针对读请求的背压。 如果写入缓冲区超出其配置的限制,则从索引分片任务不会发送额外的读取请求。 当写入缓冲区不再超出其配置的限制时,从索引分片任务将恢复发送读取请求。
从主索引复制操作的复杂性取决于如何创建从索引时或使用 创建追随者 API
应用于主索引的映射更新会根据需要由从索引自动检索。???
从索引所需的mapping会基于主索引的设置更新将根据从索引的需要,进行自动重试。 从索引并不会更新所有设置。 例如,更改主索引上的副本数量不会被跟从索引复制。
如果您对从索引所需的主索引setting采用非动态设置更改,则从索引将经历一个自行关闭、应用设置更新,然后重新打开自身的循环。 在此周期内,从索引将不可用于读取且无法复制写入。
您可以使用 get follower stats API 检查分片级别的复制进度 。 通过此 API,您可以深入了解从索引分片任务管理的读写操作。 它还报告可以重试的读取异常和需要用户干预的致命异常。
您可以使用 pause follower API 暂停复制,然后使用 resume follower API。 如果您的初始配置不适合您的用例,串联使用这些 API 使您能够调整从分片任务的读写参数。
如果从索引在一段时间内无法从主索引复制操作,则以下过程可能会由于主索引缺乏复制所需的完整操作历史记录而失败。
复制到从索引的操作是使用最初执行操作时生成的序列号来标识的。 Lucene 段文件偶尔会合并,以优化搜索并节省空间。 当这些合并发生时,与已删除或更新的文档相关的操作可以在合并期间被修剪。 当从索引请求修剪操作的序列号时,该过程将由于主索引上丢失的操作而失败。
这种情况在仅添加的工作流程中是不可能的。 由于文档永远不会被删除或更新,因此底层操作不会被修剪。
Elasticsearch 尝试使用称为软删除的 Lucene 功能来缓解更新工作流程的这一潜在问题。 当文档被更新或删除时,底层操作会在 Lucene 索引中保留一段时间。 这段时间由index.soft_deletes.retention_lease.period
设置控制,可以在主索引上配置。
index.soft_deletes.retention_lease.period
:控制创建或续订保留租期后,将其视为过期的最长时间。
index.soft_deletes.retention.operations
:控制软删除文档在合并前的保留数量。保留更多已删除文档可增加基于操作的恢复机会,并允许查询更长的文档历史。 如果启用了软删除,引擎默认情况下会保留直至全局检查点的所有操作。
当从索引启动索引复制时,它会从主索引那里获取保留租约。 这通知主索引不应允许软删除被修剪,直到从索引指示它已收到操作或租约到期。 在租约到期之前进行监控以检测从索引复制问题非常有价值,以便可以在追随者严重落后之前解决问题。
如果从索引远远落后于主索引,以至于无法再复制操作,则可以使用 get follow stats API。 它将被报告为indices[].fatal_exception
。
为了重新启动从索引,您必须暂停复制进程,关闭索引,然后再次创建从索引。 例如:
POST /follower_index/_ccr/pause_follow
POST /follower_index/_close
PUT /follower_index/_ccr/follow?wait_for_active_shards=1
{
"remote_cluster" : "remote_cluster",
"leader_index" : "leader_index"
}
重新创建从索引是一种破坏性行为。 从属集群上所有现有的 Lucene 段文件都将被删除。 远程恢复进程再次从leader复制Lucene段文件。 当follower索引初始化后,复制的过程会再次开始。
您可以使用 unfollow API 终止复制。 此 API 将关注者索引转换为常规(非从)索引。
跨集群复制的工作原理是重放在主索引分片上执行的各个写入操作的历史记录。 这意味着这些操作的历史记录需要保留在主索引分片上,以便从索引分片任务可以拉动它们。 用于保留这些操作的底层机制是“软删除”。 每当删除或更新现有文档时都会发生软删除。 通过将这些软删除保留到可配置的限制,操作历史记录可以保留在主索引分片上,并在从索引分片任务重放操作历史记录时可供其使用。
必须为要用作主索引的索引启用软删除。 启用软删除需要在创建索引时添加一些索引设置项。 必须将这些设置项添加到创建索引请求或用于管理新索引创建的索引模板中。
这意味着跨集群复制不能用于现有索引。 如果您想要从另一个集群复制现有数据,则必须将数据重新索引到启用软删除的新索引。
index.soft_deletes.enabled
索引上是否启用软删除。 软删除只能在创建索引时配置,并且只能在 6.5.0 或之后创建的索引上配置。 默认值为false
。
index.soft_deletes.retention_lease.period
在分片历史保留租约被视为过期之前保留分片历史保留租约的最长期限。 分片历史保留租约可确保在 Lucene 索引合并期间保留软删除。 如果软删除在复制到从索引之前被合并,则由于主索引的历史记录不完整,后续过程将失败。 默认值为12h
。
在您想要复制定期创建的新索引(例如每日 Beats 索引)的时间序列用例中,为每个新的主索引手动配置从索引可能会成为操作负担。 跨集群复制中的自动复制功能旨在减轻这种负担。 通过自动复制功能,您可以指定自动复制远程集群中名称与模式匹配的新索引。
您可以使用创建自动跟随模式 API。 当您创建新的自动遵循模式配置时,您正在针对单个远程集群配置模式集合。 每当在远程集群中创建名称与集合中的模式之一匹配的新索引时,都会在本地集群中配置从索引。 从索引使用新索引作为其主索引。
您可以使用获取自动跟踪模式 API 。 要删除已配置的自动跟随模式集合,请使用删除自动跟随模式 API。
由于自动跟踪功能是在后台代表您自动处理的,因此错误报告是通过所选主节点上的日志和跨集群复制统计 API完成的。
安装两个集群作为本地集群和远程集群。
购买具有CCR使用权的license
如果在本地和远程集群中启用了 Elastic 安全功能,则您需要具有适当权限的用户来执行本教程中的步骤。
跨集群复制功能使用集群权限和内置角色,可以更轻松地控制哪些用户有权管理跨集群复制。
默认情况下,您可以使用内置的“elastic”用户执行本教程中的所有步骤。 但是,必须先为此用户设置密码,然后用户才能执行任何操作。 有关如何设置该密码的信息,请参阅教程:安全性入门。
如果您在生产环境中执行这些步骤,请格外小心,因为 elastic
用户具有superuser
角色,您可能会无意中进行重大更改。
或者,您可以将适当的权限分配给您选择的用户 ID。 在包含主索引的远程集群上,用户将需要主索引的read_ccr
集群权限以及monitor
和read
权限。
ccr_user:
cluster:
- read_ccr
indices:
- names: [ 'leader-index' ]
privileges:
- monitor
- read
在包含从索引的本地集群上,同一用户将需要从索引的manage_ccr
集群权限以及monitor
、read
、write
和manage_follow_index
权限。
ccr_user:
cluster:
- manage_ccr
indices:
- names: [ 'follower-index' ]
privileges:
- monitor
- read
- write
- manage_follow_index
如果您正在管理连接到远程集群 通过集群更新设置 API,您还需要一个具有all
集群权限的用户。
跨集群复制功能要求将本地集群连接到远程集群。 我们将使用集群别名leader
将本地集群连接到远程集群。
PUT /_cluster/settings
{
"persistent" : {
"cluster" : {
"remote" : {
"leader" : {
"seeds" : [
"127.0.0.1:9300"
]
}
}
}
}
}
指定远程集群中种子节点的主机名和传输端口。
您可以验证本地集群与远程集群是否成功连接。
GET /_remote/info
API 将通过显示本地集群已连接到远程集群来做出响应。
{
"leader" : {
"seeds" : [
"127.0.0.1:9300"
],
"http_addresses" : [
"127.0.0.1:9200"
],
"connected" : true,
"num_nodes_connected" : 1,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s",
"skip_unavailable" : false
}
}
这表明本地集群已连接到远程集群,集群别名为leader
。
这显示了本地集群连接到的远程集群中的节点数。
主索引需要一个特殊的索引设置,以确保当从索引向主索引请求时,需要复制的操作是可用的。该设置用于在领导者索引上启用软删除。每当删除或更新文档时,就会发生软删除。软删除只能在 Elasticsearch 6.5.0 或之后创建的新索引上启用。
在下面的示例中,我们将在远程群集中创建一个主索引:
PUT /server-metrics
{
"settings" : {
"index" : {
"number_of_shards" : 1,
"number_of_replicas" : 0,
"soft_deletes" : {
"enabled" : true
}
}
},
"mappings" : {
"metric" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"accept" : {
"type" : "long"
},
"deny" : {
"type" : "long"
},
"host" : {
"type" : "keyword"
},
"response" : {
"type" : "float"
},
"service" : {
"type" : "keyword"
},
"total" : {
"type" : "long"
}
}
}
}
}
开启主索引的软删除。
从索引是通过create follower API创建的。创建从索引时,必须引用remote cluster 和在远程群集中创建的leader index。
PUT /server-metrics-copy/_ccr/follow?wait_for_active_shards=1
{
"remote_cluster" : "leader",
"leader_index" : "server-metrics"
}
从索引使用 remote recovery 进程初始化。远程恢复过程会将现有的 Lucene 段文件从主索引传输到从索引。远程恢复过程完成后,复制索引就开始了。
现在,当你将文档索引到主索引中时,你会看到这些文档被复制到从索引中。您可以使用 get follower stats API 查看复制的状态。
跨群集复制中的auto-follow功能有助于在时间序列用例中跟踪远程群集定期创建的新指数(如每日 Beats 指数)。自动跟踪可使用创建自动跟踪模式 API进行配置。通过自动跟踪模式,您可以引用与本地集群相连的远程集群。您还必须指定一个与要自动跟踪的索引相匹配的模式集合。
For example:
PUT /_ccr/auto_follow/beats
{
"remote_cluster" : "leader",
"leader_index_patterns" :
[
"metricbeat-*",
"packetbeat-*"
],
"follow_index_pattern" : "{{leader_index}}-copy"
}
自动复制新的 Metricbeat 索引。
自动复制新的 Packetbeat 索引。
从索引的名称是通过在主索引的名称上添加后缀-copy
而从主索引的名称派生而来的。
当您创建从索引时,在其完全初始化之前您无法使用它。 remote recovery过程通过从主索引所在集群中的主分片复制数据来在从索引的节点上构建分片的新副本。 Elasticsearch 使用此远程恢复过程,使用主索引中的数据来引导从索引。 此过程为从索引提供了主索引当前状态的副本,即使由于 Lucene 段合并导致领导者无法获得完整的更改历史记录。
远程恢复是一个网络密集型过程,它将所有 Lucene 段文件从主索引的集群传输到从索引的集群。 从索引请求在主索引集群中的主分片上启动恢复的会话。 然后,从索引同时向主索引请求文件块。 默认情况下,进程同时请求5
个大1mb
文件块。 此默认行为旨在支持领导者和追随者集群之间存在高网络延迟。
您可以使用动态设置来限制传输数据的速率并管理远程恢复消耗的资源。 请参阅跨集群复制设置。
您可以使用从索引集群上的 recovery API 获取有关正在进行的远程恢复的信息。 远程恢复是使用snapshot and restore基础设施来实现的。 这意味着正在进行的远程恢复在恢复 API 中被标记为snapshot
类型。
主动使用跨集群复制的集群需要谨慎升级。 否则,在滚动升级过程中,以下索引可能会因以下原因而失败:
跨集群复制的滚动升级集群在单向索引复制和双向索引复制的情况下是不同的。
在两个集群之间的单向设置中,一个集群仅包含主索引,另一个集群仅包含复制第一个集群中的索引的从索引。
在此场景中,具有从索引的集群应首先升级,具有主索引的集群应最后升级。 如果集群按此顺序升级,则索引跟踪可以在升级期间继续进行,而无需停机。
请注意,链式索引跟随设置也可以通过这种方式升级。例如,如果集群 A 包含所有主索引,集群 B 复制集群 A 中的索引,集群 C 复制集群 B 中的索引。在这种情况下,应首先升级群集 C,然后升级群集 B,最后升级群集 A。
在两个集群之间的双向设置中,每个集群都包含主索引和从索引。
在此设置中升级群集时,需要在升级两个群集之前使用pause follower API 暂停所有索引跟踪。升级两个群集后,可以使用resume follower API 恢复索引跟踪。