Docs 菜单

分片配置

分片是一种将数据分布在多台机器上的方法。 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 进行索引管理的详情,请参阅 索引管理指南。

如果模型声明了分片键,则 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 不支持在名称包含句点字符的字段上创建分片键。

您可以通过运行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手册中的分片指南。

要学习;了解有关本指南中讨论的shard_key 宏的更多信息,请参阅 shard_key API文档。