文档数据库服务 DDS-通过设置数据分片提升性能:选择合适的分片键

时间:2024-10-21 09:04:57

选择合适的分片键

  • 背景

    分片集群中数据的分片以集合为基础单位,集合中的数据通过分片键被分成多个部分。分片键是在集合中选择的一个合适的字段,数据拆分时以该分片键的值为依据均衡地分布到所有分片中。如果您没有选择到合适的的分片键,可能会降低集群的使用性能,出现执行分片语句时执行过程卡住的问题。

    分片键一旦设置后不能再更改。如果未选取到合适的分片键,需要使用正确的分片策略,将数据迁移到新的集合后重新执行分片。

  • 合适的分片键的特点
    • 所有的插入、更新以及删除操作,将会均匀分发到集群中的所有分片中。
    • key的分布足够离散。
    • 尽量避免scatter-gather查询。

    如果所选分片键不具备以上所有特点,将会影响集群的读写扩展性。例如,通过find()操作读取的工作量在分片中非均匀分布,最终会产生查询热分片。同样,如果写工作量(插入、更新和修改)在分片中非均匀分布,最终会产生写热分片,严重限制分片的优势。因此,您需要根据应用读写状态(重读取还是重写入)、经常查询及写入的数据等业务需求,调整您的分片键。

    需要注意,对已有数据分片后,如果update请求的filter中未携带片键字段并且选项upsert:true或者multi:false,那么update 请求会报错,并返回“An upsert on a sharded collection must contain the shard key and have the simple collation.”

  • 判断标准
    您可以通过表2中的几个维度,判断所选分片键是否能够满足业务需求。
    表2 合理分片键的判断依据

    判断依据

    说明

    片键基数

    片键基数是指划分数据块的能力。例如,要记录某个学校的学生信息,由于学生的年龄比较集中,如果选择年龄作为分片键,同一个数据段中将存储很多同龄学生的数据,影响集群的性能以及可管理性。由于学生的学号唯一,如果选择学号作为分片键,分片基数较大,有利于数据的均匀分布。

    写分布

    若用户业务在同一时间段有大量写操作,则希望这些写操作能够均匀分布到各个分片上。如果数据分布策略为范围分片,并以一个单调递增的值作为分片键,此时,大量写入的数据同样是片键字段递增,数据将写入同一个分片。

    读分发

    若用户业务在同一时间段有大量读操作,则希望这些读操作能够均匀分布到各个分片上,以充分利用各分片节点的计算性能。

    定向读

    dds mongos查询路由器可以执行定向查询(只查询一个分片)或scatter/gather查询(查询所有分片)。只有查询中存在分片键,dds mongos才能定位到单一分片,因此,您需要选择在业务运行时可用于普遍查询的分片键。如果您选择合成的分片键,将无法在定向查询中使用该片键,所有的查询方式将变成scatter/gather查询,从而限制扩展读数据的能力。

support.huaweicloud.com/usermanual-dds/dds_01_0061.html