写在前面
在日常工作中总结了一些关于es的规范,特别写下来、记下来
正文
- 预估index的整体磁盘容量,一般大概为:源数据*3.4。1、主要包含:
- 副本数量:至少1个副本
- 索引开销:通常比源数据大10%(_all参数等未计算)。
- 操作系统预留:默认操作系统会保留5%的文件系统供您处理关键流程、系统恢复以及磁盘碎片等
- Elasticsearch内部开销:段合并、日志等内部操作,预留20%。
- 安全阈值:通常至少预留15%的安全阈值。
- 换算下来:i. 磁盘总大小 = 源数据 (1 + 副本数量) 索引开销 /(1 - Linux预留空间)/(1 - Elasticsearch开销)/(1 - 安全阈值)= 源数据 (1 + 副本数量) 1.7= 源数据 * 3.4
- 比如一条doc按照50byte算,那么如果每天200万条数据,那么每天换算下来就会约占100M
- 为单个索引选择正确的分片数量,根据预估裁判容量+节点数量来判断
- 数据量少,在未来可接受一段时间少于30-50G,就设置一个分片
- 数据量较大,那么以每个分片30G大小为最佳,不能超过50G,数量以节点个数整数倍递增,最好不超过3倍
- 数据量更大的时候,就需要按照规则拆分索引,如服务日志,时间来拆分
- 索引副本数默认为1就好,如果需要提升查询性能,配合场景测试,则可以适当增加副本数
- TTL由应用程序使用定时任务清除
- 大部分文本字段不需要分词搜索,请使用keyword存储
- 时间使用long类型,支持范围查询,建议到精确到分钟,会提高查询效率
- 如果不用es自动生成_id,而是指定了doc的_id,那么需要考虑到防止数据倾斜
- es的聚合因为是先分片聚合再汇总聚合,所以在多个分片aggs的时候会有误差,解决方案如下
- 配合第六点:把需要聚合的单位生成有规律的_id或者routing到指定分片
- 通过调试,调高到agg合适s的shard_size(默认size*1.5+10)
- 遵循一致的规范,如下:
- 所有命名仅可为小写字母,不能下划线开头;不能包括 , /, *, ?, “, <, >, |, 空格, 逗号, #;长度不能超过 255 个字符
- Index命名格式:[module|system]_index..
- type命名格式:[module|system]_type..
- 相同含义的字段使用相同的命名
- 为了查询效率,可以冗余字段到一个index
- 能不用_all就不用,_source使用默认开启,可支持高亮检索,字段store配合_source=false时使用,用来开启单个字段支持高亮检索