跨集群复制(CCR)
跨集群复制(CCR)
复制经常被采用的策略:从translog拿到更新的历史,把它放到queue里面,然后拿到远程集群去重放所有的action,以达到回放的目的。
同样的ccr工程团队也是优先考虑回放translog,但是很快意识到lucene的translog不能实现快速高效的复制,尝试在translog上增加新的data structures把数据更新动作记录下来,但是lucene是关键的组件涉及复杂的修改,会对整体性能和稳定性有影响。
ccr工程团队尽量采用简单地实现认为功能的实现内置到lucece根基,不应该通过外围的方式实现,
首先lucece只有insert和delete,updata是标记为删除,并且insert一条新的数据。
复制工作需要的基本条件是需要有一个序列号(sequence ID),对lucene索引的操作都有唯一的序列号,添加seq ID后三个应用的设想:
1.可以获取这个ID以后所有操作的步骤;
2.可以快速恢复,集群如果挂了会在别的节点拷贝segment但是耗时长;可以选择translog重放指定seq ID之后的动作;
3.跨集群复制;
Sequence ID
seq ID的添加相当于彻底重写了数据复制逻辑。
1.实现seq ID仅仅seqno是不够的,为什么?
其实给每一个操作加一个seq no远不够,因为es是一个分布式的系统,seqno一定是主分片(primary)负责更新的,因为es所有的写动作一定是先在主分片中verify确认写的有效性,然后在并发在所有副分片同时执行并且等待所有的动作都comfirm后才返回客户端。所以所有的操作是先发生在主分片,如果主分片挂了,副分片提升为主分片,当并发读写很大或者网络分割切换主分片容易出现:原主分片还有残留地读写,新主分片也在读写那么两个分片上生成一样的seqno,这就会在恢复的时候发生冲突,如何处理这种情况?sequence ID = _seq_no + _primary_term,如果出现了主分片的切换,term的值会+1,term可以在cluster stat里面查看,也可在写入数据会返回term值。网络割裂的时候可以通过seq ID获取对应的操作,是存储在lucece文件中,具体指docvalue中。
curl -k -vv -XPOST "https://{ip:port}/foo/doc?pretty" -H 'Content-Type: application/json' --cacert /cert/root-ca.pem --key /cert/{ip}.key.pem --cert /cert/{ip}.crt -d'{"bar" : "baz"}'
查询结果如下:
当有seq ID,下一步是标记现在的操作做到哪一步,引入两个标志位local checkpoint和global checkpoint。
local checkpoint 是指在shard内部操作的标志位,代表这个数字之前的所以操作在这个shards内部操作成功,即成功落盘。
对于一个集群每个数据有多个副本,global checkpoint 代表这个number以前的所有操作在主分片和副分片中都执行成功的,是由primary shards负责更新,包括seqID也是由primary shards负责生成,在副本向主分片确认任何一笔写操作时,都会返回local checkpoint给主分片,因为主分片需要知道副分片哪些已经写成功了,主分片会汇总所有副本上游标位置来确定是否更新global checkpoint。
如此快速恢复不需要比较所有的操作,只要回放最近的global checkpoint以后的操作,提供了非常明显的界限。global checkpoint以前的操作是所有副本确认生效的,回放游标以后的操作。
但是并非所有的恢复都会回放operation 重做只针对于分片落后比较小。如果分片已经断线很久和别的分片差别很大回放耗时时间长,会直接拷贝segment。
Soft delete
- lucene原来是怎么delete文档的?
通过标志位,segment刷到磁盘是不会改变的,删除文档只是在另外文件中添加删除标记,这个文件只有在段合并的时候会读那些文档已经被逻辑删除,然后在磁盘中删除相应segment merge生成更大的segment文件。
标记删除后merge真正的删除称为hard delete,因为收到merge干扰。
为了实现跨集群复制,引入soft delete。
所有删除的操作在复制到远端的集群前是不可以被merge删除segment的,否则远端集群会缺少一个删除的动作。
为此,用软删除去保存在Lucene的删除操作,以便用于重放。即:lucene 可以标记一个字段为soft delete,不会被merge删除,直到操作被完整成复制到远端集群时,soft delete转变为原来lucene delete之后merge删除。那么这个soft delete会维持多久,什么时候可以被真正删除?
复制到远端集群,如果远端集群的通讯断了,游标一直保持在原来的位置会导致soft delete的文档越来越多,后续操作都不能merge 删除,对查询效率有影响。为控制无限制的增长,引入retention lease 代表如果soft delete多长时间内是有效的,超过retention lease 时间soft delete标记被删除,段合并后被删除。
CCR 复制流程
1.以索引为单位建立follow拉取;
2.一对多复制,支持多个cluster同时follow一个索引;
3.follow是单向、主从机制:复制过程中,leader index支持增删改,follow index只读。
CCR通讯链路上的复制
简单来说采用long pull机制由follow index拉取,由远端集群发送请求给主集群,主集群检查是否有operation需要发给客户端,如果需要会立即响应并持续不断的发给客户端。如果没有需要同步的数据,server端会在timeout时间内把连接block住,没有断开连接,并且在这段时间内反复检查是否有数据发送,最后回包给客户端,客户端收到回包立即发出下一个请求。
微观结构分析
以索引为单位建立follow,一个索引有多个分片,微观上是shard为单位建立follow,所以主从索引的分片一致。
seq ID和soft delete是lucene的机制,一个shard是完整的lucene数据结构。
如图,retention lease2标记坐标的操作都已经被复制,可以被merge删除,注意:有N个远端集群对应有N个retention lease。所以lucene merge删除时会选择最小lease 之前的segment可删除,由主分片维护retention lease。
复制流程
- 初始阶段(initialize stage)
为提升效率,初始阶段会把主集群的segment以文件拷贝的形式 拷贝到远端集群,当initialize stage结束后进入到follow stage。 - follow stage
这阶段会把operation拿到远端重放,加快同步速度。 - pause follow
pause follow时,主分片会记住retention lease的状态和游标位置,还有一种情况网络中断,连接重试直至retention lease超时,retention lease一旦失效两个索引不可能再同步因为部分segment已经被merge删除,有些操作无法追踪。 - unfollw
unfollow之后还能被重新follow, 之前的segment也会被merge删除,需要重新intialize
主数据中心挂了,将follow index变成 leader index。现阶段seqID业务冲突难处理,segment拷贝会导致恢复速度并不很快
#pause replication
post /<follow_index>/_ccr/pause_follow
#close index
post /<leader_index>/_ccr/pause_follow
#unfollow
post /<follow_index>/_ccr/unfollow
#open the index
post /<leader_index>/_ccr/open
- 双向复制场景
6 创建auto follow
curl -k -vv -XPUT "https://{ip:port}/_ccr/auto_follow/beats" --cacert /cert/root-ca.pem --key /cert/{ip}.key.pem --cert/cert/{ip}.crt -d'{"remote_cluster" : "lqt_index","leader_index_patterns" : ["lqt_*","wx_bill_*"],"follow_index_pattern":"{{leader_index}}-copy"}'
跨集群复制(CCR)相关推荐
- Elastic:集群相关知识点总结(一)数据流 Data Stream、索引生命周期 ILM、可搜索快照 searchable snapshots、跨集群搜索 CCS、跨集群复制 CCR
0.引言 集群管理是ES的核心重点,因此相关的知识点至关重要,本期主要针对数据流.索引生命周期.可搜索快照.跨集群搜索.跨集群复制进行讲解 1.数据流 Data Stream 官方文档:Data st ...
- Elasticsearch(CCR)主从同步之跨集群复制
注: 部分概念介绍来源于网络 1.跨集群复制Cross-cluster replication (CCR) 跨集群复制最早发布版本Elasticsearch 6.7 版本 跨集群复制 (CCR) 功能 ...
- Elasticsearch:跨集群复制 Cross-cluster replication(CCR)
跨集群复制(CCR)功能支持将远程集群中的索引复制到本地集群. 可以在一些常见的生产用例中使用此功能: 灾难恢复(DR)/高可用性(HA):如果主群集发生故障,则进行灾难恢复. 辅助群集可以用作热备份 ...
- Elasticsearch跨集群复制(CCR)介绍
跨集群复制(CCR,cross-cluster replication)属于xpack增强包中的功能,需要白金级.企业级证书才可使用.CCR可以将远程集群(leader)中的索引复制到本地集群(fol ...
- 最佳实践 | 基于腾讯云ES如何跨地域容灾?跨集群复制为您解忧!
作者:吴容,腾讯云大数据Elasticsearch高级开发工程师 腾讯云大数据ES目前已经提供了多可用区部署,即支持同地域跨机房的高可用容灾方案,满足了绝大多数客户的需求.但是依然会有部分客户希望进一 ...
- elastic 跨集群复制 cross cluster replication
CCR 是一项白金级功能,开源免费版不支持这个功能. 可通过 30 天试用许可证获取:该许可证既可通过 start trial API 激活 ,也可以直接从 Kibana 激活. 1. kibana激 ...
- Hadoop 跨集群复制文件
hadoop distcp -pbc hdfs://namenode1/test hdfs://namenode2/test 如果报用户权限写入被拒绝,切换到hdfs
- 3分钟学会使用Elasticsearch跨集群复制功能(CCR)
当您需要将本地Elasticsearch集群中的索引数据迁移到一个远程集群中,或者将一个远程集群中的索引数据迁移到本地集群,可通过跨集群复制CCR(Cross Cluster Replication) ...
- Mysql集群拆分_MySQL 5.7跨集群拆分迁移
一.背景 一些业务时间久了之后,会进行一些业务逻辑的修改,通常也需要数据库的拆分迁移.这里假设源数据库为集群A(每个集群中仅有一个数据库,这里集群A就代表了数据库A),目标数据库为数据库B.C,之前甲 ...
最新文章
- ASP.NET MVC上传文件----uploadify的使用
- python 百度词典_python在线抓取百度词典的翻译结果翻译单词
- python死机_请问下为什么我用PYTHON写编译器一旦用READ就死机
- 开创先河!《王者荣耀国际版》成为东南亚运动会正式比赛项目
- 请你努力成为一名优秀的软件工程师,拒绝做优秀的码农!
- 第二百零一天 how can I坚持
- 全球最年轻的Python程序员;13 岁创建 RISC-V 内核,后浪程序员有多恐怖?
- 在.NET中调用Oracle9i存储过程经验总结
- 一个对oi选手的感想
- 国外GIS资源网站分类整理 来自www.gis520.com
- SCAU高级语言程序设计--实验4 选择结构(3)
- R统计绘图-使用rgl或pca3D包绘制3DPCA图
- wordpress媒体库增加分类和标签
- 如何使用Python进行投资收益和风险分析
- 【iOS】Sign in with Apple
- ppt编写一个抽奖系统_PPT抽奖程序
- 腾讯2018春招实习生和秋招面试问题
- 复数的辐角的主值的计算公式
- 禁止Altium designer(其他软件同样适用)联网的配置操作
- 高效又稳定的ChatGPT大模型训练技巧总结,让训练事半功倍!
热门文章
- CUDA:CUDA out of memory. Tried to allocate 100.00 MiB (GPU 0; 15.78 GiB total capacity; 14.24 GiB al
- 苹果第一台计算机的诞生的,纪念Mac诞生30周年:第一台Mac电脑深度拆解
- 学习笔记【Java 虚拟机②】垃圾回收
- java怎么求偏态函数_偏态分布的均值与中位数关系
- react+antd实现图片上传并且剪裁(请参照最新文章,此案例有bug)
- 重装系统失败解决办法|修复方法
- Microsoft Graph for Office 365 - 认证和授权场景
- python爬取flash数据_python爬虫: 爬取flash播放页面的信息
- c语言visit_数据结构(c语言)——入门数据结构的世界:顺序线性表(一)
- 关于void (visit)(const ElemType )的理解