阿东的博客

IT大牛代码重用

ES多集群间数据同步

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


参考:

点击打开链接https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-cross-cluster-search.html#_using_cross_cluster_search

https://www.elastic.co/guide/en/elasticsearch/reference/5.6/modules-tribe.html




阅读更多
文章标签: es多集群数据同步
个人分类: es多集群同步
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

ES多集群间数据同步

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭