深入了解MongoDB 分布式集群

在分布式应用系统中,mongodb 已经成为 NoSQL 经典数据库。要想很好的使用 mongodb,仅仅知道如何使用它是不够的。只有对其架构原理等有了充分认识,才能在实际运用中使其更好地服务于应用,遇到问题知道怎么处理,而不是抓瞎抹黑。这篇文章就带你进入 mongodb 集群的大门。

集群概览

mongodb 相关的进程分为三类:

  • mongo 进程 – 该进程是 mongodb 提供的 shell 客户端进程,通过该客户端可以发送命令并操作集群;
  • mongos 进程 – mongodb 的路由进程,负责与客户端连接,转发客户端请求到后端集群,对客户端屏蔽集群内部结构;
  • mongod 进程 – 提供数据读写的 mongodb 实例进程。

类比银行服务,mongo 进程相当于客户,mongos 进程是柜台服务员,mongod 进程是银行后台实际处理业务的人员或者流程。客户只需要和柜台服务员沟通,告知办什么业务,柜台服务员将业务转往后台,后台实际处理。

下图是 mongodb 集群的一般拓扑结构。

深入了解MongoDB 分布式集群

如图,mongodb 集群的节点分为三类:

  • mongos 路由节点:处理客户端的连接,扮演存取路由器的角色,将请求分发到正确的数据节点上,对客户端屏蔽分布式的概念;
  • config 配置节点:配置服务,保存数据结构的元数据,比如每个分片上的数据范围,数据块列表等。配置节点也是 mongod 进程,只是它存储的数据是集群相关的元数据;
  • shard 分片节点:数据存储节点,分片节点由若干个副本集组成,每个副本集存储部分全体数据,所有副本集的数据组成全体数据,而副本集内部节点存放相同的数据,做数据备份与高可用。

还是拿银行业务类比,当客户办理保单保存业务时,

  1. 柜台服务员接受客户的保单业务请求(mongos 路由节点接收客户端的操作请求);
  2. 柜台服务员查询文件目录系统查看该保单应该保存到哪个仓库(mongos 节点与 config 配置节点通信,查询相关操作数据在哪个分片节点);
  3. 知道哪个仓库后,柜台服务员将保单给仓库管理员,仓库管理员将保单放到指定仓库中(mongos 节点将请求发送给数据所在分片节点,分片节点进行读写处理)。

mongos 路由服务

mongos 服务类似网关,连接 mongodb 集群与应用程序,对外屏蔽 mongodb 内部结构,应用程序只需要将请求发送给 mongos,而无需关心集群内部副本分片等信息。

mongos 本身不保存数据与索引信息,它通过查询 config 配置服务来获取,所以可以考虑将 mongos 与应用程序部署在同一台服务器上,当服务器宕机时 mongos 也一起失效,防止出现 mongos 闲置。

mongos 节点也可以是单个节点,但为了高可用,一般部署多个节点。就像柜台服务员一样,可以有多个,相互之间没有主备关系,都可以独立处理业务。

需要注意的是,在开启分片的情况下,应用程序应该避免直接连接分片节点进行数据修改,因为这种情况下很可能造成数据不一致等严重后果,而是通过 mongos 节点来操作。

config 配置服务

config 配置节点本质也是一个副本集,副本集中存放集群的元数据,如各个分片上的数据块列表,数据范围,身份验证等信息。如下,可以看到数据库 config,数据库中集合保存了集群的重要元数据。

mongos> use config;
switched to db config
mongos> show collections;
changelog
chunks
collections
databases
lockpings
locks
migrations
mongos
shards
tags
transactions
version

一般情况下,用户不应该直接变更 config 的数据,否则很可能造成严重后果。

shard 分片服务

分布式存储要解决的是两个问题:

随着业务不断发展,数据量越来越大,单机存储受限于物理条件,必然要通过增加服务器来支持不断增大的数据。所以分布式下,不可能全部数据存储在一个节点上,必然是将数据划分,部分数据放到这个节点,另外部分数据放到另外的节点上。也就是数据的伸缩性。
考虑高可用。如果同一份数据只存在一个节点上,当这个节点发生异常时,数据不可用。这就要求分布式下同一份数据需要存储在多个节点上,以达高可用效果。

深入了解MongoDB 分布式集群

扫一扫手机访问