面试题答案
一键面试优化思路
- 分散写入热点:采集时间作为片键导致写入热点,因为新数据集中在最新时间片。可考虑使用设备ID与采集时间结合的方式作为新片键,这样不同设备的数据可分散到不同片,避免集中在同一时间片写入。
- 动态调整:业务发展中,数据量和访问模式可能变化,需要动态调整片键策略以适应。
调整过程
- 设计新片键生成函数:
- 例如,使用设备ID的哈希值与采集时间的组合作为新片键。假设使用MD5哈希算法,伪代码如下(以Python为例):
import hashlib import time def generate_new_shard_key(device_id, collection_time): device_id_hash = hashlib.md5(device_id.encode()).hexdigest() new_shard_key = f"{device_id_hash}_{collection_time}" return new_shard_key
- 数据迁移:
- 为不影响线上业务,采用逐步迁移的方式。
- 首先,在新数据写入时,使用新片键生成函数生成片键并写入。
- 然后,启动后台任务,逐步将历史数据迁移到新的片键下。可以按照时间窗口,如每小时或每天的数据进行迁移,避免一次性大量迁移影响系统性能。
- 在迁移过程中,对线上读取操作,需要兼容新旧两种片键的查询,确保业务不受影响。例如,可以先尝试用新片键查询,如果未找到再用旧片键查询。
- 监控与动态调整:
- 部署监控系统,实时监测各片的读写负载。如果发现某个片的负载过高,说明片键策略可能需要进一步优化。
- 可以根据监控数据,调整片键生成函数,例如改变哈希算法或调整设备ID与采集时间的组合方式,以更好地分散负载。
涉及技术点
- 哈希算法:如MD5、SHA - 256等,用于将设备ID转换为均匀分布的哈希值,保证数据分散性。
- 数据迁移策略:逐步迁移、时间窗口划分等,确保迁移过程不影响线上业务。
- 兼容性设计:新旧片键查询兼容,保证线上读取操作正常。
- 分布式系统监控:使用如Prometheus + Grafana等工具,实时监测各片的负载情况,为动态调整提供数据支持。