ES多集群间数据同步
1.引言
自己在google上搜了一下,自己大概总结了一下集群中某节点要访问远程集群节点中的数据,并保证数据的一致性和稳定性。举个例子,现有三个集群分别是:集群A、集群B和集群C,每个集群对应的有三个节点,一共是九个节点;集群A中的node1中的业务数据需要从集群C中node1中某索引中获取(意思是说:集群A需要的一部分数据被分割在其他两个集群中),这时就需要考虑同步远程集群数据啦啦啦啦。我这里用的是es5.6
2.正题
这里提供了两种方式,tribe节点(部落),Cross cluster search(跨集群搜索,稳定性待测),tribe有两个缺陷问题:如果集群数和节点数很多回导致瓶颈,多个集群下如果有相同索引index的话,他会在多集群中选择一个。而Cross cluster search恰好解决了tribe出现的问题。这两种方式主要都是通过配置文件来实现
3.自动发现机制
自动发现(Disovery)
该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通信,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,比如节点加入和离开时进行shard的重新分配。
1. Azure discovery 插件方式,多播
2. EC2 discovery 插件方式,多播
3. Google Compute Engine (GCE)discovery 插件方式多播
4. zen discovery默认实现 多播/单播
多播配置下,节点向集群发送多播请求,其他节点收到请求后会做出响应。配置参数如下:
discovery.zen.ping.multicast.group:224.2.2.4 组地址
discovery.zen.ping.multicast.port:54328 端口
discovery.zen.ping.multicast.ttl:3 广播消息ttl
discovery.zen.ping.multicast.address:null绑定的地址,null表示绑定所有可用的网络接口
discovery.zen.ping.multicast.enabled:true 多播自动发现禁用开关
单播配置下,节点向指定的主机发送单播请求,配置如下:
discovery.zen.ping.unicast.hosts:host1:port1,host2,:port2
3.tribe方式
当我们的数据节点因为写入压力过大时, 可能会使节点之间的心跳通信超过这个时间, 那么可能会引起重新选举master的可能. 这次将新增三个实例分布到这三台服务器上, 做master节点.下面是master节点的主要配置:
cluster.name: eagleye_es node.name: "eagleye_es_xx_master"
node.master: true node.data: false #ping 其它节点的超时时间
discovery.zen.ping_timeout: 30s
#心跳timeout设为2分钟,超过6次心跳没有回应,则认为该节点脱离master,每隔20s发送一次心跳。
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
.zen.fd.ping_interval: 20s
#要选出可用master, 最少需要几个master节点
discovery.zen.minimum_master_nodes: 2
path.logs: /var/log/es_master
#不使用交换区
bootstrap.mlockall: true
transport.tcp.port: 8309
transport.tcp.compress: true
http.port: 8209
tribe: t1: cluster.name: cluster_one t2: cluster.name: cluster_two network.host: 10.1.2.3
tribe:
hot:
cluster.name: eagleye_es
blocks:
write: true
metadata: true
on_conflict: prefer_hot
threadpool:
search:
tyep: fixed
size: 24
#用来保存请求的队列
queue_size: 100
这里的on_conflict设置,当多个集群内,索引名称有冲突的时候,tribe节点默认会把请求轮询转发到各个集群上,这显然是不可以的。索引设置了一个优先级,在索引名冲突的时候,偏向于转发给某一个集群。
最后我们在查询程序中, 就不能指定集群的名字了, 而是直接通过tribe节点进行检索,如下:
4.Cross cluster search方式
elasticsearch。跨集群搜索节点的yml配置文件只需要列出应该连接到的远程集群,例如:
search: remote: cluster_one: seeds: 127.0.0.1:9300 cluster_two: seeds: 127.0.0.1:9301cluster_one和cluster_two是表示连接到每个集群的任意集群别名。这些名称随后用于区分本地索引和远程索引。
使用集群设置API为集群中的所有节点添加远程集群的等效示例如下:
PUT _cluster/settings { "persistent": { "search": { "remote": { "cluster_one": { "seeds": [ "127.0.0.1:9300" ] }, "cluster_two": { "seeds": [ "127.0.0.1:9301" ] } } } } }
通过将其种子设置为null,可以从集群设置中删除远程集群:
PUT _cluster/settings { "persistent": { "search": { "remote": { "cluster_one": { "seeds": null } } } } }
要在远程集群cluster_1上搜索twitter索引,必须使用由:字符分隔的群集别名来前缀索引名称:
POST /cluster_one:twitter,twitter/tweet/_search { "query": { "match_all": {} } }