Skip to content

mongo分片基础

复制集不能解决的问题

  • 服务器容量的问题
  • 我们都知道一台服务器的容量是有上限的 所以我们只能通过增加服务器的台数来提升容量
  • 虽说复制集是由多台电脑组成的,但是由于多台电脑保存的数据都是一样的。 所以在复制集中虽然电脑增多了,但是容量并没有增加。 所以复制集不能解决服务器的容量问题
  • 只有通过分片来实现增加服务器的容量

分片存储

分片就是将数据库集合中的数据拆分成多分,分布式的保存到多台电脑上, 这样不同的电脑保存不同的数据,就大大的提升了服务器的容量

注意:

  • 并不是数据库中所有的集合都需要使用分片,对于那些不使用分片的集合会统一保存到主分片中
    • 默认每个数据库都有一个主分片,保存那些不需要分片的集合数据
    • 在创建数据库的时候,系统会自动选择存储内容最少的分片作为主分片

分片结构

什么是MongoDB分片服务器

专门用于存储不同数据的MongoDB服务器

什么是MongoDB配置服务器

专门用于存储分片服务器存储数据的范围的,只有有了范围将来才知道如何存储数据和查询数据

什么是MongoDB路由服务器(mongos)

专门用于负责分发用户请求的服务器

  • 用户存储数据,以及查询数据的流程
    • 用户将请求发送至路由服务器
    • 路由服务器去配置服务器查询数据段(数据范围)
    • 根据查询的结果到对应的分片服务器上做处理
    • 拿到处理的结果,将处理的结果返回给用户

什么是分片片键

  • 可以将文档的一个或者多个字段设置成分片片键
  • 设置完分片片键后,MongoDB会自动对字段可能的取值进行划分,划分出一个个数据段
  • 划分完数据段之后,MongoDB会自动决定哪些分片服务器保存哪些数据段对应的数据

注意点:

  1. 片键可以是一个字段也可以是多个字段
  2. 只有索引字段才能设置片键
  3. 分片服务器保存哪些数据段的值是随机的,并不是连续的
  4. 数据段的划分可以使用片键的取值,也可以使用片键取值的哈希值

选择技巧:

  1. 如何选择片键 使用分片的目的是为了将数据存储到不同的服务器上 所以在选择片键的时候 1.1 应该选择取值范围更广的字段作为片键 因为如果取值范围太小, 那么划分出来的数据段就太少, 那么分配到不同服务器的概率就越小 例如: 取值如果只有true或false, 那么就只能划分出两个数据段 那么也就最多只能保存到两台服务器上 1.2 应该选择取值分配更平衡字段作为片键 因为如果取值范围不平衡, 就会导致某一个数据段的数据太多, 某一台分片服务器压力太大 例如: 将age作为片键, 但是我们的用户90%都集中中20~30岁, 那么就会导致保存20~30数据段的分片服务器存储数据过多压力过大 1.3 不应该选择单向增加或者减少的字段作为片键 因为如果取值是单向增加或者减少的, 那么就会出现可能出现的最小值数据段或者最大值数据段保存的数据过多, 对应的分片服务器压力过大

2.片键选择技巧 2.1 如果片键字段取值范围不够广, 那么我们可以使用复合片键 2.2 如果片键字段的取值不够平衡, 那么我们可以使用复合片键 2.3 如果片键字段的取值是单向增加或减少的, 那么我们可以使用片键字段的哈希值

3.片键注意点 片键一旦选择就不能更改, 所以在前期选择片键时一定要多动脑

数据段分裂

分片的主要目的就是将数据分配到不同的服务器中保存, 提升服务器的容量, 让数据更加的均衡, 更有效的降低服务器的压力 但是随着时间推移, 某些数据段中保存的数据会越来越多, 所以为了保证个分片均衡, 当某个数据段数据过多或体积过大的时候, 系统就会自动在下一次操作这个数据段时(新增/更新), 将一个大的数据段分裂成多个小的数据段

分片平衡

除了当某个数据段数据过多或体积过大的时候会自动对数据段进行分裂以外 当各分片服务器上保存的数据段之间数量相差较大时, 还会自动触发分片服务器数据段迁移 在MongoDB中后台会自动运行一个'集群平衡器'来负责监视分片的平衡和调整分片的平衡

分片查询

  1. 查询条件是分片片键

那么路由服务器可以准确的找到保存对应数据的分片服务器,可以很快的返回数据

  1. 查询的条件不是分片片键

那么路由服务器无法准确的找到保存对应的数据的分片服务器会将请求发送至所有的分片服务器,然后再将返回非结果整合,整合之后再返回给用户

Released under the MIT License.