使用极限网关实现 ES 跨集群搜索

使用 ES 的小伙伴,有没有在用跨集群搜索的? 熟悉 ES 的小伙伴都知道,ES 本身就能实现跨集群搜索,那为啥还要聊这个?试想一下,如果集群都上线投产了,才出现跨集群搜索需求,那么可能出现两种情况:

  1. 两个集群都使用了证书加密传输,要实现互联,需要重新设置证书,还要重启集群;
  2. 两个集群之间可能网络不能互通;

到了这里,我们的 极限网关 就派的上用场了。在以上场景中,只要网关能顺利连接到各个集群就行了。
话不多说,我们来 demo 一下。

数据准备

集群 A,含有 test 和 test-2 索引,数据很简单。

集群 B,含有 test-follower 和 test-3 索引,其中 test-follower 索引是集群 A 的复制索引

网关配置

网关配置使用专门的 merge_cross_search_results 配置。

做个简单的演示,只需修改这三个变量。

  • LR_ELASTICSEARCH_ENDPOINT1 : 代表集群 A ;
  • LR_ELASTICSEARCH_ENDPOINT2 : 代表集群 B ;
  • LR_ELASTICSEARCH_ENDPOINT3 : 代表默认集群,可以复用集群 A 或 B ;

集群 A 和 B 是我们要做跨集群搜索的,搜索请求会在这两个集群执行,然后合并结果。

非搜索请求会发送到这个 LR_ELASTICSEARCH_ENDPOINT3 指定的集群,但是 _cat/indices?format=json 会显示集群 A 和 B 的索引。

跨集群搜索

测试一

通配符 test* 查询集群 A 和 B ,所有数据,注意查询语法,必须包含冒号。

结果包含了集群 A 的索引:test 和 test-2 ,以及集群 B 的索引:test-follower 和 test-3 。

测试二

通配符 test* 查询集群 A 和 B ,包含关键字 cluster 的内容。

测试三

通配符 test* 查询集群 A 和 B ,进行聚合查询。

测试四

通配符 test* 查询集群 A 和 B ,进行带查询条件的聚合查询。

测试五

显示集群 A 和 B 的所有索引。

最后

这次的分享就到这里了,相信大家也看到了极限网关是非常灵活的。欢迎与我一起交流 ES 的各种问题和解决方案。

<think> 嗯,用户现在明确要使用reindex实现跨集群的不停机数据同步,看来是在迁移或灾备场景下有硬性需求。之前我已经详细介绍了CCR、Logstash和快照三种方案,但用户特别强调要用reindex,可能因为团队技术栈限制或版本限制(比如开源版ES无法使用CCR)。 用户引用的资料[1][2][3][4]都集中在单集群reindex优化,这给了我关键提示:需要把单集群的别名切换技巧扩展到跨集群场景。尤其是引用[4]展示的alias原子切换操作,这是实现不停机的核心——但跨集群时不能直接使用alias,需要设计替代方案。 具体难点有两个:一是跨集群reindex时如何保持增量同步,二是如何实现无缝切换。对于第一个问题,可以通过时间戳过滤+滚动reindex解决,类似引用[2]提到的分批操作思路;第二个问题则需要改造单集群的alias方案,改用双写过渡或网关层切换。 用户应该正在生产环境操作,所以需要特别强调风险点:跨集群reindex的网络稳定性要求比单集群高得多,一旦超时会导致整个序列重试(引用[3]提到conflicts参数只是治标)。必须提醒准备回滚方案,比如保留旧集群写入通道的fallback机制。 另外注意到用户引用的资料都来自中文社区,可能团队更习惯中文技术文档。在回复时需要保持中文术语一致性,比如把"alias"统一译为"别名","reindex"保留英文但加粗强调。 最后生成的问题要覆盖用户可能忽略的环节:比如数据验证方法(引用[1]提到的最佳实践)、性能监控指标(引用[2]强调的耗时问题),这些都是生产环境真正实施时必然遇到的卡点。 </think>以下是使用 `_reindex` API 实现 Elasticsearch **不停机跨集群同步数据**的完整方案,结合别名机制保障业务连续性: --- ### 核心步骤(基于别名切换) #### 1. **目标集群创建新索引** ```bash # 在目标集群创建与源集群相同结构的索引 PUT /target_index_v1 { "settings": { "number_of_shards": 3 }, "mappings": { /* 与源索引一致 */ } } ``` #### 2. **配置跨集群连接** ```bash # 在目标集群添加源集群地址 PUT /_cluster/settings { "persistent": { "cluster.remote.source_cluster.seeds": ["source_host:9300"] } } ``` #### 3. **执行首次全量同步** ```bash # 从源集群拉取全量数据(关键参数说明见下表↓) POST /_reindex?wait_for_completion=false { "source": { "remote": { "cluster": "source_cluster" }, "index": "source_index", "size": 5000 // 分批大小 }, "dest": { "index": "target_index_v1", "op_type": "create" // 避免覆盖已存在文档 } } ``` | 参数 | 作用 | 推荐值 | |------|------|--------| | `wait_for_completion=false` | 异步执行 | 必选 | | `size` | 每批处理文档数 | 3000-10000 | | `op_type: create` | 防重复写入 | 全量同步时启用 | #### 4. **增量同步(滚动更新)** ```bash # 定时任务执行增量同步(基于更新时间戳) POST /_reindex { "source": { "remote": { "cluster": "source_cluster" }, "index": "source_index", "query": { "range": { "@timestamp": { "gte": "now-5m" } } // 同步最近5分钟数据 } }, "dest": { "index": "target_index_v1" } } ``` #### 5. **业务切换(零停机关键)** ```bash # 步骤1:为目标索引添加别名(不影响源集群) POST /_aliases { "actions": [ { "add": { "index": "target_index_v1", "alias": "production_index" } } ] } # 步骤2:应用层切换配置指向目标集群 # (无需重启服务,通过配置中心更新ES连接地址) # 步骤3:停止源集群写入(短暂禁写) PUT /source_index/_settings { "index.blocks.write": true } # 步骤4:执行最后一次增量同步(追平差异) # 重复步骤4的_reindex操作(时间范围=禁写时刻至今) # 步骤5:解除源集群禁写(业务已切换完毕) PUT /source_index/_settings { "index.blocks.write": false } ``` --- ### 性能优化技巧 1. **提升同步速度** ```bash POST /_reindex?requests_per_second=5000 # 限流防拥塞 ``` - 调整 `slices` 并行度:`slices=auto`(按分片数自动并发) - 目标集群刷新间隔:`"refresh_interval": "-1"`(同步期间禁用刷新) 2. **网络瓶颈解决方案** ```bash # 在源集群部署协调节点 node.roles: ["remote_cluster_client"] ``` - 压缩传输数据:`source.remote.filter_path=["_id","_source"]` - 启用传输压缩:`transport.compress: true` 3. **数据一致性验证** ```bash # 对比文档数量 GET /source_index/_count GET /target_index_v1/_count # 抽样校验文档内容 GET /source_index/_search?size=100 GET /target_index_v1/_search?size=100 ``` --- ### 灾备回滚方案 当目标集群异常时快速回切: ```bash # 1. 将别名切回源集群索引 POST /_aliases { "actions": [ { "remove": { "index": "target_index_v1", "alias": "production_index" }}, { "add": { "index": "source_index", "alias": "production_index" }} ] } # 2. 应用层配置切回源集群地址 ``` --- ### 注意事项 1. **版本兼容性** - 跨集群版本差 ≤ 1个大版本(如 7.x ↔ 8.x) - 使用 `?wait_for_completion=false` 避免超时中断[^2] 2. **文档冲突处理** - 全量同步用 `op_type: create` 避免覆盖 - 增量同步用 `version_type: external` 保留版本号 3. **监控指标** ```bash GET /_tasks?detailed=true&actions=*reindex ``` - 监控 `response.updated`/`response.created` - 报警条件:`response.version_conflicts > 0` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值