mongoDB中分片与复制(副本集)的关系

    今日学习mongoDB的时候,遇到这两个概念,本人不才,一时无法理解之前的关系与区别和作用。我们先来看一下这俩个概念在手册上是怎么说的:

1.复制(副本集):  

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。

复制原理:  

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

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

MongoDB复制结构图如下所示:

mongoDB中分片与复制(副本集)的关系

理解:复制比较好理解。简单来说就是为了防止一台数据库服务器出问题导致应用程序错误而采取的措施。具体实现是:应用程序的所有写入操作都只在主节点(图上的Primary)上进行,主节点的操作将会被记录(oplog--[operation log])。oplog存储在主节点的一个特殊的数据库中,叫做local。oplog就在其中的oplog.$main集合里面。oplog中的每个文档都代表这主节点上的一个操作(注意:oplog只会存储改变数据库状态的操作,比如新增,更新,删除。所以查询并不会记录,也不需要记录)。之后从节点(图中的Secondary)将会定时访问oplog,根据oplog的记录来更新自身以保持与主节点的同步。再上一张图:

mongoDB中分片与复制(副本集)的关系


2.分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

分片原理

mongoDB中分片与复制(副本集)的关系


上图中主要有如下所述三个主要组件:

  • Shard:

    用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

  • Config Server:

    mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

  • Query Routers:

    前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

理解:

分片是指将大量的数据集合分成一块块小的数据集合。将这些一块块下的数据集合分散在不同机器上的过程。

举个栗子:假设有个文档集合表示的是人员。人员名字以A~F开头,如果不采用分片的话,那么这些文档将只存储在一个集合当中,时间久了,数据量就会非常的大。每次查询将数据库都将承担相当大的压力,查询速度也会很慢。于是,我们采用分片的方法,将A~F与G~P,Q~Z开头的名字存放在不同的机器上去,再用一个类似与路由器的服务(mongos)识别用户的查询()。这样将会极大的减轻数据库服务器的负担,查询速度也会快很多。而且应用程序并不用关心分片中的具体实现,因为它只接入mongos服务。

mongoDB中分片与复制(副本集)的关系mongoDB中分片与复制(副本集)的关系


3.关系

    虽然两者的概念上都涉及到多台主机,集群的概念,倒是二者的作用与实现都是有着很大的区别;

    复制(副本集)的作用:将一台主机上的数据复制到多台从节点上的技术;

    分片的作用:将一台机器上的大数据集合分散成若干台机器上的小数据集合;

那么二者是如何协作的呢。通常在分片的机器上都会增加复制(副本集)的集群,防止单一主机宕机情况的发生,增加数据的安全性,稳定性。额。。。有点拗口,看下面的图应该就能明白了。

mongoDB中分片与复制(副本集)的关系

至此,想必分片与复制(副本集)的原理,概念,应用应该了解得差不多了。现在只要具体实现就能完成我们的分布式数据库了。具体实现的文章,等日后再发