目录

浅析mongo的三种集群方案

MongoDb有三种部署方式:主从复制(Master-Slaver)、副本集(Replica Set)、分片(Sharding)

  • Master-Slaver 是一种主从副本的模式,目前已经不推荐使用

  • Replica Set 模式取代了Master-Slaver 模式,是一种互为主从的关系,Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中经常使用。

  • Sharding 模式适合处理大量数据,他将数据分开存储,不同的数据保存到不同的服务器种。

Sharding 模式追求的是高性能,而且是三种集群中最复杂的,再实际生产中,通常将Replica Set 和Sharding两种技术结合使用

主从复制

MongoDb 官方建议采用副本集替代主从复制,但是还是有必要了解一下主从复制。极其类似redis的主从复制。

主从复制是MongoDb中最简单的数据库同步备份的集群技术,其基本的设置方式是建立一个主节点(Primary)和一个或者多个从节点(Secondary),如下图所示

/images/img6.png

这种方式比单节点的可用性好很多,可用于备份、故障恢复、读扩展等。集群中的主从节点均运行MongoDb实例,完成数据的存储、查询、修改操作。

每个从节点要知道主节点的地址,主节点记录在其上的所有操作,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的与主节点的数据一致。

主从复制的集群中,当主节点出现故障时,只能人工介入指定新的主节点,从节点不会自动升级为主节点。同时,在这段时间内,该集群架构只能处于只读状态。

副本集

副本集,和redis哨兵模式的共同点:主要为了解决主从复制模式不具备高可用的问题。

副本集的集群架构如下:

/images/img7.png

此集群拥有一个主节点和多个从节点,这一点与主从复制模式类似,且主从节点所负责的工作也类似。相对于主从复制的优点(区别)在于:当集群中的主节点发生故障时,副本集可以自动投票,选举出新的主节点,而且这个过程对应用时透明的。

可以说,MongoDb的副本集是自带故障转移功能的主从复制。

主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中。主节点还负责指定其他节点为从节点,并设置从节点数据的可读性,从而让从节点来分担集群读取数据的压力。

另外,从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致。

在一些场景中,用户还可以使用副本集来扩展读性能,客户端有能力发送读写操作给不同的服务器,也可以在不同的数据中心获取不同的副本来扩展分布式应用的能力。

在副本集中还有一个额外的仲裁节点(不需要使用专用的硬件设备),负责在主节点发生故障时,参与选举新节点作为主节点。

副本集中的各节点会通过心跳信息来检测各自的健康状况,当主节点出现故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。为了保证选举票数不同,副本集的节点数保持为奇数。

分片

分片和redis cluster模式的共同点:主要是为了解决横向扩展的问题

副本集可以解决主节点发生故障导致数据丢失或不可用的问题,但遇到需要存储海量数据的情况时,副本集机制就束手无策了。副本集中的一台机器可能不足以存储数据,或者说集群不足以提供可接受的读写吞吐量。这就需要用到 MongoDB 的分片(Sharding)技术,这也是 MongoDB 的另外一种集群部署模式。

MongoDB 支持自动分片,可以使数据库架构对应用程序不可见,简化系统管理。对应用程序而言,就如同始终在使用一个单机的 MongoDB 服务器一样。

MongoDB 的分片机制允许创建一个包含许多台机器的集群,将数据子集分散在集群中,每个分片维护着一个数据集合的子集。与副本集相比,使用集群架构可以使应用程序具有更强大的数据处理能力。

MongoDB 分片的集群模式如下图所示

/images/img8.png

构建一个MongoDB的分片集群,需要三个重要组件,分别是:分片服务器(Shard Server)、配置服务器(Config Server)和路由服务器(Route Server)。

Shard Server

每个Shard Server 都是一个mongod 数据库实例,用于存储实际的数据块,整个数据库集合分成多个块存储在不同的Shard Server中。

在实际生产中,一个Shard Server可以由几台服务器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃。

Config Server

这是独立的一个mongod进程。保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息。

Route Server

这是独立的一个 mongos 进程,Route Server 在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口。

Route Server 本身不保存数据,启动时从 Config Server 加载集群信息到缓存中,并将客户端的请求路由给每个 Shard Server,在各 Shard Server 返回结果后进行聚合并返回客户端。

以上介绍了 MongoDB 的三种集群模式,副本集已经替代了主从复制,通过备份保证集群的可靠性,分片机制为集群提供了可扩展性,以满足海量数据的存储和分析的需求。