面试题答案
一键面试数据基于分片键在各个分片上的分布
- 哈希分片:
- 对分片键的值计算哈希值。例如,假设分片键是用户ID,通过哈希函数(如MD5、SHA - 1等)将用户ID转换为一个固定长度的哈希值。
- 根据哈希值将数据均匀地分布到各个分片上。这种方式的优点是能非常均匀地分散数据,避免数据倾斜(即某些分片数据量过大,而其他分片数据量过小的情况)。适合数据没有明显的顺序特征或者希望数据均匀分布的场景,比如社交平台用户的消息存储,以用户ID为分片键,可让每个用户的消息均匀分布在不同分片。
- 范围分片:
- 按照分片键的值的范围来划分数据。例如,以时间戳作为分片键,将不同时间段的数据分配到不同的分片。如将2020年的数据分到一个分片,2021年的数据分到另一个分片。
- 范围分片需要对数据的分布有一定的了解,适用于数据具有自然顺序的场景,比如日志数据,按时间范围分片,方便按时间顺序查询。但如果范围划分不合理,可能导致数据倾斜,例如某个时间段数据量剧增,会使对应分片负载过重。
对数据读写性能的影响
- 读性能:
- 哈希分片:
- 由于数据均匀分布,读操作在查找单个文档时,无论数据存储在哪个分片,查找效率相对稳定。因为哈希值的计算使得每个分片上的数据分布概率基本相同,不存在某个分片数据量过大导致查找变慢的问题。
- 但如果要进行范围查询,比如查询某个用户ID范围内的数据,由于哈希分片将数据打散,需要在所有分片上进行查询,然后汇总结果,这会增加查询的复杂度和时间开销。
- 范围分片:
- 对于范围查询效率较高。例如按时间范围分片的日志数据,查询某个时间段的日志,只需要定位到对应的分片即可,不需要在所有分片上查询,减少了查询的范围和时间。
- 然而,如果查询单个文档,且不知道该文档具体在哪个分片,就需要遍历所有分片,这会降低查询效率。特别是当数据量较大且分片较多时,这种遍历所有分片的操作开销较大。
- 哈希分片:
- 写性能:
- 哈希分片:
- 写操作能均匀地分散到各个分片上,避免单个分片写入压力过大,所以在高并发写入场景下性能较好。比如在电商平台的订单写入场景,以订单ID为分片键,通过哈希分片可让订单数据均匀写入不同分片,提升整体写入性能。
- 但如果出现网络问题或某个分片故障,可能会导致部分写操作失败,需要额外的重试机制。
- 范围分片:
- 如果写入的数据是按顺序的,比如按时间顺序写入日志,写入操作会集中在一个或几个分片上,可能导致这些分片的写入压力过大,出现性能瓶颈。
- 若写入的数据顺序杂乱,且范围划分合理,写性能相对较为均衡,但仍然可能因为范围划分不合理而出现数据倾斜,影响整体写性能。
- 哈希分片: