MongoDB分片集群由三个模块组成shell
一个副本集只能有一个主节点, 能够有多个从节点. 主节点能够读写, 从节点只能读. 主节点将数据修改操做保存至oplog中. 一个副本集须要奇数个节点, 心跳信息每两秒传递一次, 经过选举实现自动故障转移. 主节点宕机后会进行自动选举.安全
生产环境配置服务器
在生产环境为了保证数据冗余以及系统的高可用, 建议使用如下的分片集群配置网络
副本集分布式部署分布式
若是可能的话, 建议将每一个副本集中的一个节点部署至适合灾备恢复的机房性能
分片的个数测试
分片机制须要至少两个分片, 若是不是很快就要开始分片, 不要使用单个分片的集群.大数据
Mongos的个数和部署server
部署多个mongos支持高可用性和扩展性, 大多状况下会在每一个应用服务器上部署一个mongos, 这样能够减少客户端应用和mongos之间的网络延迟. 对于大型的项目, 能够将mongos部署在专用的服务器上, 避免mongos的数量随应用而增加, 而且使得mongos可使用更大的内存. mongos和mongod的内存是不共享的, 若是部署在同一个服务器上要留意内存是否充足. 在部署数量上, mongos没有限制, 可是mongos会频繁与配置服务器通讯, 在增长mongos数量后要密切监视配置服务器的负载, 若是致使性能降低, 就要减少mongos的数量.索引
开发环境配置
对于测试和开发, 你能够按最小数量来部署.
分片
在分片集群中, 每一个分片会包含所有数据的一个子集. 用户,客户端和应用应当直接链接到分片来进行本地管理和维护操做.
在单个分片上进行查询, 只会返回这个子集中的数据. 集群级别的读写操做应当链接到mongos进行.
主分片
在分片集群中, 每一个db都有一个主分片, 用来存储这个db中全部未分片的collection. 每一个db都有各自的主分片. 主分片与副本集中的主副本无关.
mongos在建立新db时, 会选择集群中数据量最小的那个分片, 在其上建立主分片. 使用listDatabase命令返回的totalSize也是判断的一个因素.
要修改db的主分片, 使用movePrimary命令. 迁移主分片的过程会明显耗时, 迁移的过程当中不该该去访问对应的数据.
分片状态
在mongo shell用 sh.status() 方法查看集群状态. 报告包含那些分片是db主分片以及在分片上的chunk分布状况.
分片集群安全
使用Internal/Membership验证来保证集群内的安全, 防止未受权的模块连入或访问集群, 在启动每一个mongod的时候, 要设置好对应的安全配置, 对应的是
集群内模块间的安全, 使用Internal Authentication, 例如keyfile
客户端和集群间的安全, 使用User Access Controls, 客户端必须使用用户帐户进行链接
分片本地用户
各个分片都支持基于角色的访问控制Role-Based Access Control (RBAC), 在mongod启动时使用 --auth 参数启用RBAC. 另外, 启用 Internal/Membership Authentication 时也会经过RBAC启用用户访问控制.
每一个分片都有本身的本地用户, 这些用户不能用在其余分片上, 也不能用于经过mongos链接集群
分片主键
分片主键决定了collection数据在集群中各个分片如何分布, 分片主键能够是一个索引字段, 也能够是一个索引组合字段, 只要它存在于collection中的每个记录. MongoDB使用主键值的区间对数据进行分区, 每一个区间定义了数据块, 对应一个不会与其余数据块交叠的主键值范围. MongoDB会尽可能保持数据块在集群的分片中均匀分布, 分片主键的选择和分布的效率有直接联系.
数据块
MongoDB在数据块尺寸超过限制后, 会将数据块进行拆分. 在insert和update操做后都有可能发生拆分. 数据块能对应的最小的区间就是一个单个的分片主键值, 若是数据块只对应了一个主键值, 那就不能再拆分了.
数据块初始化
填充Collection
分片操做会用完整的主键值区间建立初始数据块, 数据块的数量取决于配置的数据块尺寸. 在初始数据块建立后, balancer会在分片之间迁移这些数据块.
空Collection
若是你定义了zone, 而且zone区间定义在了一个空的或不存在的collection上, 分片操做会建立空数据块. 若是未在空collection上设置zone,
对于hashed sharding: 分片操做会建立空数据块, 默认状况下每一个分片会建立两个数据块, 能够经过numInitialChunks选项来调整数量.
对于ranged sharding: 分片操做会建立一个空数据块, 而后进行迁移.
数据块尺寸
MongoDB中的默认数据块尺寸是64MB, 大小能够在配置中修改.
修改数据块尺寸的影响说明:
自动拆分只会在insert和update时发生, 若是你减少了数据块尺寸, 会须要等一段时间才能看到全部数据块拆分为新的尺寸.
拆分是不能回退的, 若是你增长数据块尺寸, 现有的数据块要在insert和update过程当中增加到新的尺寸
数据块拆分
拆分是为了不数据块增加得过大, 当一个数据块增加到超过预设的尺寸或者记录数超过每一个数据块容许迁移的最大记录数时, MongoDB会基于分片主键值将数据块进行拆分. 必要的时候一个数据块会被拆分红多个数据块. 拆分是元数据修改, MongoDB并不会迁移任何数据或影响分片.
拆分会致使分片之间的数据块存储分布的不均衡, 这时候balancer会将数据块在分片之间进行调整. Balancer是一个后台进程, 用于管理数据块迁移. 若是集群中分片的最大数据块数量和最小数据块数量超过了阈值, balancer就会进行迁移以保证数据的均匀分布.
在某些状况下, 例如对应的分片主键已经缩减为单值, 数据块增加超过了限制可是又不能进行拆分, 会使得数据块增加得愈来愈大, 这就会成为性能瓶颈, 特别是当这个主键被频繁使用的时候.