logo

本系列的第一部分 ,我介绍了一个新的功能,给集合定义主键。 今天,你会看到我们如何使用它来减少分片集群的磁盘占用。

TokuMX默认情况下片键是聚簇的。这是范围查询的键作为片键是好主意,并且聚簇键上的范围查询非常快。 在TokuMX中你选择的片键暗示你可能想以后用该索引来查询。

在TokuMX 1.3和更早的版本,这意味着在默认情况下,每个分片的集合有两个聚簇索引: {_id:1}索引和片键,这意味着每个文档存储两次,并且每次更新需要修改至少这两个索引。 TokuMX的高压缩和插入的吞吐量意味着在磁盘上的大小往往会比MongoDB中同一数据集小得多, 无论如何,但它仍然是一个不必要的重复,我们知道我们可以做的更好。

这个问题用主键完全解决 。主键就是用来存储主要数据一个聚簇索引。 默认的主键是_id索引,但如果指定了不同的主键,那么你(也)得到聚簇索引的所有好处,而仍然只有所有文档的一个副本,他们只是不同的”$natural”顺序。

TokuMX 1.4中,sh.shardCollection()命令默认使集合的主键作为片键。首先要知道的是如果集合不存在,正常的运行shardCollection命令将得到TokuMX分片的所有好处,包括使用主键(作为片键)。然后,TokuMX 1.3及更早的版本不支持主键,所有所有这些版本的分片都像之前一样仍然保存有两份数据副本。

可以在现有的不同的主键(甚至默认的 {_id: 1})的集合(未分片)上分片,一切都正常,但这通常并非最好(产生数据移动),但有一个例外,那就是哈希索引。

如果打算使用一个哈希片键 ,那么就不需要做迁移,而且不能在哈希索引上做范围查询,所以没有理由让这个索引是聚簇的。 相反,你应该对所有的mongos路由设置noAutoSplit=true(因为没有聚簇的片键autosplitting会很慢),并这样创建集合:

mongos> sh.shardCollection('test.foo', {_id: 'hashed'}, false, false)
{ "collectionsharded" : "test.foo", "ok" : 1 }
mongos> db.foo.getIndexes()
[
 {
  "key" : {
   "_id" : 1
  },
  "unique" : true,
  "ns" : "test.foo",
  "name" : "_id_",
  "clustering" : true
 },
 {
  "key" : {
   "_id" : "hashed"
  },
  "ns" : "test.foo",
  "name" : "_id_hashed"
 }
]

这样创建的空集合会预先分割足够的块,不需要再拆分块,并且不需要任何块的迁移,除非添加或者删除分片。 TokuMX 1.4分片集群现在更小、更快。

参考: http://www.tokutek.com/2014/02/whats-new-in-tokumx-1-4-part-4-smaller-faster-sharded-clusters/

0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。