ES多集群间数据同步

本文探讨了在ES5.6中实现多集群间数据同步的方法,包括Tribe节点和Cross cluster search。Tribe节点存在索引冲突和性能瓶颈的问题,而Cross cluster search能更好地解决这些问题。最终,作者推荐使用ReIndex作为最终的数据同步策略。文章详细介绍了各种方法的配置和优缺点。
摘要由CSDN通过智能技术生成

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:9301
cluster_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": {}
  }
}


二.最终采用的方式ReIndex

重新入库 Reindex

POST _reindex{
"conflicts": "proceed",//有冲突继续,默认是有冲突终止
"size":1000,//设定条数 "source": { "index": "twitter" // 也可以为 ["twitter", "blog"]
"type": "tweet", // 或["type1","type2"] //红字限制范围 ,非必须 限制文档
"query": { "term": { "user": "kimchy" } },//添加查询来限制文档
"sort": { "date": "desc" } //排序
"_source": ["user", "tweet"],//指定字段
"size": 100,//滚动批次1000更改批处理大小:

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值