片键
- 分片集合需要选择片键。 分片后无法更改分片键的选择。 每个分片集合只能有一个分片键。
- 如果对非空集合进行分片,集合必须具有以分片键开头的索引。 对于空集合,如果集合尚未具有指定分片键的索引,MongoDB将创建包含片键的索引。
数据分块
- MongoDB将分片数据划分为块。 每个块依据分片键进行切分,每个块的是一个半开半闭的集合,包含下届,不包含上届。
分片集合和未分片集合
- 数据库可以同时存在分片和非分片集合。分片集合在集群中的所有分片上都有分布。 非分片集合存储在主分片上。 每个数据库都有自己的主分片。(每个数据库有一个主分片)
- 主分片和副本集中的 主从 没有任何关系
- mongos在创建新数据库时选择主分片,通常选择具有最少数据量的群集中的分片 mongos使用listDatabase命令返回的totalSize字段作为选择条件的考量之一。
- 修改数据库的主分片 是会影响性能的(通过 movePrimary 命令,在修改期间不应该访问该数据库)
配置数据库(Config Servers)
- 配置服务器存储分片集群的元数据。 元数据反映了分片集群中所有数据的分布状态。 元数据包括每个分片上的块列表以及定义块的范围。 -
- mongos实例缓存此数据并使用它将读取和写入操作路由到正确的分片。 当群集有元数据更改时,mongos会更新缓存,例如Chunk Splits或添加分片。 Shards还从配置服务器读取块元数据。 -
- 配置服务器还存储身份验证配置信息,例如基于角色的访问控制或群集的内部身份验证设置。
Mongos
- MongoDB mongos实例将查询和写操作路由到分片集群中的分片。从应用程序的角度来看,mongos是分片集群的唯一接口。 应用程序永远不会与分片直接连接或通信。
- mongos通过缓存配置服务器中的元数据来跟踪哪些数据在哪个分片上。
- mongos没有持久状态并且消耗最少的系统资源。 最常见的做法是在与应用程序服务器相同的系统上运行mongos实例,但是也可以在分片或其他专用资源上维护mongos实例。
- 查询时,要尽量让查询条件包含片键,或者包含片键的一部分,如果查询条件不符合最左前缀法则,那么就会导致广播式查询,影响查询性能,下面的例子是mongodb官网的例子
广播式查询
精确查询
假设一个集合的片键是如下:
{a: 1, b: 1, c: 1 }
The mongos program can route queries that include the full shard key or either of the
following shard key prefixes at a specific shard or set of shards:
那么只有查询条件是如下的两种,可以实现精确查询
{ a: 1 }
{ a: 1, b: 1 }