ElasticSearch 深入理解 三:集群部署设计

ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向。 Elastic即可伸缩性,作为一个分布式的搜索引擎,可伸缩性是它的核心竞争力。

Elastic&Shard

这两个词能放在在一起,因为ES的Elastic是建立在Shard的基础上。Shard作为ES伸缩性的基本单元,可以在不同的node之间迁移。例如我一个实际测试的例子: 两个节点的时候,一个index配置15个shard,1个replica:

每个node都有15个shard,互为备份。 这时再增加一个节点:

ES会做一次rebalancing,这次每个node都平均分了10个shard。但是ES的shard rebalancing有限制,就是shard本身无法split,例如:

一个index有5个shard,scale out到5个node的时候就是每个node一个shard,再增加一个node不会起作用了。当然shard split可以通过重新index,增加shard数量来解决。

每个shard都会有个主分片,副分片的个数由replica确定。对Document产生修改的操作,例如create update delete,都会路由到主分片上,路由的动作由集群中的一个node完成,这个node也称为coordinator。如果使用了ES的java Client用户的request会以round-robin的方式发给集群中的节点,自动实现了负载均衡。

这里有个重要的东西,就是Cluster的一致性,ES通过一个ClusterState结构来确定,ClusterState有一个版本号,在node之间进行同步。支持Diff,用于增量的更新。

Network Model

在启用一个Cluster之前,需要了解Cluster内部各个node之间的网络连接情况。ElasticSearch集群中的各个node之间的连接是全连接的网络结构:

通过TCP通信,而实际上node之间默认情况下会建立13个TCP连接,分别是:

connectionsPerNodeRecovery = 2
connectionsPerNodeBulk = 3
connectionsPerNodeReg = 6
connectionsPerNodeState = 1
connectionsPerNodePing = 1

通过定义能够知道大概每个连接的目的是什么了。Ping的那个链接在不同类型node上的行为是不同的,例如如果节点是个master节点ping消息发送的是node fault detection,如果节点是node节点则发送的ping消息是master fault detection。这种类似于心跳消息,通过wireshark抓包可以看到node的ping消息发送还是非常频繁的。当然这个心跳消息发送频率可以通过ping_interval修改,默认是1s。ElasticSearch的集群最好不跨局域网,因为集群的稳定性大大依赖网络的稳定性和效率。

有很多的一致性算法,例如ETCD使用的Raft,从协议层面上保证一致性。ES使用的是自己的一套一致性算法,称为zen discovery。在做一致性同步的同时也会做一些ES本身的数据同步,提高效率,减少带宽。它主要完成以下几个功能:

  1. Master节点选举:首先会根据节点的StateVersion,较高的称为master,如果相等,再check node的type,是否能做master,然后进行比较节点的ID,较小的选为master。
  2. FaultDetection:master会给所有的node发送node fault detection检测包;普通节点会给master节点发送master fault detection检测包。
  3. Membership管理: 节点加入退出等相关处理。
  4. Cluster State publish:集群状态的发布,自带版本号用于一致性的状态更新。
  5. Unicast Ping:单播Ping包,ES目前已不推荐使用多播做集群发现了,因为不好控制也不安全。单播可以精确控制节点数,使伸缩性变得简单。一个重要的配置项是 discovery.zen.ping.unicast.hosts: ["host1", "host2:port"],指定了ES实例所在的机器。

几个重要配置

对于ElasticSearch如何发生Split-brain,这篇文章清晰地做了解释。 为了防止出现Split-brain问题,ES有几个配置在集群部署时需要格外注意:

cluster.name: elasticsearch_production //集群的名字,不同名字不能组成一个Cluster
node.name: elasticsearch_005_data //该节点的名字
discovery.zen.minimum_master_nodes: 2 //对防脑裂起到关键作用。需要设置为quorum值,根据node节点的数量:(number of master-eligible nodes / 2) + 1

针对recovery有几个配置需要注意:

gateway.recover_after_nodes: ax //hard limitation,集群正常工作的最少节点数
gateway.expected_nodes: ex //集群中总共的节点数,也叫expected
gateway.recover_after_time: 5m //5分钟后或者ex个节点加入后,开始recovery,看哪个先到

这些配置可以有效防止集群中的数据抖动现象,如果集群一少半存活节点就开始recovery,等后续节点online,还有重新做recovery和shard rebalancing,会浪费大量的CPU、带宽资源,严重可能导致集群短时间无法使用。

ElasticSearch的CAP特性,如下图所示:

任何分布式系统只能满足其中两个,ES满足其中的哪两个呢?好像没有定论,要看自己的实际应用场景了。根据不同的场景选择需要支持哪两种。例如配置minimum_master_nodes为最大数可以保证C,但A就保证不了了。实际生产环境应该都比较倾向于CA,因为P可以人为干预并做好预防。

Cluster Design

理解了ElasticSearch的Cluster的运作机制,才能更好为业务做出合适的部署方式。例如把ES当成一个底层的主数据存储组件,那就需要高一致性,然后可用性其次;如果ES只是用来做辅助功能例如加速Search,那么高可用性就是首要解决的了。

例如下面的设计:

注意点:

  1. 三节点应该是最少的集群节点配置了,能保证较好的稳定性。
  2. quorum值必须是一半以上节点的数目,所以三个节点的话,quorum值必须是。按照官方的说法这个设置能防止脑裂问题。
  3. 这个集群的配置对Search是友好的,就是说down了两个节点的话就不允许写入了,而Search依然可以进行。
  4. 针对写入的场景每个节点都是一个coordinator node,它会把index请求发给primary shard上。而Search不区分primary shard和replica shard。
  5. 分片的load balance是ElasticSearch自动完成的,有的时候并不一定保证均衡。每个分片的大小也是不能保证均衡的。

转自:https://github.com/compasses/elastic-rabbitmq/blob/master/notes/cluster_relateddesign.md

ElasticSearch 深入理解 三:集群部署设计的更多相关文章

  1. elasticSearch数据库、skywalking集群部署

    Centos6上面安装elasticsearc数据库的集群 安装的是6.3.2版本,安装之前首先要先安装jdk1.8版本 安装之前首先需要关闭防火墙 Centos6 sudo service ipta ...

  2. Elasticsearch单机双节点集群部署实战

    一.安装第一个ElasticSearch(主节点) 1.创建es用户,启动es不能使用root用户 useradd es passwd es12 root用户进入/home/es目录下 2.获取Ela ...

  3. elasticsearch + kibana + x-pack + logstash_集群部署安装

    elasticsearch 部分总体描述: 1.elasticsearch 的概念及特点.概念:elasticsearch 是一个基于 lucene 的搜索服务器.lucene 是全文搜索的一个框架. ...

  4. 004.etcd集群部署-动态发现

    一 etcd发现简介 1.1 需求背景 在实际环境中,集群成员的ip可能不会提前知道.如使用dhcp自动获取的情况,在这些情况下,使用自动发现来引导etcdetcd集群,而不是指定静态配置,这个过程被 ...

  5. Elasticsearch学习总结 (Centos7下Elasticsearch集群部署记录)

    一.  ElasticSearch简单介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  6. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  7. Elasticsearch系列---生产集群部署(下)

    概要 本篇继续讲解Elasticsearch集群部署的细节问题 集群重启问题 如果我们的Elasticsearch集群做了一些离线的维护操作时,如扩容磁盘,升级版本等,需要对集群进行启动,节点数较多时 ...

  8. 理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  9. Storm 系列(三)Storm 集群部署和配置

    Storm 系列(二)Storm 集群部署和配置 本章中主要介绍了 Storm 的部署过程以及相关的配置信息.通过本章内容,帮助读者从零开始搭建一个 Storm 集群. 一.Storm 的依赖组件 1 ...

随机推荐

  1. 积跬步,聚小流------java信息生成图片

    需求: 是在做证书的时候碰到的这个问题. 当时需求是能够进行在线打印证书,第一次进行的操作是直接打印html,并且已经排好版(用jqprint插件)进行打印.在打印时碰到了兼容的问题,另外因为背景图片 ...

  2. 项目部署在windows下的tomcat里

    打包放在webapps 目录下,web的改成ROOT ok!!!

  3. MyEclipse2015安装SVN插件

    一.下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 在打开的网 ...

  4. hdoj--5240--Exam()

    Exam Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. [SCOI 2008] 奖励关

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1076 [算法] f[i][S]表示当前第i次抛出宝物,目前集合为S,所能获得的最高分 ...

  6. php如何判断两个时间戳是一天

    $date1 = getdate(strtotime('2013-12-31')); $date11 = getdate(strtotime('2014-01-01')); $date2 = getd ...

  7. Kylin基础教程(一)

    一.Kylin介绍 1.1 现状 Hadoop于2006年初步实现,改变了企业级的大数据存储(基于HDFS)和批处理(主要基于MR)问题,10几年过去了,数据量随着互联网的发展井喷式增长,如何高速.低 ...

  8. eclipse 配置 tomcat 时候的一些注意事项(随机更新)

    1,一些常用的设置,如下图,不特别说明了,看标记应该就知道注意事项了 2,配置文件的问题.eclipse里面如下图的配置文件里如果有所改动,那么在eclipse里启动Tomcat的时候,Tomcat的 ...

  9. Core Java(五)

    类和对象&方法 ——类的定义 现实世界的事物 属性:人的身高,体重等 行为:人可以学习,吃饭等 Java中用class描述事物也是如此 成员变量:就是事物的属性 成员方法:就是事物的行为    ...

  10. struts2的DTD配置文件

    新手可以看看,高手可以跳过…… 最近在学习struts2这个框架,自己也动手写过一些DTD文件,所以很好struts2这个DTD文件是怎么写的,接下来就一个一个的分析 根元素是struts,然后又4个 ...