Elasticsearch跨集群复制(CCR)介绍

跨集群复制(CCR,cross-cluster replication)属于xpack增强包中的功能,需要白金级、企业级证书才可使用。CCR可以将远程集群(leader)中的索引复制到本地集群(follower)中,常用于以下场景中:

  • 灾难恢复及高可用性

    对于分布在不同地域的Elasticsearch集群,您可以通过CCR进行数据备份。当其中一个集群发生故障时,您可以通过访问其他集群来获取故障集群的数据,保证数据不丢失。

  • 就近访问数据

    例如A集团下有多个子公司,各子公司所分布的地域不同。为了提高业务处理速度,可按照地理位置划分子公司要承担的业务,并通过CCR将业务数据分发给各地域中的Elasticsearch集群。子公司在处理业务时,可直接访问当前所在地域的集群。

  • 集中报告

    通过CCR,将多个数据量较小的集群中的数据复制到一个中央集群中,进行可视化分析与报告。

CCR为被动复制模式,leader索引接收写入后,follower索引拉取变更并在本地回放。follower索引可以手动创建或使用auto-follow模式自动创建。

follower索引是只读的。

CCR集群可以配置为单向复制或双向复制:

多集群架构

基于使用场景的不通,可将多集群架构分为:

灾难恢复及高可用架构

灾难恢复架构是最常见的多集群架构,可为关键应用程序提供区域/数据中心故障时的容灾能力,可分为:

单容灾节点架构

多容灾节点架构

链式复制架构

双向复制架构

有关双向复制的详细用法可以参看: https://www.elastic.co/cn/blog/bi-directional-replication-with-elasticsearch-cross-cluster-replication-ccr

数据本地化架构

将数据中心就近部署于用户或应用服务器可以减少访问延迟及响应时间,如下图使用CCR将数据复制到另外三个区域中心:

集中报告架构

该架构将多个小集群的数据复制到中央集群。例如一个大型跨国公司在全球各地区分公司拥有100个Elasticsearch集群,使用CCR可以将这些集群的数据复制到中央集群以进行集中分析。

复制机制

尽管我们配置CCR是从index层面进行的,但Elasticsearch确实从shard(分片)层面进行复制的。 当一个follower索引被创建时,它的所有shard都会从leader索引的相关shard中拉取数据,这意味着follower索引的shard数量与leader索引相等。对leader索引的所有操作请求,如CREATE、UPDATE、DELETE文档均会被follower复制,这些请求可以由leader索引的任何副本(primary或replica)分片提供。

当follower分片发送read请求后,leader分片会返回未同步过的操作。如果没有未同步过的操作,leader分片会等待一段时间(取决于follower配置的超时时间),如果在等待的这段时间里依然没有新的同步(写)操作,则返回空信息给follower分片。follower分片会update本地的分片统计信息并立即发送另一个新的read请求给leader分片。这种通信模型可以确保远程集群与本地集群间的网络连接持续保持,从而避免被外部源(如防火墙)强制终止。

如果read请求失败,则会见检查失败原因,如果故障被判断为可恢复的,如网络故障,则follower分片会进入重试循环。反之,follower分片会暂停复制直到手工恢复。

更新处理

follower索引的映射或别名无法手动修改,必须更新leader索引才能修改follower索引,因为follower索引是只读,会拒绝任何配置写入。

尽管对leader索引的变更会被复制到follower索引,但是follow索引不能直接接受write,因此即使leader别名的IS_WRITE_INDEX属性被设置为TRUE,follower索引中也会将其强制修改为FALSE。

同样,客户端更新document也必须通过leader索引来进行。

当follower分片从leader分片获取到更新操作后,会将这些操作放进写缓冲区,然后使用缓冲区中的操作提交批量写请求。如果写缓冲区满(到达配置上线),则follower分片不会再向leader分片发送read请求。这为CCR提供了一种背压机制(back-pressure),让follower分片在缓冲区不满时恢复发送read请求,保障同步的稳定进行。

对leader索引映射的更改将尽可能快地复制到follower索引,对leader索引设置得更改同样如此(本地属性的设置除外),例如对leader索引副本数的更改不会被复制到follower索引,因此该设置可能无法被检索。

如果你的leader索引应用了一个非动态更新设置,且该设置需要被follower索引复制,那么follower索引会被关闭,更新设置,然后重新打开。follower索引在此期间将不可读写。

使用"远程恢复"过程初始化follower索引

follower索引创建后,需要初始化完成才可接受查询和数据同步操作。“远程恢复”过程通过拷贝leader集群主分片的数据在follower集群上建立新分片,可以理解为一次"全量恢复"。

远程恢复是一个网络密集型过程,会将leader集群的所有Lucene段文件传输至follower集群。follow集群首先请求leader集群启动一个恢复会话,然后并行地从leader集群请求多个文件块。默认一次同时拉取5个1MB的文件块,这一默认设置是为了支持具有高网络延迟的主从集群。

如下参数用于控制远程恢复过程:

参数

默认值含义
ccr.indices.recovery.max_bytes_per_sec40mb限制每个节点的出入流速
ccr.index.recovery.max_concurrent_file_chunks5控制每次恢复可以并行发送的文件块数,最大允许值为10
ccr.indices.recovery.chunk_size1mb传输的每个文件块的大小
ccr.indices.recovery.recovery_activity_timeout60s控制恢复活动的超时时间。此参数主要作用于leader集群。leader群集必须打开内存资源,以便在恢复过程中向follower提供数据。如果leader集群在这段时间内未收到来自follower的恢复请求,则将关闭资源。
ccr.indices.recovery.internal_action_timeout60s控制远程恢复过程中各个网络请求的超时时间。单个操作超时可能会使恢复失败。

可以在follower集群上通过

GET _cat/recovery?v=true

获取正在进行中的远程恢复详情。由于远程恢复使用快照恢复机制,因此上述结果中的远程恢复被标记为snapshot类型。

leader索引开启软删除

跨集群复制的原理是重放leader索引上的单个写入操作历史记录,因此leader分片需要保留历史操作记录以便给leader分片拉取。保留操作记录的基础机制就是"软删除(soft deletes)"。详细介绍可以参看:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-history-retention.html

index.soft_deletes.retention_lease.period设置定义了分片历史记录保留时长,超过此时间的记录被视为过期,这一设置也是follower集群可以脱机的最长时间,默认为12小时。如果在历史记录过期后,follower索引再次请求恢复,且过期的记录在leader索引上仍然可用,那么Elasticsearch会建立一个新的租约并拷贝这些记录。但是Elasticsearch并不保证保留未恢复的操作,因此可能某些过期的操作已被leader丢弃。如果发生这种情况,follower无法自动恢复,必须重新创建CCR过程。

leader索引必须启用软删除,Elasticsearch 7.0.0及以上版本的索引默认开启软删除。较早版本的Elasticsearch,则需要在创建索引时手动开启soft_delete属性,或者在索引模版中进行开启。另外soft_delete属性为static setting,不支持通过index/_settings进行动态修改,如果需要对存量的索引开启soft_delete,则必须通过reindex操作将数据复制到开启软删除的新索引上。

<think>好的,用户想了解CCR占空比的概念和计算方法,特别是关于PWM控制的部分。我需要先回顾一下PWM的基本原理,以及CCR在其中的作用。 首先,PWM(脉冲宽度调制)是通过调节脉冲的占空比来控制输出信号的一种方法。占空比指的是高电平时间占整个周期的比例。在STM32这类微控制器中,通常使用定时器的ARR和CCR寄存器来配置PWM的参数。 根据用户提供的引用内容,尤其是引用[1],里面提到ARR(自动重装载值)决定了PWM的周期。例如,ARR设置为20000,每个计数脉冲的时长是1微秒,那么总周期就是20毫秒。而CCR(捕获/比较寄存器)则用来设置高电平的持续时间,当计数器的值小于CCR时,输出高电平,否则变为低电平。因此,占空比的计算应该是CCR除以ARR的值,再乘以100%得到百分比。 不过,需要注意有些定时器的配置可能会有不同的计数模式,比如向上计数或向下计数,这可能会影响占空比的计算方式。但根据引用[1]的描述,CNT计数器是从0开始递增到ARR,然后重置,所以当CNT < CCR时输出高电平。这种情况下,占空比确实是CCR/(ARR+1),因为ARR的值是从0到ARR,共ARR+1个计数周期。不过,用户提供的例子中ARR是20000,得到的周期是20ms,每个计数是1us,那么ARR+1是否会影响呢?这里可能需要确认,但根据引用[1]的例子,ARR是20000,所以周期是20000*1us=20ms,说明ARR的值直接乘以每个计数的时间,没有加1,因此占空比应该是CCR/ARR。这里可能存在不同的理解,需要进一步核实。 另外,引用[3]提到占空比分别为2.5%、5%等,对应舵机的角度。例如,周期20ms,高电平时间0.5ms对应2.5%占空比,对应的舵机角度为0度。这种情况下,CCR的值应该是0.5ms / 1us = 500,而ARR是20000,所以占空比是500/20000=2.5%。这说明占空比的计算确实是CCR/ARR。 总结下来,占空比的公式应该是:占空比 = (CCR / ARR) × 100%。但需要确认定时器的计数模式是否从0到ARR-1,还是0到ARR。根据引用[1]中的例子,ARR=20000,周期是20ms,每个计数是1us,所以20000次计数就是20ms,因此ARR的值对应的是计数的次数,也就是从0到19999,共20000次计数?还是从0到20000,共20001次?这会影响占空比的计算。如果ARR设置为20000,实际计数到20000时溢出,所以计数值是从0到20000-1,即19999,因此ARR的值是周期次数,占空比应为CCR/(ARR) ×100%。例如,当CCR=500,ARR=20000,占空比是2.5%。所以公式正确。 用户可能还想知道如何根据所需的占空比来计算CCR的值。例如,如果已知占空比为D%,那么CCR = (D% × ARR) / 100。这在实际编程中非常有用,比如设置舵机的角度需要特定的占空比,通过调整CCR的值来实现。 此外,引用[4]提到STM32的PWM配置步骤,可能涉及到定时器的工作模式和寄存器设置,但用户的问题主要集中在计算公式上,所以这部分可能不需要深入,但需要确保公式的正确性。 需要提醒用户,不同的微控制器或定时器模块可能有不同的实现方式,例如是否在计数时包括ARR值,但根据提供的引用内容,特别是引用[1]中的例子,CCR占空比的计算是CCR除以ARR。因此,最终的公式应该是占空比 = (CCR / ARR) × 100%。 可能用户的应用场景是控制舵机,如引用[3]所述,占空比的范围通常在2.5%到12.5%之间,对应0度到180度。这时候,CCR的值可以根据这个比例来计算,比如ARR=20000,那么对应2.5%占空比的CCR=500,12.5%则是2500。 最后,需要确保回答结构清晰,分点说明定义、公式和例子,并引用提供的资料,特别是引用[1]和[3]中的例子来支持说明。</think>### CCR占空比的定义与计算方法 #### 1. **基本定义** 在PWM(脉冲宽度调制)控制中,**CCR**(捕获/比较寄存器)用于控制一个周期内高电平的持续时间。占空比定义为**高电平时间与整个PWM周期的比值**,通常以百分比表示。例如,若周期为$20\ \text{ms}$,高电平时间为$1\ \text{ms}$,则占空比为$5\%$[^1]。 #### 2. **计算公式** 占空比的核心公式为: $$ \text{占空比} = \frac{\text{CCR值}}{\text{ARR值}} \times 100\% $$ 其中: - **ARR**(自动重装载值)决定PWM周期,即$T = \text{ARR} \times \text{单个计数时间}$[^1]。 - **CCR**直接控制高电平的脉冲宽度,当计数器值$< \text{CCR}$时输出高电平,反之输出低电平。 #### 3. **具体示例** 假设定时器配置如下: - 时钟源频率:$72\ \text{MHz}$,分频系数$\text{PSC}=72$,则单个计数时间$=1\ \mu\text{s}$。 - $\text{ARR}=20000$,则周期$T=20000 \times 1\ \mu\text{s}=20\ \text{ms}$。 - 若$\text{CCR}=1500$,则高电平时间$=1500 \times 1\ \mu\text{s}=1.5\ \text{ms}$,占空比$=1500/20000 \times 100\%=7.5\%$[^3]。 #### 4. **应用场景** - **舵机控制**:通过调整CCR值改变占空比,例如$2.5\%$对应$0^\circ$,$12.5\%$对应$180^\circ$[^3]。 - **电机调速**:占空比越大,电机转速越高。 ```c // STM32配置示例(ARR=20000, CCR=1500) TIM3->ARR = 20000; // 设置周期 TIM3->CCR1 = 1500; // 设置高电平时间 ``` #### 5. **注意事项** - **计数模式**:若定时器为向上计数模式,占空比为$\text{CCR}/(\text{ARR}+1)$;若为中央对齐模式,需根据具体实现调整。 - **分辨率**:ARR值越大,占空比调节精度越高,但会降低PWM频率。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洒满阳光的午后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值