容量规划
shard 的作用。shard 是 es 实现分布式特性的基石,文档在索引进 es 时,es 会根据一个路由算法,将每一个文档分配到对应的 shard 上。每个 shard 实际对应一个 lucene index。每个shard最多存储 2^31 个文档,即 20亿。这是 lucene 设计决定的。但随着 shard 体积的增大,其查询效率会下降,而且数据迁移和恢复的成本也会增高。官方建议单个 shard 大小不要超过 50GB。
shard数过小不一定好,如果数据量很大,导致每个 shard 体积过大,会影响查询性能。 因为 es 的每次查询是要分发给所有的 shard 来查询,然后再对结果做聚合处理,如果 shard 数过多也会影响查询性能。因此 shard 的数量需要根据自己的情况测出来。
官方文档有一节关于容量规划的章节,链接地址,其给出的步骤如下:
- 使用生产环境的硬件配置创建单节点集群
- 创建一个只有一个主分片无副本的索引,设置相关的mapping信息
- 将真实的文档导入到步骤 2 的索引中
- 测试实际会用到的查询语句
测试的过程中,关注相关指标数据,比如索引性能、查询性能,如果在某一个点相关性能数据超出预期值,那么此时的 shard size大小便是符合预期的单个 shard size的大小。通过下面的计算公式可以确定一个 index 需要设定的 shard 数量。
shard数 = index 的数据总大小/单个shard size的极限值
比如测出单个 shard size 最大为 20 GB,而预测该索引数据最大量在1年或者2年内不会超过 200GB,那么的 shard 数就可以设置为10。
测试报告模版输出
说明
- 以下的所有指标均指的是某台机器的峰值
- 机器配置
cpu:12 core,32G,ES 分配JVM内存18G
3台虚拟机,master、data共用
shard:5,replica:1,Indices:20,Documents:2000
- 试验时间:2019-4-20
- 每次试验时间 >5 minute
- 2.2M相当于6400条doc(每一条doc15个字段,其中13个long字段,1个long型数组,数组里边元素1到2个,一个text类型字段,250个字符以下)
- 所有数据均来自 restful api : _nodes/stats
实验数据
| 序号 | Index Rate (/s) | Serach Rate (/s) | JVM Heap (GB) | Index Memory (KB) | System Load | Latency (ms) | 并发数 | bulk data size | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | 1 | 索引速率 | 查询速率 | 节点JVM堆情况 | index内存大小 | cpu负载 | 延迟,分为索引和查询 | 并发请求次数 | 批量操作大小 |
结论
仅仅针对上述的所有条件成立的情况下
冷数据建议可以采用索引别名的方式建立,具体可参照官网
- 如何评估当前集群是符合查询型的要求
评估是否复合查询型要求,这是需要有压测指标进行验证的
- 当数据达到6T的时候有哪些方案可以处理集群数据
容量规划是一个长期工作,可参考正文给出的方案