分片技术:通过MongoDB实现水平扩展的机制

这是关于MongoDB基础内容的总结。这是一个关于MongoDB已有的高质量解释性内容的网站摘要。
分片:是MongoDB实现水平扩展的机制。

分片是什么?

分片是指将数据在多个节点间进行分布的过程。
通过将不同的数据保存在多个节点上,实现了横向扩展性,以提高读写性能。

当数据集很大时,单个节点可能会因为 CPU 或 I/O 的性能限制而成为瓶颈。通过分片,可以减少每个分片节点处理的操作数量,从而解决这个瓶颈问题并提升整个集群的性能。

分片使水平扩展成为可能,并带来以下优点。

通过负载均衡来提高性能:通过将数据分布到多台服务器上,可以实现CPU和IO负载的分散。

通过资源分散来提高成本效益:
内存和硬盘的价格与其大小成正比。将数据分散到多台服务器上,将每台服务器上的存储容量减小,可以提高成本效益。

MongoDB自动分片机制

MongoDB的分片采用了范围分区的方法。通过指定分片键,确定每个服务器存储的数据范围。服务器之间不会重复存储数据,一条数据只会存储在一个服务器上,而这个服务器会通过分片键的范围来确定。

分散数据的单位被称为“块”,它是一系列连续数据的集合,可以是多个文档。当块达到设定的最大大小时,它会被分割,并根据各个分片所包含的块数自动移动到其他分片中。当然,块的分割和移动对性能有着重大影响,由于块的移动或分割过程中,部分请求可能无法返回正确的信息,因此选择合适的分片键以尽量减少块的移动和分割是至关重要的。

自动将块逐渐分割并进行再平衡的机制

在MongoDB的自动平衡中,如果每个分片中具有最大块数和最小块数之间的差超过规定值,则会进行均衡处理并移动块作为均衡过程。(如果添加了新的分片,则同样会进行重新平衡处理)

例如,假设Shard1最初只有一个数据块A,然后又添加了数据块B到Shard1中,接着又添加了数据块C到Shard1中。假设默认值为2,则由于超过了默认值,数据块C会自动转移到Shard2中(请参考下图)。