分类: NOSQL
2013-01-25 15:13:56
重新配置了shard cluster 另外看了《scaling mongodb》这本书的前两章 回头来再读这篇文档 感觉容易理解很多 顺便把它给翻译了吧
Shard Keys
Shard keys 是collection中的一个字段 Mongo DB用这个keys来对数据进行分片存放到集群中的各个存储节点上去
Cardinality
Cardinality 在这里的意思指 系统对数据分片的能力 举个例子吧 存储地址簿:
较高的cardinality对于均匀地分布数据是有好处的 但是这并不能保证读写的效率会相应地增加
写的伸缩性
下面这个例子用ObjectID作为shard key
ObjectID 在document创建的时候确定 和存储的document是一一对应的 但是这个值往往和时间戳相关 也就意味着 我们可以预计这个值的变化情况 尽管用它作为shard key可以获得较高的cardinality 但是这种单调增长的值作为shard key 那么某一个时间段的数据都会存放到同一个chunk中 也就会在同一个shard里 从而这个shard就会直接影响到集群的写效率 如果插入数据的比例很低 那么用它是没有问题的 并不会影响性能 但是 总的来说 尽可能选择那些既可以获得高cardinality 又能把写分散到整个集群的字段作为shard key 可以选择那些比较随即的字段 或者计算出document的hash值作为shard key 看起来这样对写来说是足够理想了 但是考虑到读的性能 哎
查询
mongos隐藏了整个集群的信息 应用发送查询请求到mongos monos向config server请求metadata 然后把应用查询导向到某个mongod实例 从这个过程中 我们也可以看出shard key对查询性能的影响
查询隔离性
效率最高的查询是 mongos利用shard key 还有config server的metadata 发送到一个特定的shard上 如果查询中没有包含shard key mongos必须询问所有的shard 然后等待它们响应 如果你的请求包含了shard key的一部分 mongos就可以依赖这些信息把查询转给特定的shard 或者少数的几个shard 这样查询效率也会相应地提高
如何选择理想的shard key:
如果单一的字段作为shard key导致cardinality很低 那么你可以再添加一个字段作为shard key 这种复合的shard key对于MongoDB来说更好
排序
mongos会对shard返回的查询结果合并排序
可靠性
在选择shard key时 最需要考虑的因素:
其它:
Choosing a Shard Key
通常很难选择一个shard key 达到理想化的成都 但是这里还是有三点建议提供给大家: