3.5 进阶篇
3.5.1.跨集群操作
创作人:张刘毅
审稿人:吴斌
Elasticsearch 集群天然支持横向水平扩展,因此当业务规模扩大、对集群产生读写压力时,增加节点总是运维人员的“懒人选择”。但随着节点数增多,集群主节点要维护的 meta 信息也随之增多,这会导致集群更新压力增大,甚至无法提供正常服务。 另外每个企业的数据中心都需要有灾备方案,在集群间同步数据,因为单点集群会存在隐患。
鉴于此,Elastic官方提供了跨集群操作。主要包括:
1、跨集群搜索(CCS):允许配置多个远程集群并且在所有已配置的集群中实现联合搜索。
2、跨集群复制(CCR):允许跨多个集群复制索引,适合于做灾备方案和数据本地化场景。
跨集群配置
跨集群操作有两种配置模式连接远程的集群:嗅探模式(Sniff mode)或者代理模式(Proxy mode)。
l 在嗅探模式下,我们使用集群名称和种子节点列表注册远程集群。注册后,集群状态将被种子节点获取,该模式要求本地群集可以访问网关节点的发布地址。
l 在代理模式下,使用集群名称和单个代理地址注册远程集群。代理模式不需要远程集群节点具有可访问的发布地址。
我们可以在 Kibana 上动态配置远程集群,也可以在各个节点的 elasticsearch.yml 文件的上配置。
动态配置远程集群
我们在 Kibana 上使用 cluster update settings API 为每个节点动态配置远程集群。
例如:
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_one": { "seeds": [ "127.0.0.1:9300" ], "transport.ping_schedule": "30s" }, "cluster_two": { "mode": "sniff", "seeds": [ "127.0.0.1:9301" ], "transport.compress": true, "skip_unavailable": true }, "cluster_three": { "mode": "proxy", "proxy_address": "127.0.0.1:9302" } } } } }
上面的配置中,当前集群是 cluster_one,一起联合远程访问的集群 cluster_two和cluster_
three。其中 cluster_two 的连接方式是嗅探模式,cluster_three 的连接方式是代理模式,代理地址是 "127.0.0.1:9302"。
其中:
l transport.compress:网络传输的压缩参数
l transport.ping_schedule :集群内部通信(tcp)的访问频率
l skip_unavailable:默认情况下如果请求中的任何集群都不可用则会返回错误。如果跳过不可用的集群,可以将 skip_unavailable 设置为 true。
以上这些参数是可以动态调整的,但必须要包括 seed 列表或者代理地址。
我们如果想关闭压缩,将 ping_schedule 由 30s 改成 60s可以通过如下示例方式
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_one": { "seeds": [ "127.0.0.1:9300" ], "transport.ping_schedule": "60s" }, "cluster_two": { "mode": "sniff", "seeds": [ "127.0.0.1:9301" ], "transport.compress": false }, "cluster_three": { "mode": "proxy", "proxy_address": "127.0.0.1:9302", "transport.compress": true } } } } }
静态配置远程集群
在节点的 elasticsearch.yml 中配置远程连接,只有在 YAML 文件中设置的节点,才能连接到远程集群,并处理远程集群请求。
举例
cluster: remote: cluster_one: seeds: 127.0.0.1:9300 transport.ping_schedule: 30s cluster_two: mode: sniff seeds: 127.0.0.1:9301 transport.compress: true skip_unavailable: true cluster_three: mode: proxy proxy_address: 127.0.0.1:9302
其中,cluster_one,cluster_two 和 cluster_three 是表示与每个集群的连接的集群名称,用于区分本地索引和远程索引。
《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.1.跨集群操作(2) https://developer.aliyun.com/article/1228851