集群里的单个碎片保存了总数据的一个子集,集群里的所有碎片所持有的子集就是总数据。
在MongDB3.6版本里,为了冗余性和高可靠性,单个碎片必须是一个副本集。
用户,客户端,应用应该直接连接到碎片执行维护操作。
在单个碎片里执行查询只会返回一部分数据。连接到mongos
来执行集群级别的操作,包括读写操作。
重要:MongDB不保证单个碎片存在两个连续的块。
主碎片
每个在集群里的数据库都有一个 primary shard持有该数据库没碎片化的集合。每个数据库都有自己的primary shard。primary shard 跟副本集的 primary没有任何联系。
当通过持有数据量最少的碎片创建数据库的时候,mongos会使用primary shard。mongos
使用listDatabase命令返回的totalSize字段来作为一部分的选择标准。
[图片上传失败...(image-257913-1520013137947)]
使用 movePrimary
命令来改变数据库的primary shard。完成迁移primary shard需要消耗大量时间,并且在迁移完成前你不应该访问数据库的集合。根据被迁移的数据量,迁移可能会对集群里的整体操作造成影响。在尝试更改primary shard前,应该从分考虑到网络畅通性和对集群操作的影响。
以前是一个副本集,现在你的碎片建立在该副本集之上且把该碎片加入到集群里的时候,所有已经存在的数据库继续运行在当前的副本集里。以后创建的数据库可能会存在于集群里的其他任何碎片中。
碎片状态
在mongo shell运行sh.status()方法可以查看当前集群的大概情况。其中包括了哪个碎片是当前数据库的primary shard,还可以看到碎片里的chunk描述。
集群安全性
使用 Internal Authentication来确保内部集群的安全性和避免无效用户访问集群。为了集群的内部身份验证,您必须在集群中使用适当的安全设置启动每个mongod。
碎片的本地用户
每个碎片都支持s Role-Based Access Control (RBAC) 来限制未认证的用户访问和操作碎片。启动每个mongod实例的时候指定 --auth
选项来强制开启RBAC。另外,未用户开启 Internal Authentication同时也会开启RBAC。
每个碎片都有自己的本地用户。这些用户不能用于其他碎片上,也不能用来连接mongos
.