Mongodb的集群

时间秒杀一切 提交于 2020-09-30 10:53:54

序言

       Mongodb的集群环境,的工作原理简单梳理下.当然也是站在别人的肩膀上(多人的肩膀上).做一个我认为比较好的梳理.

       原理是个很重要的东西,可以帮助你解决 你不知道你不知道的问题. 同时也帮助你去理解.cuiyaonan2000@163.com

 

参考文章:

 

Master-Slaver(主重模式)

  • 主(Master): 可读可写,当数据有修改的时候,会将oplog同步到所有连接的salve上去。

  • 从(Slave): 只读不可写,自动从Master同步数据。

     对于Mongodb来说,并不推荐使用Master-Slave架构,因为Master-Slave其中Master宕机后不能自动恢复. (只能人工介入,指定新的主节点,从节点不会自动升级为主节点。同时,在这段时间内,该集群架构只能处于只读状态。)

       Master-Slave不支持链式结构,Slave只能直接连接Master。

       Redis的Master-Slave支持链式结构,Slave可以连接Slave,成为Slave的Slave。

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

 

Replica Set(副本集)

在这里插入图片描述

  • 主节点(Primary--图中的M):接收所有的写请求,然后把修改同步到所有从节点。一个Replica Set只能有一个Primary节点,当Primar挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。

  • 副本节点(Secondary--图中的S):与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes

  • 仲裁者(Arbiter--图中的A): 不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。

       主节点负责数据的写入和更新,并在更新数据的同时,将操作信息写入名为 oplog 的日志文件当中。从节点会定时轮询读取 oplog 日志,根据日志内容同步更新自身的数据,保持与主节点一致。

       副本集中的各节点会通过心跳信息来检测各自的健康状况(副本节点中有相互的心跳机制,同时跟主节点也有心跳),当主节点出现故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。为了保证选举票数不同,副本集的节点数保持为奇数。MongoDB 的副本集是自带故障转移功能的主从复制。

Sharding(分片--水平切割,目前垂直切割的工具还没见到过)

 

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

       MongoDB 的分片集群,需要三个重要的组件,A:Shard Server(分片服务器)、B:Config Server(配置服务器)C: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 返回结果后进行聚合并返回客户端。(最后这句话有没有想分布式事务的二次提交的功能.~~~~)

片键的概念:程序需要从集合里面选一个键,用该键的值作为数据拆分的依据。这个键称为片键(shard key).随着添加或者删除片,MongoDB会重新平衡数据,使每片的流量都比较均衡,数据量也在合理范围内。

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!