三人行必有我师

Elasticsearch集群规划求助

Elasticsearch | 作者 yeziblo | 发布于2019年10月10日 | 阅读数:3143

各位小伙伴好,我想请教一下关于集群规划的问题…

数据量大概有30T(在开了副本的情况下)左右,目前有7100个分片(算上了副本分片)。

集群有15台机器,每个机器的内存都是125G。

我打算单独把一个节点分离出来,作为master节点,之后再将两个节点作为协调节点,剩下的12个节点,6个给热数据6个给冷数据做冷热分离。

请问下各位小伙伴我这个规划有没有什么问题,可以的话希望指正!

另外我想问一下…我经常看到网上有人说自己的集群里有2、3个主节点,但是主节点无论有几个,最后不还是只有一个能当选么,那这样干脆拿一台节点出来只做主节点不好么?为啥还要保持有2、3个呢?是担心主节点挂掉么?

还有就是一旦开了协调节点,是不是我的程序里,连接ES集群的代码就必须只能连接两个协调节点了(以前都是直接把所有节点写在client配置里)?

希望各位小伙伴能够抽空解答,祝各位事业顺利!
已邀请:

hapjin

赞同来自: yeziblo mugbya

1,分片数量多少合适?
每个分片的大小推荐在20GB-40GB之间,我自己一般保证单个分片的大小不超过30GB。每个节点上多少个分片合适?


这里有一个很好的经验法则:确保对于节点上已配置的每个 GB,将分片数量保持在 20 以下。如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好。


具体参考:how-many-shards-should-i-have-in-my-elasticsearch-cluster
粗略地算:(30*1024)/7100=4.3GB/分片,每个分片的大小不算大,能hold住。
具体到一个索引应该配置多少个主分片,多少个副本分片?考虑一下这个索引是用来干什么的?这个索引的Mapping结构如何定义?哪些字段需要做搜索(index_options参数)?哪些字段做term查询(keyword 类型)、哪些字段需要Analyzer做Match查询(text 类型)、要不要聚合(是否开启doc_value),要不要语法高亮(term_vector 和 positions 参数),要不要禁用_source参数?
一个合理的Mapping配置也是能够有效减少index 大小的。我们实际生产环境中,禁用doc_value之后,索引大小几乎减小了一半。
 
 像这种128GB大内存的机器,ES官方文档heap size里面有说:ES进程所使用的物理内存(Xms Xmx配置)不要超过机器物理内存的一半,同时考虑到指针压缩问题,分配给ES进程的内存不要超过32GB,一个安全的值是26GB(各个操作系统平台上,JVM进程26GB不会有指针压缩问题)
具体参考:heap-size

2,关于主节点个数的问题
"网上说的配置3个主节点",我的理解是:3个 master eligible node (有资格成功master节点),通俗地讲,就是拿3台机器出来,不存储数据(node.data=false),专门用来做master选举用(dedicated master eligible node),选举结果肯定只能是:其中某台节点成为master节点。
如果整个集群中只有一台节点能够成为master节点,就会存在单点故障,如果master节点宕机,整个集群就再没有其他节点能够被选举为master了,会导致整个集群不可用,这就是为什么要在多个节点上配置多个 node.master: true
关于ElasticSearch各个节点所起的角色,可参考:modules-node
 
3,client连接协调节点问题
这个还是节点的角色问题。可参考第2点中给出的参考链接。注意这句话:"Every node is implicitly a coordinating node.",如果要单独拿2台出来做协调节点,需要在配置文件里面这样配置:
node.master: false
node.data: false
node.ingest: false
协调节点作用:将搜索请求转发到正确的节点上;将各个节点上搜索结果再次排序汇总成最终结果(query_then_fetch 查询类型)
 
其实我觉得,让每个节点单独扮演某个角色(master eligible node 、data node、coordinatoring node) 主要还是为了集群稳定吧,各个功能模块各司其职,最好互不影响。

chencandong

赞同来自: yeziblo


1.存在15台主机,每台主机存在有126G的大小,其实这种情况可以考虑每个主机多es实例进行部署,可以更加合理的利用主机的内存
2.冷热分离的本质实际上是为了把经常搜索的数据放到io更好,性能更好的磁盘上,这里面要取决于主机上是存在不同的性能磁盘还是主机有不同磁盘的性能数据来看,可以采用多实例挂在不同的目录,将热索引的数据按照tag将分片存放到io更好的磁盘中,再使用curator之类的工具或者es原生的move之类的api进行热热冷数据的迁移
 3.另外需要看实时写入es的索引的数据,如果只有1个索引比较简单,可以直接均衡将索引的分片均衡分布,如果实时产生的索引比较多的时候,每个索引由于大小不一致分片配置也不一样,需要有1个合理的机制将全部的分片均衡分布

要回复问题请先登录注册