mongoDB基础知识

MongoDB基本概念与优点

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。

mongo的操作很灵活,提供了多种数据操作的方法,与关系型数据库很相似,用起来很方便(bson)。mongo使用最终一致性的方案,速度很快,内置了分片操作,可以支持很大的数据操作;对非索引的查询效率明显高于mysql这种关系型数据库。支持复制和故障切换的支持,搭建集群分散单机压力。而且很容易拓展。

mongodb为什么快?

写操作MongoDB比传统数据库快的根本原因是Mongo使用的内存映射技术 - 写入数据时候只要在内存里完成就可以返回给应用程序,这样并发量自然就很高。而保存到硬体的操作则在后台异步完成。

读快的原因是,MongoDB的设计要求常用的数据(working set)可以在内存里装下。这样大部分操作只需要读内存,自然很快。

对事务的要求性比关系型数据库要低。有自动分片,而且没有mysql分布式之后纵向切片的的表的join操作。

MongoDB 的数据冗余

一种是主从复制,一种是副本集模式

目前主要使用的是副本集模式。副本集其实一种互为主从的关系,可理解为主主复制,是一个自带故障转移功能的主从复制

mongodb的框架里还有个分片的概念,这是一个基层框架:分片指的是,为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。

主从复制

在主从结构中,主节点的操作记录在oplog日志文件中。oplog存储在一个系统数据库local的集合中,这个集合的每个document都代表主节点上执行的一个操作。这里有个并发写oplog的加锁问题,一致性问题:意向锁先锁DB,再锁Collection,再做数据库操作,再锁local,再锁oplog,写,然后释放。oplog的顺序问题:写顺序,用时间戳解决,写如oplog时以时间戳为key,内容为value存储,这样数据写进来按照时间戳排序即可。但是这样还有个从库的读问题,从库可能先读取到时间戳13,而2对应的在3之后才勉强写入primary,这个时候从库的顺序就会出现问题。解决方法是在读取的时候做限制,保证读取的一定是顺序的,具体做法是建一个未提交表,如果事务没有完全提交,secondary是读取不到未提交表里最小值之前的数据的。

从服务器会定期从主服务器中获取oplog记录,然后在本机上执行,对于存储oplog的集合,MongoDB用的是固定的集合,也就是说操作过多之后,最新的操作会覆盖最旧的操作。

在传统的主从模式是需要手工指定集群中的 Master。如果 Master 发生故障,一般都是人工的指定新的 Master节点。

副本集复制

副本集有改进的地方就是它可以进行故障的自动转移,如果主库宕掉或者是与很多从机失联了,那么剩余成员会再自动选举一个成员,作为主库。

一个副本集即为服务于同一数据集的多个 MongoDB 实例,其中一个为主节点primary,其余的都为从节点secondary。主节 点上能够完成读写操作,从节点仅能用于读操作。主节点需要记录所有改变数据库状态的操作,同样这些记录保存在 oplog 中,这个文件存储在 local 数据库,各个从节点通过此 oplog 来复制数据并应用于本地,保持 本地的数据与主节点的一致。

oplog 具有幂等性,就是无论执行几次其结果一致, mongodb的幂等是对很多操作进行来转换来实现的,比如将 insert 转换为 upsert、$inc 操作转换为 $set

集群中的各节点还会通过传递心跳信息来检测各自的状况。当主节点故障时,多个从节点会触发一次 新的选举操作,并选举其中的一个成为新的主节点(通常谁的优先级更高,谁就是新的主节点),心跳信 息默认每 2 秒传递一次。Mongodb副本集选举采用的是Bully算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争,被其他所有节点接受的节点才能成为主节点。

分片集群

分片集群是一种可以水平扩展的模式,在数据量很大时很好用。sharding分片解决了单台服务器磁盘空间、内存、cpu等硬件资源的限制问题,把数据水平拆分出去,降低单节点的访问压力。每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上的完整的数据库。因此,分片机制降低了每个分片的数据操作量及需要存储的数据量,达到多台服务器来应对不断增加的负载和数据的效果。

分片的基本思想就是:

将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分。通过一个名为 mongos 的路由进程进行操作,mongos 知道数据和片的对应关系。

数据的拆分是通过片键完成的,mongos是一个路由服务器,它会根据管理员设置的"片键"将数据分摊到自己管理的mongod集群,数据和片的对应关系以及相应的配置信息保存在"config服务器"上。客户端只需要对 mongos 进行操作就行了,至于如何进行分片客户端是不参与的,全部由 mongos 和 config 来完成。

所以要构建一个分片集群,需要三种角色:

1)分片服务器(Shard Server)

   就是mongod 实例,用于存储实际的数据块,实际生产环境中一个 shard server 角色其实是由几台机器组个一个复制集,防止主机单点故障。

2)配置服务器(Config Server)

   用来存放路由、分片的配置,mongos就是利用这里面配置的信息缓存到内存里去路由的。配置服务器的 1KB 空间相当于真实数据的 200MB。保存的只是数据的分布表。

3)路由服务器(Route Server)

   就是一个mongos实例,是一个前端路由,客户端由此接入,且让整个集群看上去像单一数据库。本身不保存数据,在启动时从配置服务器加载集群信息,开启 mongos进程需要知道配置服务器的地址,指定configdb选项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值