ES存储最佳实实践
存储容量评估
副本数量:副本有利于增加数据的可靠性,但同时会增加存储成本。默认和建议的副本数量为1,对于部分可以承受异常情况导致数据丢失的场景,可考虑设置副本数量为0。
数据膨胀:除原始数据外,ES 需要存储索引、列存数据等,在应用编码压缩等技术后,一般膨胀10%。
内部任务开销:ES 占用约20%的磁盘空间,用于 segment 合并、ES Translog、日志等。
操作系统预留:Linux 操作系统默认为 root 用户预留5%的磁盘空间,用于关键流程处理、系统恢复、防止磁盘碎片化问题等。
因此,数据在 ES 中占用的实际空间可通过下面公式估算:
实际空间 = 源数据 × (1 + 副本数量) × (1 + 数据膨胀) / (1 - 内部任务开销) / (1 - 操作系统预留)
≈ 源数据 × (1 + 副本数量) × 1.45
为保证服务的稳定运行,建议至少预留15%的存储空间,因此建议申请的存储容量为:
存储容量 = 源数据 × (1 + 副本数量) × 1.45 × (1 + 预留空间)
≈ 源数据 × (1 + 副本数量) × 1.67
分片数量评估
每个 ES 索引被分为多个分片,数据按哈希算法打散到不同的分片中。由于索引分片的数量影响读写性能、故障恢复速度,且通常无法轻松更改,需要提前考虑。这里给出配置分片数量的一些常用建议:
建议单个分片大小保持在10GB - 50GB之间,您可以据此初步确定 Index 的分片数量。分片不宜过大或过小:过大可能使 ES 的故障恢复速度变慢;过小可能导致非常多的分片,但因为每个分片使用一些数量的 CPU 和内存,从而导致读写性能、内存不足等问题。
在测试阶段,可以根据每个 Index 的实际大小、预期未来增长情况,适当调整分片数量。
当分片数量超过数据节点数量时,建议分片数量接近数据节点的整数倍,方便分片在所有数据节点均匀分布。
对于日志、Metric 等场景中,建议使用 ES 自带的Rollover Index功能,持续滚动产生新的 Index。方便在发现分片大小不合理时,通过该功能及时调整分片数量。
例如,假设实例有5个数据节点,Index 当前大小为150GB,预期半年后增长50%。
如果我们控制每个单分片为30GB,则大约需要150GB ×(1 + 50%)/ 30 ≈ 7个分片,考虑到有两个数据节点支撑2/7的数据压力,节点间压力相对不均匀,我们把分片数量调整到10个。