📜  MongoDB-分片(1)

📅  最后修改于: 2023-12-03 14:44:22.640000             🧑  作者: Mango

MongoDB 分片

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

Config Server 记录了每个数据行所在的 Shard,因此必须以副本集的形式部署。副本集中至少包含 3 个节点。当某个节点失效时,可以由其他节点接替其工作。

Router

Router 是客户端连接 MongoDB 分片集群的接口。它会接收客户端的查询请求,并将请求转发到正确的 Shard 上,然后将 Shard 的响应结果合并后,返回给客户端。因此,Router 必须部署在一个单独的服务器上。一般情况下,可以部署多个 Router,以提高系统可用性和吞吐量。每个 Router 都可以同时连接多个 Config Server 和多个 Shard。

Shard

Shard 是存储实际数据的节点。它们可以部署在不同的服务器或者虚拟机上。一般情况下,每个 Shard 都可以存储多个副本。这些副本可以保证数据的可靠性和可用性。如果某个节点失效,MongoDB 会自动将其中的数据迁移到其他可用的节点上。

总结

MongoDB 分片是一个横向扩展 MongoDB 的方式。它可以将一个大型的 MongoDB 数据库分成多个分片,每个分片都分布在不同的服务器或虚拟机上。分片可以提高 MongoDB 的可靠性和吞吐量。分片需要选择好要进行分片的集合和哈希键,然后根据哈希键进行分片。MongoDB 具有两种分片策略:片键分片和范围分片。在进行分片部署之前,需要先准备好多个服务器或者虚拟机,然后在其中安装 MongoDB,并部署 Config Server、Router 和 Shard。