分片集群组件
MongoDB分片集群由以下组件组成:
-
分片 (shard):每个分片包含分片数据的子集。每个分片必须部署为副本集 (replica set) 。
-
mongos:
mongos
充当查询路由器,提供客户端应用程序和分片集群之间的接口。mongos
可以支持 对冲读取以最大限度地减少延迟。 -
配置服务器:配置服务器存储集群的元数据和配置设置。从 MongoDB 3.4 开始,配置服务器必须部署为副本集 (CSRS)。
mongos
路由器与配置服务器频繁通信。随着路由器数量的增加,性能可能会下降。如果性能下降,请减少路由器数量。您的部署不应超过 30 个mongos
路由器。
通常,不要直接在分片上执行操作,因为它们可能会导致数据损坏或数据丢失。用户、客户端或应用程序应仅直接连接到分片来执行本地管理或维护操作。
MongoDB 不保证任何两个连续的 chunks 位于单个分片上。
主分片
分片集群中的每个数据库都有一个主分片,用于保存该数据库的所有未分片集合。每个数据库都有自己的主分片。主分片与副本集中的主分片无关。
配置服务器
配置服务器存储分片集群的元数据。元数据反映了分片集群内所有数据和组件的状态和组织。元数据包括每个分片上的块列表以及定义块的范围。
每个分片集群必须有自己的配置服务器。不要对不同的分片集群使用相同的配置服务器。
分片集群元数据
配置服务器将元数据存储在配置数据库中。
在对配置服务器进行任何维护之前,请务必备份config数据库。
对集合进行分片
sh.shardCollection(<namespace>, <key>) // Optional parameters omitted
namespace 指定要分片的集合的完整命名空间("<database>.<collection>")。 key 指定一个文档{ <shard key field1>: <1|"hashed">, ... } ,其中 1表示基于范围的分片 "hashed"表示哈希分片。
如果您的数据模型需要对单调变化的键进行分片,请考虑使用Hashed Sharding 。
分片键分析命令
优化分片键
不要修改任何当前shard键字段的范围或哈希类型。它会导致数据不一致。例如,不要将分片密钥从{customer_id:1}修改为{customer_id:“hashed”,order_id:1}。
要优化集合的分片键,请使用该 refineCollectionShardKey
命令。该命令 refineCollectionShardKey
将一个或多个后缀字段添加到现有键以创建新的分片键。
db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
对集合进行重新分片
单开
寻找分片键
每个共享集合都有一个分片键。要显示分片键,请连接到mongos
实例并运行该db.printShardingStatus()
方法:
db.printShardingStatus()
输出类似于:
<dbname>.<collection> shard key: { <shard key> : <1 or hashed> } unique: <boolean> balancing: <boolean> chunks: <shard name1> <number of chunks> <shard name2> <number of chunks> ... { <shard key>: <min range1> } -->> { <shard key> : <max range1> } on : <shard name> <last modified timestamp> { <shard key>: <min range2> } -->> { <shard key> : <max range2> } on : <shard name> <last modified timestamp> ... tag: <tag1> { <shard key> : <min range1> } -->> { <shard key> : <max range1> } ...