分片配置
在此页面上
Mongoid 可以协助在分片环境中设置集合分片。
声明分片键
可以使用 shard_key
宏在模型上声明分片键:
class Person include Mongoid::Document field :ssn shard_key ssn: 1 # The collection must also have an index that starts with the shard key. index ssn: 1 end
请注意,要对分片进行分集合集合具有以分分片键开头的索引。 Mongoid 提供索引管理功能,此处的示例充分利用了该功能。
Mongoid 支持两种声明分片键的语法。 标准语法遵循 MongoDB shardCollection shell 助手的格式,并允许指定范围和哈希分片键、复合分片键和集合分片选项:
shard_key ssn: 1 shard_key ssn: 1, country: 1 shard_key ssn: :hashed shard_key {ssn: :hashed}, unique: true
另一种方法是使用速记语法,其中仅给出键。 此语法仅支持范围分片键,不允许指定选项:
shard_key :ssn shard_key :ssn, :country
shard_key
宏可以使用belongs_to
关联的名称来代替字段名称,在这种情况下,Mongoid 将使用关联中配置的外键作为字段名称:
class Person include Mongoid::Document belongs_to :country # Shards by country_id. shard_key country: 1 # The collection must also have an index that starts with the shard key. index country: 1 end
分片分片键还可以通过使用“.”来引用嵌入式文档中的字段。 字符来分隔字段名称:
shard_key "location.x" => 1, "location.y" => 1 shard_key "location.x", "location.y"
注意
因为“.” 字符用于分隔嵌入式文档中的字段,Mongoid 目前不支持本身字面包含“.”的分片键字段。 字符。
注意
如果模型声明了分片键,则 Mongoid 希望使用指定的分片键对相应的集合进行分片。 重新加载模型时,Mongoid 将向find
命令提供id
字段值和分片键,以提高查询性能,尤其是在地理上分布的分片集群上。 如果未使用指定的分片键对集合进行分片,查询可能会产生不正确的结果。
分片管理 Rake 任务
要根据模型中定义的分片键对数据库中的分片进行分片,请运行db:mongoid:shard_collections
分片任务。 如有必要,请在对集合进行分片之前运行db:mongoid:create_indexes
Rake任务:
rake db:mongoid:create_indexes rake db:mongoid:shard_collections
注意
与索引管理rake 任务一样,分片管理rake 任务在遇到特定模型类的问题时通常不会停止并失败。 相反,他们在适当的级别日志问题(记录到配置的 Mongoid 记录器),并继续下一个模型。 在 Rails应用程序中使用 Mongoid 时,这意味着 rake任务执行的结果通常可以在每个环境的日志文件中找到,例如log/development.log
。
注意
在分片分片集群中执行模式相关的操作时(例如本文档中描述的对集合进行分片,或者创建或删除集合或数据库),集群节点最终可能会获得过期的本地配置相关缓存数据。 在每个mongos
节点上执行flushRouterConfig命令以清除这些缓存。