MST
星途 面试题库

面试题:MongoDB高并发海量数据业务片键优化与动态调整

考虑一个全球范围的物联网数据收集平台,每秒会产生数百万条设备数据,数据包含设备ID、地理位置、采集时间、各种传感器读数等。初始选择采集时间作为片键,随着业务发展,发现写入热点问题严重。阐述如何在不影响线上业务的前提下,对片键进行优化和动态调整以提升系统性能,详细说明调整过程及涉及的技术点。
31.5万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 分散写入热点:采集时间作为片键导致写入热点,因为新数据集中在最新时间片。可考虑使用设备ID与采集时间结合的方式作为新片键,这样不同设备的数据可分散到不同片,避免集中在同一时间片写入。
  2. 动态调整:业务发展中,数据量和访问模式可能变化,需要动态调整片键策略以适应。

调整过程

  1. 设计新片键生成函数
    • 例如,使用设备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
    
  2. 数据迁移
    • 为不影响线上业务,采用逐步迁移的方式。
    • 首先,在新数据写入时,使用新片键生成函数生成片键并写入。
    • 然后,启动后台任务,逐步将历史数据迁移到新的片键下。可以按照时间窗口,如每小时或每天的数据进行迁移,避免一次性大量迁移影响系统性能。
    • 在迁移过程中,对线上读取操作,需要兼容新旧两种片键的查询,确保业务不受影响。例如,可以先尝试用新片键查询,如果未找到再用旧片键查询。
  3. 监控与动态调整
    • 部署监控系统,实时监测各片的读写负载。如果发现某个片的负载过高,说明片键策略可能需要进一步优化。
    • 可以根据监控数据,调整片键生成函数,例如改变哈希算法或调整设备ID与采集时间的组合方式,以更好地分散负载。

涉及技术点

  1. 哈希算法:如MD5、SHA - 256等,用于将设备ID转换为均匀分布的哈希值,保证数据分散性。
  2. 数据迁移策略:逐步迁移、时间窗口划分等,确保迁移过程不影响线上业务。
  3. 兼容性设计:新旧片键查询兼容,保证线上读取操作正常。
  4. 分布式系统监控:使用如Prometheus + Grafana等工具,实时监测各片的负载情况,为动态调整提供数据支持。