概述
当利用MongoDB的shard cluster技术做数据库扩展时,一个至关重要的点是要选择一个合适的shard key(片键),它是用来决定将数据在分片服务器上分配的策略。一个适用的shard key应该满足以下几个条件:
- 数据均分
所谓数据均分,就是要保证需要扩展的那部分数据能够尽可能平均分配到数据分片上,以达到空间上的扩展目的。 - 负载均分
负载均分是把应用访问的分片数据的负载平均分配到数据分片集群上,应用对数据的访问要划分读写分析。 - 方便扩展
一般情况下,数据库的扩展都不是一次完成的的,以后可能还需要对数据进一步分片,因此这次的设计方案,要尽可能为后续的扩展留下余地,而不是每一次都要推倒重来。
MongoDB的片键分类
MongoDB支持两种类型的shard key:
- Hashed,数据库根据指定的字段值,算出一个哈希值,然后根据这个哈希值把数据写入相应的服务器中。它的好处是数据会分布的比较均匀,但是它只能把一个字段指定为shard key,另外对于范围的操作,它更多是一个广播的操作,没有精确地路由。
- Ranged。按照指定字段的值的范围进行划分,支持复合shard key。这个就要求对字段值的范围有比较深入的了解,对未来也有一个相对清晰的把握。相对哈希,这种方式就可以有比较精确的路由。但是它也可能会带来数据分布不均匀,负载不能完全均衡。
举例
下面以实例说明一下,如何选择合适的shard key。假设我们要分布的是分钟级别的K显示,数据样例如下ÿ