分片配置
Overview
分片是一种将数据分布在多台机器上的方法。 MongoDB使用分片来支持具有大型数据集和高吞吐量操作的部署。 在本指南中,您可以学习;了解如何在 Mongoid应用程序中配置分片。
声明分片键
MongoDB使用分片键在各分片之间分发集合的文档。 分片键是一个索引字段或由复合索引覆盖的多个字段,它决定了集合文档在集群分片中的分布。 在 Mongoid应用程序中,您可以在创建模型时使用 shard_key
宏来声明分片键。
以下示例在 ssn
字段上创建一个带有分片键的 Person
类:
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 重新加载模型时,它会向 find
命令提供分片键和 _id
字段,以提高查询性能。 如果未使用指定的分片键对集合分片的,则查询可能不会返回预期结果。
语法
您可以使用完整的MongoDB语法或速记语法来声明分片键。
完整语法遵循mongosh
shardCollection() 方法的格式,并允许指定以下类型的分片键:
范围键
哈希键
复合键
完整语法还允许您指定集合和分片选项。
以下示例在 sson
字段上创建上述每种类型的分片键:
# Create a ranged shard key shard_key ssn: 1 # Create a compound shard key shard_key ssn: 1, country: 1 # Create a hashed shard key shard_key ssn: :hashed # Specify a shard key option shard_key {ssn: :hashed}, unique: true
速记语法允许您通过仅指定字段名称来声明分片键。 此语法仅支持范围键和复合分片键,不允许指定集合或分片选项。
以下示例创建了一个范围键和一个复合分片键:
# Create a ranged shard key shard_key :ssn # Create a compound shard key shard_key :ssn, :country
指定关联字段和嵌入式字段
您可以在 belongs_to
关联上指定分片键来代替字段名称。 执行此操作时,Mongoid 会在关联集合的主键上创建分片键。
以下示例在 Person
模型中的 belongs_to
关联上创建分片键。 由于关联的 country
集合具有一个名为 country_id
的主键,因此 Mongoid 按该字段进行分片:
class Person include Mongoid::Document belongs_to :country # Shards by country_id shard_key country: 1 # The collection must have an index that starts with the shard key index country: 1 end
您可以使用点表示法来分隔字段名称,从而在嵌入式文档上指定分片键。 以下示例在 address.city
字段上创建分片键:
class Person include Mongoid::Document field :address shard_key "address.city" end
注意
由于句点 (.
) 字符用于分隔嵌入式字段,因此 Mongoid 不支持在名称包含句点字符的字段上创建分片键。
分片管理 Rake 任务
您可以通过运行db:mongoid:shard_collections
rake任务,根据 Mongoid 模型中定义的分片键对数据库中的分片片。 要确保集合包含以分片键开头的索引,可以先运行db:mongoid:create_indexes
rake任务。
运行以下 rake 命令以创建索引并根据模型的分片键对集合分片:
rake db:mongoid:create_indexes rake db:mongoid:shard_collections
索引管理和分片rake 任务在遇到特定模型类错误时不会停止。 相反,它们会日志错误并继续处理下一个模型。 为确保 rake 任务没有遇到任何错误,请检查为应用程序配置的 Mongoid 记录器的输出。
注意
在分片集群中执行模式相关操作时,节点可能包含过时的本地配置相关缓存数据。 要清除缓存,请在每个 节点上运行flushRouterConfig mongos
命令。
更多信息
要学习;了解有关MongoDB分片的更多信息,请参阅MongoDB Server手册中的分片指南。
API 文档
要学习;了解有关本指南中讨论的shard_key
宏的更多信息,请参阅 shard_key API文档。