比如有 250G 数据
A : 放在一个index(5shard)中,每shard 50G。
B : 或者放在5个index中,每个index只有1shard。写的时候是5shard,后续通过shrink压缩成1shard。
都是通过rollover保证每shard在50G,新建写入索引。
这样A和B都是 包含5shard,每shard含50G数据。
在索引方面,肯定是B快,那么在查询方面有什么区别?
由于shrink非常耗资源
在采用第一种方案的情况下,又如何应用到读写分离: 每个写入索引最大有250G,每个写入索引起码要存双倍的(切换写入后不可能立即将索引relocation到冷节点),如果是多个应用(比如 10个,每个都是写入 250G然后rollover切换索引),那么加上复制片,写入节点 需要包含的数据有 250G *2 * 10 = 5T的SSD盘(这基本也不可能)而且随着应用的增加,需要的写入节点存储就越大。 这明显不合理。有遇到类似情况的吗
A : 放在一个index(5shard)中,每shard 50G。
B : 或者放在5个index中,每个index只有1shard。写的时候是5shard,后续通过shrink压缩成1shard。
都是通过rollover保证每shard在50G,新建写入索引。
这样A和B都是 包含5shard,每shard含50G数据。
在索引方面,肯定是B快,那么在查询方面有什么区别?
由于shrink非常耗资源
在采用第一种方案的情况下,又如何应用到读写分离: 每个写入索引最大有250G,每个写入索引起码要存双倍的(切换写入后不可能立即将索引relocation到冷节点),如果是多个应用(比如 10个,每个都是写入 250G然后rollover切换索引),那么加上复制片,写入节点 需要包含的数据有 250G *2 * 10 = 5T的SSD盘(这基本也不可能)而且随着应用的增加,需要的写入节点存储就越大。 这明显不合理。有遇到类似情况的吗
1 个回复
kennywu76 - Wood
赞同来自: lbx6z
至于一开始分多更多的shard,之后对冷数据做shrink是否值得做, 需要考虑热shard的数量和集群node数量的比例。 分更多的shard是为了让数据块能分布到更多的node,均衡写入负载。 但如果node本身就不是很多,在一个node上分配2个shard还是5个shard,性能基本上没差别,甚至在一定负载情况下,过多的shard会减少写入吞吐量。
热数据消耗的磁盘空间问题,属于针对应用场景的数据应该如何切片的问题。 根据自己的磁盘容量和业务增长规律,规划索引和shard切分策略,以及allocate到不同结点的路由策略。 本身ES的node是可以增加tag属性的,可以将结点用tag分组, 应用数据按照一定纬度分组,和ES的分组进行映射,一组机器服务一组应用,应用的增加对应水平扩展机器组。 数据的规划没有万能药,只能自己琢磨,灵活应用了。