Elasticsearch 跨集群复制(CCR)配置失败通常源于远程集群连接未建立、许可证权限不足或网络通信受阻。注意区分 CCR(复制)与 CCS(搜索),本文针对 CCR 同步失败场景。
先说结论:大部分 CCR 报错是因为远程集群未正确注册或节点间传输层通信失败,先检查 remote clusters 配置再查看日志堆栈。
- 先确认:许可证是否支持 CCR 功能(Gold 及以上)且远程集群名称不冲突
- 先处理:修复 transport 端口连通性及 SSL 证书信任链
- 再验证:通过 _ccr/stats 接口确认复制状态是否转为 active
前置条件与许可证检查
CCR 属于 X-Pack 高级功能,基础版(Basic)许可证无法启用。执行以下命令确认许可证状态,features 中需包含 ccr。
GET _license
若 type 为 basic 或 ccr 状态为 false,需升级至 Gold、Platinum 或 Enterprise 版。此外,CCR 自 6.7 版本引入,建议领导集群(Leader)与跟随集群(Follower)版本保持一致,或跟随集群版本不低于领导集群。
远程集群配置实操
在跟随集群上注册领导集群信息。不要仅查看配置,需确保写入生效。以下命令将远程集群命名为 leader_cluster。
PUT _cluster/settings
{"persistent": {"cluster.remote.leader_cluster.seeds": ["192.168.1.10:9300", "192.168.1.11:9300"]}
}配置完成后,再次检查连接状态:
GET _remote/info
若 connected 为 false,检查网络防火墙是否放行 transport.port(默认 9300)。
SSL 与安全配置示例
若集群启用 xpack security,需在 elasticsearch.yml 中配置传输层 SSL。常见配置缺失导致 handshake_failure。
# elasticsearch.yml 配置示例 xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.certificate_authorities: ["certs/ca.crt"] xpack.security.transport.ssl.certificate: "certs/elastic-certificates.crt" xpack.security.transport.ssl.key: "certs/elastic-certificates.key"
配置修改后需重启节点生效。确保证书路径正确且文件权限可读。
创建跟随索引
远程集群连通后,需显式创建跟随索引。以下命令将远程 leader_index 同步到本地 follower_index。
PUT follower_index/_ccr/follow
{"remote_cluster": "leader_cluster","leader_index": "leader_index"
}典型报错与解决方案
| 报错信息/日志关键词 | 可能原因 | 解决方案 |
|---|---|---|
| security_exception: missing authentication token | 未配置远程集群认证信息 | 在 _cluster/settings 中补充 cluster.remote.<name>.skip_unavailable 及认证配置 |
| remote_transport_exception: ConnectException | 网络不通或端口被防火墙拦截 | telnet 检查 9300 端口,确认 seeds 地址可达 |
| license_exception: CCR feature not enabled | 许可证等级不足 | 升级许可证至 Gold 及以上版本 |
| index_block_exception: read_only_allow_delete | 领导集群索引被锁定 | 检查领导集群索引设置,解除只读锁定 |
验证与监控
执行 _ccr/stats 接口,观察 follower_shards 状态。若 status 显示为 active 且 no_shard_failures 为 0,表示配置生效。
GET _ccr/stats
同时检查索引健康度,确保副本分片已分配。
GET _cat/indices?v&h=index,health,status
常见坑
- 两个集群的 cluster.name 设置相同,导致节点混淆,必须确保全局唯一。
- 远程集群配置中使用了 localhost 或内网 IP,但实际网络环境无法路由,建议使用可路由 IP。
- 领导集群索引开启了 readonly 或 block 写入,导致跟随集群无法拉取操作日志。
- 版本差异过大,低版本集群无法作为高版本集群的跟随者。
原文链接:https://www.zjcp.cc/ask/10870.html
