Elasticsearch搜索引擎第十三篇-集群如何规划

我们需要多大规模的集群

在使用ES初始阶段,我们应该需要多大规模的ES集群呢?主要从以下两个问题入手:

  • 当前的数据量有多大?数据增长情况又是如何?
  • 你的机器配置如何?CPU、内存、硬盘容量多大?

推算的依据如下:

  • Elasticsearch的JVM heap大小最大不要超出32G
  • 30G的heap大概能处理的数据量10T
  • 如果一台机器的内存很大,如128G,则可以在一台机器上运行多个ES节点实例
  • 集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展

两类应用场景:

  • 用于构建业务搜索功能模块,且多是垂直领域的搜索,数据量级几千万到数十亿级别,一般2-4台机器的规模。
  • 用于大规模数据的实时OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多,几十到上百节点的规模。

集群中的节点角色如何分配

一个节点可以充当一个或多个角色,默认三个角色都有:

  • Master:主节点,负责维护集群元数据,配置项node.master:true
  • DataNode:数据节点,负责存储数据,配置项node.data:true
  • CoordinateNode:协调节点,负责接收并转发请求、查询合并,如果仅担任协调节点,将以上两个配置设为false

分配规则:

  • 小规模集群,不需严格区分
  • 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

如何避免脑裂问题

脑裂,存在拥有master节点的分布式集群中。一个集群中正常情况下有一个master存在,但是如果发生网络中断、堵塞等情况,导致其他节点无法ping到该master,则集群会判断master节点挂了(实际比没有挂掉),会重新选举一个master节点,此时集群会有两个master节点,称为脑裂。

官方一个推荐的设置可以尽量避免脑裂:

discovery.zen.minimum_master_nodes=(有master资格的节点数/2)+1

这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。具有master资格的节点配置如下:

node.master:true
node.data:false

常用的做法如下(中大规模集群):

  • Master和DataNode角色分开,配置奇数个master,如3
  • 单播发现机制,配置master资格节点
    discovery.zen.ping.multicast.enabled: false  
    discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]  
    
  • 配置选举发现数,及延长ping master的等待时长
    discovery.zen.ping_timeout: 30(默认值是3秒)
    discovery.zen.minimum_master_nodes: 2
    

索引应该设置多少个分片

分片对应的存储是体是索引,分片并不是越多越好,分片数指定后不可变,除非重索引。

分片过多的影响:

  • 每个分片本质上就是一个Lucene索引,因此会消耗相应的文件句柄,内存和CPU资源。
  • 每个搜索请求会调度到索引的每个分片中,如果分片分散在不同的节点倒是问题不太,但当分片开始竞争相同的硬件资源时,性能便会逐步下降。
  • ES使用词频统计来计算相关性,当然这些统计也会分配到各个分片上。如果在大量分片上只维护了很少的数据,则将导致最终的文档相关性较差。

分片设置的参考原则:

  • ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。
  • 在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。
  • 对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片

分片应该设置几个副本

副本分片时用来备份主分片的,副本数是可以随时调整的

设置副本分片的原则:

  • 为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。
  • 如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。

猜你喜欢

转载自blog.csdn.net/supermao1013/article/details/84573081