mongodb-shard-分片-原理

文章目录


0 mongo查询简图(mongos–>config servers --> shard)

实现分片集群时,MongoDB 引入 Config Server 来存储集群的元数据,引入 mongos 作为应用访问的入口,mongos 从 Config Server 读取路由信息,并将请求路由到后端对应的 Shard 上


mongodb-shard-分片-原理

角色说明

  • A.数据分片(Shards)
    • 用来保存数据,保证数据的高可用性和一致性。可以是一个单独的mongod实例,也可以是一个副本集。在生产环境下Shard一般是一个Replica Set,以防止该数据片的单点故障。所有Shard中有一个PrimaryShard,里面包含未进行划分的数据集合:
  • B.配置服务器(Config servers)
    • 保存集群的元数据(metadata),包含各个Shard的路由规则。
      • 元数据 名词解释:元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据
  • C.查询路由(Query Routers)
    • Mongos是Sharded cluster的访问入口,其本身并不持久化数据(Sharded cluster所有的元数据都会存储到Config Server,而用户的数据则会分散存储到各个shard)
    • Mongos启动后,会从config server加载元数据,开始提供服务,将用户的请求正确路由到对应的Shard Sharding集群可以有一个mongos,也可以有多mongos以减轻客户端请求的压力。

1 分片是什么?为什么要用分片?

  • 分片就是把mongo单个表的数据,分到多个chunk上,从而横向提升mongo的读写能力
  • 为什么分到多个chunk上就可以提升读写能力?
    • 多个chunk分布在多个机器上,可以充分利用多台机器的CPU和磁盘IO
    • 分到多个chunk上的时候由于分片键的存在,如果按照分片键进行查询,则直接定位到某个chunk,只需要在这一个chunk上进行查询。很明显速度就会快了很多
      • 这样的查询可以理解为MySQL的人工分表(mongo更加自动化),比如一个日志表,你用日期做分表,当你查询时,会先拼接表名,定位到某个表,这样就避免了扫所有表的数据。

2 分片分为几类?

  • hash 分片键
    • 数据分配的原理: 不停地往一个chunk中添加数据,达到上限后则开始进行分割
    • 优势和劣势
      • 优势:由于hash键可以分布多个chunk,所以会极大提升写入性能
      • 劣势:不方便范围查询
  • range 分片键
    • 数据分配的原理:对分片键的值进行hash,然后得到的值按照range进行分布到各个chunk
    • 优势和劣势
      • 优势: 1,方便范围查询 2,如果分片键不是单调递增,也可以提升写入性能
      • 劣势:如果分片键是单调递增,则无法提升写入性能

3 分片键的限制 和 选择逻辑

  • 分片键的限制
    1. 分片键是不可变。
    2. 分片键必须有索引。
    3. 分片键大小限制512bytes。
    4. 分片键用于路由查询。
    5. MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)
  • 分片键的选择逻辑
    • 所有的分片读写都均匀。
    • 数据访问均匀,而不是随机性的访问;由于新数据都是先在内存中创建,尽量避免需要从磁盘访问新数据。
    • 尽量避免由于数据块的数据移动导致数据从磁盘加载到内存中从而导致热数据被清理出内存。
    • 组合字段分片可能会是理想的分片方案。
  • 分片公式(范围热度):
    • 分片键公式:{coarseLocality:1,search:1}
    • coarseLocality:应该是一个大粒度的局部字段。比如MONTH月份升序字段。
    • search:是一个经常用来查找的字段。

4 分片后会对查询,写入等造成什么样的影响


所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。
Mongos会根据请求类型及shard key将请求路由到对应的Shard,因此不同的操作请求存在不同限制。

  • 查询请求
    查询请求不包含shard key,则必须将查询分发到所有的shard,然后合并查询结果返回给客户端
    查询请求包含shard key,则直接根据shard key计算出需要查询的chunk,向对应的shard发送查询请求
  • 插入请求
    写操作必须包含shard key,mongos根据shard key算出文档应该存储到哪个chunk,然后将写请求发送到chunk所在的shard。
  • 更新/删除请求
    更新、删除请求的查询条件必须包含shard key或者_id,如果是包含shard key,则直接路由到指定的chunk,如果只包含_id,则需将请求发送至所有的shard。
  • 其他命令请求
    除增删改查外的其他命令请求处理方式都不尽相同,有各自的处理逻辑,比如listDatabases命令,会向每个Shard及Config Server转发listDatabases请求,然后将结果进行合并

参考链接:

https://www.cnblogs.com/littleatp/p/8562931.html
https://www.cnblogs.com/zping/p/11203545.html
https://www.cnblogs.com/clsn/p/8214345.html#auto-id-29

上一篇:GFS(google file system)总结


下一篇:python 实时显示声音