分片 shard
官方:搜索场景下一个分片大小建议不要超过30G
索引不能动态调整shard,ES非常鼓励reindex,因此索引不建议太大,一般手动按时间划分。对于更新型数据可能不太友好。
内存
官方:堆内建议不要超过32G,否则无法利用内存指针压缩优化,64-bit的地址表示会长一倍,被认为会比较影响性能
官方&七牛:1G内存约可服务20~30G左右的索引数据。
磁盘
对性能比较重视的索引请尽量存在SSD,Lucene非常耗磁盘
分词器
字分词器会性能较低(尤其是match类查询),但是支持查询灵活
词分词器会有可能难以适应业务查询需求变化和新词查询,但是性能和空间占用都较有优势
一般来说分词器还是会妥协于业务需求,除非reindex代价不高。
1.2 写入
控制bulk大小和频率
官方:建议bulk的大小为单节点4m/s左右一批,但其实要考虑实际负载和对读的影响
注意观察bulk thread_pool指标,如果bulk请求过多(比如异步写过快),则会引起EsRejectedException拒绝写入。在java client中需要自己去遍历response去确认是否成功,而不是依靠onFailure回调。
控制refresh_interval去避免过于频繁的merge触发和提高写性能
如实时索引要求不是太高可以适当把refresh_interval从默认的1s调整成10s或30s。
时间戳不需要毫秒级的尽量使用秒级
cardinality太多的维度慎做agg,hyperloglog算法不精确
一致性
ES支持读写时主从一致性配置,一般情况下都是异步写replica的弱一致性(最终一致性)以提高吞吐率和写性能。此时需注意不同副本间的一致性问题,可以利用 _preference 参数做哈希来解决。
1.4 GC优化
GC情况最后依然还需根据实际自己的情况进行调整。
JDK 1.8.100+ 的版本G1GC才能用,之前版本的G1GC都会导致Lucene数据丢失。
1.5 监控
方案:ELK、Grafana + 时序数据库(Opentsdb)/监控系统(OpenFalcon)等
指标:JVM (GC、Heap、OffHeap等)、query数目与耗时、fetch数目与耗时、flush、refresh、merge、slow query、集群基础监控。
另:记得对ElasticSearch做自动拉起的守护进程,默认5min内拉起的话不会触发分片reroute。
1.6 Linux
以上操作系统配置基本适用于持续服务的高读性能数据存储集群,包括但不仅限于HBase、ES等。
1.7 部署
1.8 备份与容灾
ElasticSearch经验小结 (Based on 5.x)
原文:https://www.cnblogs.com/lhfcws/p/11055833.html