📅  最后修改于: 2023-12-03 14:44:22.640000             🧑  作者: Mango
MongoDB 分片是一种横向扩展 MongoDB 数据库的方式。分片将一个大型的 MongoDB 数据库分成多个分片,每个分片都分布在不同的物理服务器或虚拟机上。这样可以提高 MongoDB 的可靠性和吞吐量。
MongoDB 的分片是基于集合(Collection)的分片,因此需要选择要进行分片的集合。MongoDB 会把同一集合中的数据行,根据某个字段(如 _id ),进行散列计算,然后将数据行散列到不同的分片上。因此,对于每个数据行,都需要指定这个字段。此字段称为哈希键(Shard Key)。
分片通常由多台服务器组成,每个服务器都称为一个分片。MongoDB 维护一个 Config Server,用来记录数据在哪个分片上。客户端通过 Config Server 查找每个数据行所在的分片。MongoDB 会将查询转发到正确的分片,并从每个分片获取结果,然后将结果合并。这个过程被称为 Merging,Merging 会影响查询的性能。
在进行分片之前,需要先选择好要进行分片的集合。如果集合中的数据量很大,那么就可以考虑进行分片。选择好哈希键(Shard Key),然后根据哈希键进行分片。假设选择的哈希键是 user_id ,则可以将 user_id 散列后的结果作为分片依据。
对于一个分片集群来说,分为三个部分:Config Server、Router 和 Shard。其中 Config Server 用于记录数据在哪个 Shard 上,Router 用于接收并响应客户端的查询请求,Shard 则存储实际的数据。
MongoDB 具有两种分片策略:片键(Hashed Sharding)和范围(Ranged Sharding)。两种策略的原理具体如下:
片键分片是 MongoDB 最早推出的一种分片策略。它是通过哈希函数计算片键的哈希值,然后根据哈希值选择一个 Shard 存储数据。这种分片策略使得每个 Shard 存储的数据大小基本相等。同时,数据分布是随机的,避免了某个 Shard 负载过高的问题。
范围分片是将数据按照哈希键的值进行划分,从而将数据分散到不同的 Shard 上。这种分片方式比片键分片更加灵活和精细。也就是说,对于某个哈希键的范围,可以指定一个 Shard 来存储数据。
在部署 MongoDB 分片之前,需要准备多个服务器或者虚拟机。在这些服务器上安装 MongoDB,然后配置三个组件:Config Server、Router 和 Shard。
Config Server 记录了每个数据行所在的 Shard,因此必须以副本集的形式部署。副本集中至少包含 3 个节点。当某个节点失效时,可以由其他节点接替其工作。
Router 是客户端连接 MongoDB 分片集群的接口。它会接收客户端的查询请求,并将请求转发到正确的 Shard 上,然后将 Shard 的响应结果合并后,返回给客户端。因此,Router 必须部署在一个单独的服务器上。一般情况下,可以部署多个 Router,以提高系统可用性和吞吐量。每个 Router 都可以同时连接多个 Config Server 和多个 Shard。
Shard 是存储实际数据的节点。它们可以部署在不同的服务器或者虚拟机上。一般情况下,每个 Shard 都可以存储多个副本。这些副本可以保证数据的可靠性和可用性。如果某个节点失效,MongoDB 会自动将其中的数据迁移到其他可用的节点上。
MongoDB 分片是一个横向扩展 MongoDB 的方式。它可以将一个大型的 MongoDB 数据库分成多个分片,每个分片都分布在不同的服务器或虚拟机上。分片可以提高 MongoDB 的可靠性和吞吐量。分片需要选择好要进行分片的集合和哈希键,然后根据哈希键进行分片。MongoDB 具有两种分片策略:片键分片和范围分片。在进行分片部署之前,需要先准备好多个服务器或者虚拟机,然后在其中安装 MongoDB,并部署 Config Server、Router 和 Shard。