MongoDB 知识量:13 - 42 - 129
MongoDB 的分发情况主要是指数据如何在分片集群中分布。MongoDB 使用分片技术将数据拆分成块(chunk),并将这些块分布到不同的分片(shard)上。
MongoDB 的分发机制主要有两种方式:基于数据块数量的均衡分发和基于片键范围的定向分发。MongoDB 内置了均衡器(balancer),用于拆分块和移动块,以自动实现数据块在不同 shard 上的均匀分布。均衡分发是由 MongoDB 自动实现的,它使得数据库架构对应用程序透明,简化了系统的管理,并使得向分片集群中增减分片变得容易。
块(chunk)是由多个文档组成的一个分组,在某个索引字段(片键)上是连续的,每个块的片键有一定范围。块的默认大小是64MB。有些块可能会非常大,包含的文档数量非常多,但在 MongoDB 看来,仍然是一个块,和没有任何文档的空块没有区别。均衡分发保证每个 shard 的块数量大致相同,但不保证每个 shard 的文档数量大致相同。
另外,MongoDB 还提供了多种工具和监控方法来追踪集群数据,例如 MongoDB Shell、MongoDB Compass、日志文件等。通过这些工具和监控方法,可以实时查看集群的状态、性能指标、数据大小等,并可以设置警报来监控关键指标。
MongoDB 的升序片键通常类似于 date 或 ObjectId 字段,随着时间稳步增长。这种模式可能导致数据块(chunk)的均匀分布,因为所有的块都是由一个分片创建的。然而,这也可能导致最大块现象,即所有的写请求都会被路由到一个分片中,导致该分片上的块不断拆分和迁移。
为了解决这个问题,MongoDB 可以使用随机分发的片键或基于位置的片键。随机分发的键可以是用户名、电子邮件地址、UUID、MD5 散列值等,因为写操作是随机分发的,所以分片应该以大致相同的速度增长,从而减少需要进行的迁移操作。基于位置的片键可以是用户的 IP 地址、经纬度或地址,根据指定的位置进行数据分发,并使用索引将具有相近位置的文档保存在同一个块中。
在选择片键时,需要考虑数据的插入和查询模式,以便选择最适合的数据分发方式。升序片键适用于有序插入的情况,但可能导致数据均匀处理困难。随机分发片键和基于位置的片键可以提供更好的数据均匀处理能力,但可能不适合所有情况。
MongoDB的随机分发片键是一种将数据均匀分布到各个分片的方法。通过使用随机分发的片键,可以将数据随机分配到不同的分片上,从而实现数据的均匀分布。
随机分发的片键可以是用户名、邮件地址、UUID、MD5散列值等没有规律的键。由于写入数据是随机分发的,各个片键增长速度应大致相同,减少了需要进行迁移的次数。然而,MongoDB在随机访问超出RAM大小的数据时效率不高。如果拥有足够多的RAM或者是并不介意系统性能的话,使用随机片键在集群上分配负载是非常好的。这样可以比较方便的将数据与相应的用户,以及相关联的数据保存在一起。
总的来说,随机分发片键适用于数据插入模式比较随机,且对数据均匀处理要求较高的情况。但是,需要注意的是,随机分发可能会影响查询效率,因为查询操作需要在多个分片上执行,增加了查询的复杂性和时间成本。
MongoDB 的基于位置的片键可以根据地理位置信息将数据分发到相应的分片上。这种片键通常用于地理空间数据的存储和查询,可以根据地理位置的经纬度或地址信息将文档分配到相应的块中。
基于位置的片键可以是用户的 IP 地址、经纬度或地址。数据会根据这个位置进行分组,所有与该键值比较接近的文档都会被保存在同一范围的块中。这样可以比较方便地将数据与相应的用户,以及相关联的数据保存在一起。
在选择使用基于位置的片键时,需要考虑数据的插入和查询模式。如果希望特定范围内的块出现在特定的分片中,可以为分片添加标签,然后为块指定相应的标签。这样可以实现数据的定向分发,提高数据处理的效率和性能。
需要注意的是,基于位置的片键可能导致数据的不均匀分布,因为地理位置信息并不是均匀分布的。
MongoDB 的哈希片键是一种特殊类型的片键,它使用哈希索引来将数据均匀分布到各个分片上。哈希片键通过计算字段的哈希值来确定文档的块范围,从而将数据均匀分配到各个分片上。
哈希片键的优点是可以将数据均匀分布到各个分片上,从而减少数据迁移的频率和成本。此外,哈希片键还可以通过哈希索引来提高查询效率,因为哈希索引可以将查询操作分散到各个分片上,避免了全量扫描和跨分片的查询操作。
然而,哈希片键也有一些缺点。首先,哈希片键的选择需要谨慎,因为一旦选择了哈希片键,就不能轻易更改。其次,哈希片键的计算涉及到哈希函数,如果数据的分布不均匀,可能会导致某些分片上的数据量过大或过小,从而影响系统的性能和稳定性。
在使用哈希片键时,需要考虑数据的插入和查询模式。如果数据的插入和查询模式比较随机,并且希望数据在各个分片上均匀分布,那么哈希片键是一个不错的选择。但是,如果数据的插入和查询模式比较有序,或者数据的分布本身就不均匀,那么可能需要考虑其他的数据分发方式。
MongoDB片键的限制主要包括以下几个方面:
片键的大小限制:片键的总长度不得超过512bytes。
片键的类型限制:片键的类型可以是升序排列的索引,也可以是一个以片键开头并指定排列顺序的复合索引,或者散列索引。但是,片键不能是multikey index,text index,geospatial index。
片键的修改限制:一旦分片集合完成,片键就不能修改。如果需要修改片键,需要执行一系列复杂的数据迁移和重新分片操作。
单文档的更新操作限制:对于分片集合的所有update()和remove()操作,如果查询条件没有包含片键字段或者_id字段,那么必须在指定了justOne或者multi:false属性后才能执行。
唯一性索引限制:MongoDB不支持分片集合的唯一性索引,除非以完整的片键作为索引的前缀。这种情况下,该索引就是全局唯一性索引。
插入的吞吐量限制:对于需要频繁插入的集群,片键的单调递增或递减能够影响插入的吞吐量。
数据库和集合命名限制:数据库和集合的命名有一些限制,例如数据库名称在MongoDB中不区分大小写,不能仅因字符的大小写而不同。集合名称应以下划线或字母字符开头,不能包含$,不能为空,并且必须少于64个字符。
分片集群的硬件和操作系统限制:MongoDB通常适用于64位操作系统,32位系统只能寻址4GB内存,意味着数据集包含元数据和存储达到4GB,Mongodb就无法存储额外的数据了。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6