分片配置
本页内容
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 支持两种声明分片键的语法。标准语法遵循 MongoDBshardCollection 命令行辅助工具 的格式,允许指定范围和哈希分片键、复合分片键和集合分片选项
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 将将分片键以及 id
字段值一起提供给 find
命令,以改进查询性能,尤其是在 地理分布式的分片集群 上。如果集合没有使用指定的分片键进行分片,查询可能会产生不正确的结果。
分片管理 Rake 任务
要按模型中定义的分片键对数据库中的集合进行分片,请运行 db:mongoid:shard_collections
Rake 任务。如果需要,请在分片集合之前运行 db:mongoid:create_indexes
Rake 任务
rake db:mongoid:create_indexes rake db:mongoid:shard_collections
注意
与索引管理中的 rake 任务类似,分片管理中的 rake 任务在遇到特定模型类的问题时通常不会停止并失败。相反,它们会将问题(配置到 Mongoid 日志记录器中)记录在适当的级别,并继续处理下一个模型。当 Mongoid 在 Rails 应用中使用时,这意味着 rake 任务的执行结果通常可以在每个环境的日志文件中找到,例如 log/development.log
。
注意
在进行与分片集群中的模式相关的操作时,例如本文件中描述的分片集合,或创建或删除集合或数据库时,集群节点可能会保留过时的本地配置相关缓存数据。在每个 mongos
节点上执行 flushRouterConfig 命令以清除这些缓存。