序言
Mongodb的集群环境,的工作原理简单梳理下.当然也是站在别人的肩膀上(多人的肩膀上).做一个我认为比较好的梳理.
原理是个很重要的东西,可以帮助你解决 你不知道你不知道的问题. 同时也帮助你去理解.cuiyaonan2000@163.com
参考文章:
- https://blog.csdn.net/wang1144/article/details/53964999
- https://www.jianshu.com/p/2825a66d6aed
- http://c.biancheng.net/view/6567.html
- https://blog.csdn.net/zhangcongyi420/article/details/92738646
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会重新平衡数据,使每片的流量都比较均衡,数据量也在合理范围内。
来源:oschina
链接:https://my.oschina.net/u/4397179/blog/4534016