加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

MongoDB分片是什么?

发布时间:2023-09-22 13:20:26 所属栏目:系统 来源:
导读: MongoDB分片是什么?很多刚接触MongoDB数据库的朋友可能对于MongoDB分片不是很清楚,下面小编就给大家介绍一下MongoDB分片的相关内容,感兴趣的朋友可以了解一下。

分片是MongoDB的扩展方式,通过分
       MongoDB分片是什么?很多刚接触MongoDB数据库的朋友可能对于MongoDB分片不是很清楚,下面小编就给大家介绍一下MongoDB分片的相关内容,感兴趣的朋友可以了解一下。

       分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用.

       1.分片简介

       分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。使用几乎所有数据库软件都能进行手动分片,应用需要维护与若干不同数据库服务器的连接,每个连接还是完全独立的。应用程序管理不同服务器上的不同数据,存储查村都需要在正确的服务器上进行.这种方法可以很好的工作,但是也难以维护,比如向集群添加节点或从集群删除节点都很困难,调整数据分布和负载模式也不轻松。MongoDB支持自动分片,可以摆脱手动分片的管理.集群自动切分数据,做负载均衡.

        2.MongoDB的自动分片

       MongoDB分片的基本思想就是将集合切分成小块.这些块分散到若干片里面,每个片只负责总数据的一部分.应用程序不必知道哪片对应哪些数据,甚至不需要知道数据已经被拆分了,所以在分片之前要运行一个路由进程,进程名mongos,这个路由器知道所有数据的存放位置,所以应用可以连接它来正常发送请求.对应用来说,它仅知道连接了一个普通的mongod.路由器知道和片的对应关系,能够转发请求到正确的片上.如果请求有了回应,路由器将其收集起来回送给应用.在没有分片的时候,客户端连接mongod进程,分片时客户端会连接mongos进程.mongos对应用隐藏了分片的细节.

       什么时候需要分片:

       a.机器的磁盘不够用了

       b.单个mongod已经不能满足些数据的性能需要了

       c.想将大量数据放在内存中提高性能

       一般来说,先要从不分片开始,然后在需要的时候将其转换成分片.

       3.片键
       设置分片时,需要从集合里面选一个键,用该键的值作为数据拆分的依据.这个键成为片键.假设有个文档集合表示的是人员,如果选择名字"name"做为片键,第一篇可能会存放名字以A-F开头的文档.第二片存G-P开头的文档,第三篇存Q-Z的文档.随着增加或删除片,MongoDB会重新平衡数据,是每片的流量比较均衡,数据量也在合理范围内(如流量较大的片存放的数据或许会比流量下的片数据要少些)

        4.将已有的集合分片假设有个存储日志的集合,现在要分片.我们开启分片功能,然后告诉MongoDB用"timestamp"作为片键,就要所有数据放到了一个片上.可以随意插入数据,但总会是在一个片上.然后,新增一个片.这个片建好并运行了以后,MongoDB就会把集合拆分成两半,成为块.每个块中包含片键值在一定范围内的所有文档,假设其中一块包含时间戳在2011.11.11前的文档,则另一块含有2011.11.11以后的文档.其中一块会被移动到新片上.如果新文档的时间戳在2011.11.11之前,则添加到第一块,否则添加到第二块.

        5.递增片键还是随机片键

       片键的选择决定了插入操作在片之间的分布.如果选择了像"timestamp"这样的键,这个值可能不断增长,而且没有太大的间断,就会将所有数据发送到一个片上(含有2011.11.11以后日期的那片).如果有添加了新片,再拆分数据,还是会都导入到一台服务器上.添加了新片,MongoDB肯能会将2011.11.11以后的拆分成2011.11.11-2021.11.11.如果文档的时间大于2021.11.11以后,所有的文档还会以最后一片插入.这就不适合写入负载很高情况,但按照片键查询会非常高效。

       如果写入负载比较高,想均匀分散负载到各个片,就得选择分布均匀的片键。日志例子中时间戳的散列值,没有模式的"logMessage"都是复合这个条件的.不论片键随机跳跃还是稳定增加,片键的变化很重要.如,如果有个"logLevel"键的值只有3种值"DEBUG","WARN","ERROR",MongoDB无论如何也不能把它作为片键将数据分成多于3片(因为只有3个值).如果键的变化太少,但又想让其作为片键,可以把这个键与一个变化较大的键组合起来,创建一个复合片键,如"logLevel"和"timestamp"组合.选择片键并创建片键很像索引,以为二者原理相似.事实上,片键也是最常用的索引.

        6.建立分片

       建立分片有两步:启动实际的服务器,然后决定怎么切分数据.

       分片一般会有3个组成部分:

       a.片

       片就是保存子集合数据的容器,片可是单个的mongod服务器(开发和测试用),也可以是副本集(生产用).所以一片有多台服务器,也只能有一个主服务器,其他的服务器保存相同的数据.

       b.mongos

       mongos就是MongoDB配的路由器进程.它路由所有的请求,然后将结果聚合.它本身并不存储数据或者配置信息但会缓存配置服务器的信息.

       c.配置服务器

       配置服务器存储了集群的配置信息:数据和片的对应关系.mongos不永久存房数据,所以需要个地方存放分片的配置.它会从配置服务器获取同步数据.

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章