低版本Elasticsearch(不具备CCR)集群迁移方案
文章目录
一、迁移背景与目标
将现有 ES 集群 A 中的所有索引完整迁移至新集群 B,验证无误后安全下线集群 A。根据索引的读写特征,将所有待迁移索引分为三类,分别制定差异化迁移策略。
| 分类 | 特征描述 | 数量占比 |
|---|---|---|
| 静态索引 | 只读不写,数据不再变化 | |
| 一类变化索引 | 纯新增写入,历史数据不更新 | |
| 二类变化索引 | 既有新增写入,也有历史数据更新 |
二、总体迁移架构
#mermaid-svg-ZteMneI2r30KaetN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZteMneI2r30KaetN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZteMneI2r30KaetN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZteMneI2r30KaetN .error-icon{fill:#552222;}#mermaid-svg-ZteMneI2r30KaetN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZteMneI2r30KaetN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZteMneI2r30KaetN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZteMneI2r30KaetN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZteMneI2r30KaetN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZteMneI2r30KaetN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZteMneI2r30KaetN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZteMneI2r30KaetN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZteMneI2r30KaetN .marker.cross{stroke:#333333;}#mermaid-svg-ZteMneI2r30KaetN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZteMneI2r30KaetN p{margin:0;}#mermaid-svg-ZteMneI2r30KaetN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZteMneI2r30KaetN .cluster-label text{fill:#333;}#mermaid-svg-ZteMneI2r30KaetN .cluster-label span{color:#333;}#mermaid-svg-ZteMneI2r30KaetN .cluster-label span p{background-color:transparent;}#mermaid-svg-ZteMneI2r30KaetN .label text,#mermaid-svg-ZteMneI2r30KaetN span{fill:#333;color:#333;}#mermaid-svg-ZteMneI2r30KaetN .node rect,#mermaid-svg-ZteMneI2r30KaetN .node circle,#mermaid-svg-ZteMneI2r30KaetN .node ellipse,#mermaid-svg-ZteMneI2r30KaetN .node polygon,#mermaid-svg-ZteMneI2r30KaetN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZteMneI2r30KaetN .rough-node .label text,#mermaid-svg-ZteMneI2r30KaetN .node .label text,#mermaid-svg-ZteMneI2r30KaetN .image-shape .label,#mermaid-svg-ZteMneI2r30KaetN .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZteMneI2r30KaetN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZteMneI2r30KaetN .rough-node .label,#mermaid-svg-ZteMneI2r30KaetN .node .label,#mermaid-svg-ZteMneI2r30KaetN .image-shape .label,#mermaid-svg-ZteMneI2r30KaetN .icon-shape .label{text-align:center;}#mermaid-svg-ZteMneI2r30KaetN .node.clickable{cursor:pointer;}#mermaid-svg-ZteMneI2r30KaetN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZteMneI2r30KaetN .arrowheadPath{fill:#333333;}#mermaid-svg-ZteMneI2r30KaetN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZteMneI2r30KaetN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZteMneI2r30KaetN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZteMneI2r30KaetN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZteMneI2r30KaetN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZteMneI2r30KaetN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZteMneI2r30KaetN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZteMneI2r30KaetN .cluster text{fill:#333;}#mermaid-svg-ZteMneI2r30KaetN .cluster span{color:#333;}#mermaid-svg-ZteMneI2r30KaetN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZteMneI2r30KaetN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZteMneI2r30KaetN rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZteMneI2r30KaetN .icon-shape,#mermaid-svg-ZteMneI2r30KaetN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZteMneI2r30KaetN .icon-shape p,#mermaid-svg-ZteMneI2r30KaetN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZteMneI2r30KaetN .icon-shape .label rect,#mermaid-svg-ZteMneI2r30KaetN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZteMneI2r30KaetN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZteMneI2r30KaetN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZteMneI2r30KaetN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 目标集群 B
迁移管道
源集群 A(待下线)
一次性迁移
历史+增量
历史+增量+停写
静态索引
一类变化索引
二类变化索引
Reindex / Spark
Reindex + 增量同步
Reindex + 多轮增量
- 停写窗口最终同步
静态索引
一类变化索引
二类变化索引
三、分类型迁移方案详解
3.1 静态索引迁移(只读索引)
流程示意
#mermaid-svg-rAaH7jJDHj3eGucV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rAaH7jJDHj3eGucV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rAaH7jJDHj3eGucV .error-icon{fill:#552222;}#mermaid-svg-rAaH7jJDHj3eGucV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rAaH7jJDHj3eGucV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rAaH7jJDHj3eGucV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rAaH7jJDHj3eGucV .marker.cross{stroke:#333333;}#mermaid-svg-rAaH7jJDHj3eGucV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rAaH7jJDHj3eGucV p{margin:0;}#mermaid-svg-rAaH7jJDHj3eGucV .edge{stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .section--1 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section--1 path,#mermaid-svg-rAaH7jJDHj3eGucV .section--1 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section--1 text{fill:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth--1{stroke-width:17;}#mermaid-svg-rAaH7jJDHj3eGucV .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-0 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-0 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-0 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-0 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-0{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-0{stroke-width:14;}#mermaid-svg-rAaH7jJDHj3eGucV .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-1 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-1 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-1 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-1 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-1{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-1{stroke-width:11;}#mermaid-svg-rAaH7jJDHj3eGucV .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-2 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-2 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-2 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-2 text{fill:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-2{stroke-width:8;}#mermaid-svg-rAaH7jJDHj3eGucV .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-3 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-3 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-3 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-3 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-3{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-3{stroke-width:5;}#mermaid-svg-rAaH7jJDHj3eGucV .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-4 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-4 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-4 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-4 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-4{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-4{stroke-width:2;}#mermaid-svg-rAaH7jJDHj3eGucV .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-5 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-5 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-5 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-5 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-5{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-5{stroke-width:-1;}#mermaid-svg-rAaH7jJDHj3eGucV .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-6 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-6 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-6 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-6 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-6{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-6{stroke-width:-4;}#mermaid-svg-rAaH7jJDHj3eGucV .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-7 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-7 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-7 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-7 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-7{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-7{stroke-width:-7;}#mermaid-svg-rAaH7jJDHj3eGucV .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-8 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-8 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-8 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-8 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-8{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-8{stroke-width:-10;}#mermaid-svg-rAaH7jJDHj3eGucV .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-9 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-9 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-9 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-9 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-9{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-9{stroke-width:-13;}#mermaid-svg-rAaH7jJDHj3eGucV .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-10 rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-10 path,#mermaid-svg-rAaH7jJDHj3eGucV .section-10 circle,#mermaid-svg-rAaH7jJDHj3eGucV .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-10 text{fill:black;}#mermaid-svg-rAaH7jJDHj3eGucV .node-icon-10{font-size:40px;color:black;}#mermaid-svg-rAaH7jJDHj3eGucV .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .edge-depth-10{stroke-width:-16;}#mermaid-svg-rAaH7jJDHj3eGucV .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-rAaH7jJDHj3eGucV .lineWrapper line{stroke:black;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled,#mermaid-svg-rAaH7jJDHj3eGucV .disabled circle,#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:lightgray;}#mermaid-svg-rAaH7jJDHj3eGucV .disabled text{fill:#efefef;}#mermaid-svg-rAaH7jJDHj3eGucV .section-root rect,#mermaid-svg-rAaH7jJDHj3eGucV .section-root path,#mermaid-svg-rAaH7jJDHj3eGucV .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-rAaH7jJDHj3eGucV .section-root text{fill:#ffffff;}#mermaid-svg-rAaH7jJDHj3eGucV .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-rAaH7jJDHj3eGucV .edge{fill:none;}#mermaid-svg-rAaH7jJDHj3eGucV .eventWrapper{filter:brightness(120%);}#mermaid-svg-rAaH7jJDHj3eGucV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 准备阶段 Mapping/Settings 同步至 B 创建目标索引结构 数据迁移 Reindex 或者 Spark 按数据量进行分批次传输 数据校验 文档数量比对 抽样内容校验 流量切换 读请求灰度切至 B 全量切换 清理 集群 A 保留观察 ≥7天 确认无误后删除 静态索引迁移时间线
| 评估维度 | 评级 | 说明 |
|---|---|---|
| 数据一致性风险 | 低 | 数据不变,一次迁移即可保证一致 |
| 业务影响 | 无 | 不涉及写入,可随时执行 |
| 实施复杂度 | 简单 | 标准操作,无需额外开发 |
| 回滚难度 | 极低 | 集群 A 数据未删除前可随时回退 |
3.2 一类变化索引迁移(纯新增写入)
流程示意
#mermaid-svg-5nwfAH74N2uh5ZFe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5nwfAH74N2uh5ZFe .error-icon{fill:#552222;}#mermaid-svg-5nwfAH74N2uh5ZFe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5nwfAH74N2uh5ZFe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5nwfAH74N2uh5ZFe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5nwfAH74N2uh5ZFe .marker.cross{stroke:#333333;}#mermaid-svg-5nwfAH74N2uh5ZFe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5nwfAH74N2uh5ZFe p{margin:0;}#mermaid-svg-5nwfAH74N2uh5ZFe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster-label text{fill:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster-label span{color:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster-label span p{background-color:transparent;}#mermaid-svg-5nwfAH74N2uh5ZFe .label text,#mermaid-svg-5nwfAH74N2uh5ZFe span{fill:#333;color:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe .node rect,#mermaid-svg-5nwfAH74N2uh5ZFe .node circle,#mermaid-svg-5nwfAH74N2uh5ZFe .node ellipse,#mermaid-svg-5nwfAH74N2uh5ZFe .node polygon,#mermaid-svg-5nwfAH74N2uh5ZFe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5nwfAH74N2uh5ZFe .rough-node .label text,#mermaid-svg-5nwfAH74N2uh5ZFe .node .label text,#mermaid-svg-5nwfAH74N2uh5ZFe .image-shape .label,#mermaid-svg-5nwfAH74N2uh5ZFe .icon-shape .label{text-anchor:middle;}#mermaid-svg-5nwfAH74N2uh5ZFe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5nwfAH74N2uh5ZFe .rough-node .label,#mermaid-svg-5nwfAH74N2uh5ZFe .node .label,#mermaid-svg-5nwfAH74N2uh5ZFe .image-shape .label,#mermaid-svg-5nwfAH74N2uh5ZFe .icon-shape .label{text-align:center;}#mermaid-svg-5nwfAH74N2uh5ZFe .node.clickable{cursor:pointer;}#mermaid-svg-5nwfAH74N2uh5ZFe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5nwfAH74N2uh5ZFe .arrowheadPath{fill:#333333;}#mermaid-svg-5nwfAH74N2uh5ZFe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5nwfAH74N2uh5ZFe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5nwfAH74N2uh5ZFe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5nwfAH74N2uh5ZFe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5nwfAH74N2uh5ZFe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5nwfAH74N2uh5ZFe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster text{fill:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe .cluster span{color:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5nwfAH74N2uh5ZFe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5nwfAH74N2uh5ZFe rect.text{fill:none;stroke-width:0;}#mermaid-svg-5nwfAH74N2uh5ZFe .icon-shape,#mermaid-svg-5nwfAH74N2uh5ZFe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5nwfAH74N2uh5ZFe .icon-shape p,#mermaid-svg-5nwfAH74N2uh5ZFe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5nwfAH74N2uh5ZFe .icon-shape .label rect,#mermaid-svg-5nwfAH74N2uh5ZFe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5nwfAH74N2uh5ZFe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5nwfAH74N2uh5ZFe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5nwfAH74N2uh5ZFe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
开始
Reindex 同步历史数据
(集群A持续写入中)
历史数据
同步完成?
记录同步截止时间点 T₁
增量同步:查询 A 中
time > T₁ 的新增文档
差异数据量
< 阈值?
记录新时间点 T₂
T₁ ← T₂
⏸️ 短暂停写
(秒级/分钟级/小时级)
最终增量同步
数据校验通过?
排查并修复
客户端读写切换至 B
完成
增量识别策略
| 策略 | 适用条件 | 优点 | 缺点 |
|---|---|---|---|
| 时间字段过滤 | 索引含可靠写入时间字段 | 实现简单,查询高效 | 毫秒级精度可能遗漏并发写入 |
| _id 范围扫描 | _id 单调递增(如自增ID) | 无遗漏 | 依赖 ID 有序性,UUID 不适用 |
| 双写过渡 | 客户端可改造 | 零数据丢失 | 客户端写入延迟增加,改造成本高 |
| 业务字段 | 有特殊业务字段 | 实现简单,查询高效,零数据丢失 |
| 评估维度 | 评级 | 说明 |
|---|---|---|
| 数据一致性风险 | 中 | 增量窗口内可能存在少量遗漏 |
| 业务影响 | 轻微 | 最终切换需秒级停写 |
| 实施复杂度 | 中等 | 需开发增量同步逻辑与校验脚本 |
| 回滚难度 | 中等 | 切换后若发现问题需反向同步 |
建议
- 采用多轮收敛策略:每轮增量同步后缩小时间窗口,通常 3~5 轮可将差异降至百条以内
- 最终停写窗口控制在 5~10 秒内完成最终同步+校验
3.3 二类变化索引迁移(新增 + 更新)
流程示意
#mermaid-svg-VWHV6auYwtVuCpbK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VWHV6auYwtVuCpbK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VWHV6auYwtVuCpbK .error-icon{fill:#552222;}#mermaid-svg-VWHV6auYwtVuCpbK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VWHV6auYwtVuCpbK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VWHV6auYwtVuCpbK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VWHV6auYwtVuCpbK .marker.cross{stroke:#333333;}#mermaid-svg-VWHV6auYwtVuCpbK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VWHV6auYwtVuCpbK p{margin:0;}#mermaid-svg-VWHV6auYwtVuCpbK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VWHV6auYwtVuCpbK .cluster-label text{fill:#333;}#mermaid-svg-VWHV6auYwtVuCpbK .cluster-label span{color:#333;}#mermaid-svg-VWHV6auYwtVuCpbK .cluster-label span p{background-color:transparent;}#mermaid-svg-VWHV6auYwtVuCpbK .label text,#mermaid-svg-VWHV6auYwtVuCpbK span{fill:#333;color:#333;}#mermaid-svg-VWHV6auYwtVuCpbK .node rect,#mermaid-svg-VWHV6auYwtVuCpbK .node circle,#mermaid-svg-VWHV6auYwtVuCpbK .node ellipse,#mermaid-svg-VWHV6auYwtVuCpbK .node polygon,#mermaid-svg-VWHV6auYwtVuCpbK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VWHV6auYwtVuCpbK .rough-node .label text,#mermaid-svg-VWHV6auYwtVuCpbK .node .label text,#mermaid-svg-VWHV6auYwtVuCpbK .image-shape .label,#mermaid-svg-VWHV6auYwtVuCpbK .icon-shape .label{text-anchor:middle;}#mermaid-svg-VWHV6auYwtVuCpbK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VWHV6auYwtVuCpbK .rough-node .label,#mermaid-svg-VWHV6auYwtVuCpbK .node .label,#mermaid-svg-VWHV6auYwtVuCpbK .image-shape .label,#mermaid-svg-VWHV6auYwtVuCpbK .icon-shape .label{text-align:center;}#mermaid-svg-VWHV6auYwtVuCpbK .node.clickable{cursor:pointer;}#mermaid-svg-VWHV6auYwtVuCpbK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VWHV6auYwtVuCpbK .arrowheadPath{fill:#333333;}#mermaid-svg-VWHV6auYwtVuCpbK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VWHV6auYwtVuCpbK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VWHV6auYwtVuCpbK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VWHV6auYwtVuCpbK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VWHV6auYwtVuCpbK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VWHV6auYwtVuCpbK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VWHV6auYwtVuCpbK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VWHV6auYwtVuCpbK .cluster text{fill:#333;}#mermaid-svg-VWHV6auYwtVuCpbK .cluster span{color:#333;}#mermaid-svg-VWHV6auYwtVuCpbK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VWHV6auYwtVuCpbK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VWHV6auYwtVuCpbK rect.text{fill:none;stroke-width:0;}#mermaid-svg-VWHV6auYwtVuCpbK .icon-shape,#mermaid-svg-VWHV6auYwtVuCpbK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VWHV6auYwtVuCpbK .icon-shape p,#mermaid-svg-VWHV6auYwtVuCpbK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VWHV6auYwtVuCpbK .icon-shape .label rect,#mermaid-svg-VWHV6auYwtVuCpbK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VWHV6auYwtVuCpbK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VWHV6auYwtVuCpbK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VWHV6auYwtVuCpbK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
否
是
开始
Reindex 同步历史数据
多轮增量同步
(基于 update_time 追踪变更)
差异收敛步
至可接受范围?
通知业务方
预约停写窗口
⛔ 客户端停止写入
执行最终全量差异同步
B 集群数据
与 A 完全一致?
重试 / 人工介入
✅ 客户端读写切换至 B
验证通过?
回滚至集群 A
排查问题后重新迁移
迁移完成
| 评估维度 | 评级 | 说明 |
|---|---|---|
| 数据一致性风险 | 高 | 更新操作的增量识别复杂,易遗漏 |
| 业务影响 | 显著 | 必须停写,窗口大小取决于差异数据量 |
| 实施复杂度 | 复杂 | 需精确追踪更新、设计停写流程、准备回滚预案 |
| 回滚难度 | 较高 | 切换后若 B 数据异常,反向同步涉及更新合并 |
建议(重点)
存在历史数据更新的操作,导致无法消除停写窗口。
能做的优化是:尽量【缩小】停写窗口。
#mermaid-svg-vcr74OYJZuwiTRqj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vcr74OYJZuwiTRqj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vcr74OYJZuwiTRqj .error-icon{fill:#552222;}#mermaid-svg-vcr74OYJZuwiTRqj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vcr74OYJZuwiTRqj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vcr74OYJZuwiTRqj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vcr74OYJZuwiTRqj .marker.cross{stroke:#333333;}#mermaid-svg-vcr74OYJZuwiTRqj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vcr74OYJZuwiTRqj p{margin:0;}#mermaid-svg-vcr74OYJZuwiTRqj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vcr74OYJZuwiTRqj .cluster-label text{fill:#333;}#mermaid-svg-vcr74OYJZuwiTRqj .cluster-label span{color:#333;}#mermaid-svg-vcr74OYJZuwiTRqj .cluster-label span p{background-color:transparent;}#mermaid-svg-vcr74OYJZuwiTRqj .label text,#mermaid-svg-vcr74OYJZuwiTRqj span{fill:#333;color:#333;}#mermaid-svg-vcr74OYJZuwiTRqj .node rect,#mermaid-svg-vcr74OYJZuwiTRqj .node circle,#mermaid-svg-vcr74OYJZuwiTRqj .node ellipse,#mermaid-svg-vcr74OYJZuwiTRqj .node polygon,#mermaid-svg-vcr74OYJZuwiTRqj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vcr74OYJZuwiTRqj .rough-node .label text,#mermaid-svg-vcr74OYJZuwiTRqj .node .label text,#mermaid-svg-vcr74OYJZuwiTRqj .image-shape .label,#mermaid-svg-vcr74OYJZuwiTRqj .icon-shape .label{text-anchor:middle;}#mermaid-svg-vcr74OYJZuwiTRqj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vcr74OYJZuwiTRqj .rough-node .label,#mermaid-svg-vcr74OYJZuwiTRqj .node .label,#mermaid-svg-vcr74OYJZuwiTRqj .image-shape .label,#mermaid-svg-vcr74OYJZuwiTRqj .icon-shape .label{text-align:center;}#mermaid-svg-vcr74OYJZuwiTRqj .node.clickable{cursor:pointer;}#mermaid-svg-vcr74OYJZuwiTRqj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vcr74OYJZuwiTRqj .arrowheadPath{fill:#333333;}#mermaid-svg-vcr74OYJZuwiTRqj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vcr74OYJZuwiTRqj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vcr74OYJZuwiTRqj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vcr74OYJZuwiTRqj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vcr74OYJZuwiTRqj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vcr74OYJZuwiTRqj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vcr74OYJZuwiTRqj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vcr74OYJZuwiTRqj .cluster text{fill:#333;}#mermaid-svg-vcr74OYJZuwiTRqj .cluster span{color:#333;}#mermaid-svg-vcr74OYJZuwiTRqj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vcr74OYJZuwiTRqj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vcr74OYJZuwiTRqj rect.text{fill:none;stroke-width:0;}#mermaid-svg-vcr74OYJZuwiTRqj .icon-shape,#mermaid-svg-vcr74OYJZuwiTRqj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vcr74OYJZuwiTRqj .icon-shape p,#mermaid-svg-vcr74OYJZuwiTRqj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vcr74OYJZuwiTRqj .icon-shape .label rect,#mermaid-svg-vcr74OYJZuwiTRqj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vcr74OYJZuwiTRqj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vcr74OYJZuwiTRqj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vcr74OYJZuwiTRqj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 切换后
⛔ 停写窗口(必存在)
停写前:尽量缩小差异
Reindex 历史
基于 update_time 多轮增量
(追平大部分变更)
差异量收敛到
可接受范围
客户端停止写入
等待进行中的写操作完成
(几秒?)
最终一轮差异同步
(此时数据是静态的,
可以精确比对)
数据校验
客户端读写切至B
灰度验证
四、风险评估矩阵
#mermaid-svg-UVKXLCe3XXmzoa50{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UVKXLCe3XXmzoa50 .error-icon{fill:#552222;}#mermaid-svg-UVKXLCe3XXmzoa50 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UVKXLCe3XXmzoa50 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UVKXLCe3XXmzoa50 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UVKXLCe3XXmzoa50 .marker.cross{stroke:#333333;}#mermaid-svg-UVKXLCe3XXmzoa50 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UVKXLCe3XXmzoa50 p{margin:0;}#mermaid-svg-UVKXLCe3XXmzoa50 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🔴 重点关注 谨慎推进 优先执行 稳步推进 二类变化索引 一类变化索引 静态索引 低业务影响 高业务影响 低数据风险 高数据风险 迁移风险四象限评估
五、迁移执行路线图
- 准备工作
索引/索引模板同步
数据校验脚本开发
回滚方案评审? - 第一批:静态索引
Snapshot/Restore 迁移
数据校验 & 读流量切换
观察期 - 第二批:一类变化索引
历史数据 Reindex
增量同步 & 收敛
停写切换 & 校验
观察期 - 第三批:二类变化索引
历史数据 Reindex
多轮增量同步
停写窗口 & 最终同步
灰度切流验证
观察期 - 收尾
集群 A 正式下线
六、关键保障措施清单
6.1 迁移前必做
| 序号 | 事项 | 负责方 | 状态 |
|---|---|---|---|
| 1 | Mapping / Settings / Index Templates 同步至 B | ||
| 2 | 别名(Aliases)迁移规划与脚本准备 | ||
| 3 | 集群 B 容量评估(磁盘/内存/CPU/节点数) | ||
| 4 | 数据校验工具/脚本开发与测试 | ||
| 5 | 回滚方案编写与评审 | ||
| 6 | 业务方停写窗口沟通与确认(二类索引) | ||
| 7 | 监控告警配置(B 集群性能、迁移进度) |
6.2 迁移后必验
| 序号 | 校验项 | 方法 | 通过标准 |
|---|---|---|---|
| 1 | Document Count | _count API 逐索引比对 |
A == B |
| 2 | 抽样数据内容 | 随机抽取 1000 条逐字段比对 | 100% 一致 |
| 3 | 聚合查询结果 | 相同 DSL 在 A/B 执行比对 | 结果一致 |
| 4 | 读写性能 | 压测 B 集群核心查询 | P99 ≤ A 集群基线 |
| 5 | 灰度切流 | 10%→30%→50%→100% 逐步放量 | 错误率 < 0.01% |
6.3 客户端切换策略
#mermaid-svg-ZGsVQ6gHa6E5mTOn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .error-icon{fill:#552222;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .marker.cross{stroke:#333333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn p{margin:0;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster-label text{fill:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster-label span{color:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster-label span p{background-color:transparent;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .label text,#mermaid-svg-ZGsVQ6gHa6E5mTOn span{fill:#333;color:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .node rect,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node circle,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node ellipse,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node polygon,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .rough-node .label text,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node .label text,#mermaid-svg-ZGsVQ6gHa6E5mTOn .image-shape .label,#mermaid-svg-ZGsVQ6gHa6E5mTOn .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .rough-node .label,#mermaid-svg-ZGsVQ6gHa6E5mTOn .node .label,#mermaid-svg-ZGsVQ6gHa6E5mTOn .image-shape .label,#mermaid-svg-ZGsVQ6gHa6E5mTOn .icon-shape .label{text-align:center;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .node.clickable{cursor:pointer;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .arrowheadPath{fill:#333333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZGsVQ6gHa6E5mTOn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZGsVQ6gHa6E5mTOn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster text{fill:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .cluster span{color:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZGsVQ6gHa6E5mTOn rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .icon-shape,#mermaid-svg-ZGsVQ6gHa6E5mTOn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .icon-shape p,#mermaid-svg-ZGsVQ6gHa6E5mTOn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .icon-shape .label rect,#mermaid-svg-ZGsVQ6gHa6E5mTOn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZGsVQ6gHa6E5mTOn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZGsVQ6gHa6E5mTOn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZGsVQ6gHa6E5mTOn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Step1: 10%
Step1: 90%
Step2: 50%
Step2: 50%
Step3: 100%
负载均衡 / API Gateway
集群 B
集群 A
负载均衡 / API Gateway
集群 B
集群 A
负载均衡 / API Gateway
集群 B