分片集群组件

MongoDB分片集群由以下组件组成:

  • 分片 (shard):每个分片包含分片数据的子集。每个分片必须部署为副本集 (replica set) 

  • mongosmongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。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> }
   ...

 

 

 

posted @ 2024-07-08 04:39  wongchaofan  阅读(1)  评论(0编辑  收藏  举报