浅谈MongoDB基础及架构
1.简述
MongDB是一个强大、灵活而可扩展的数据存储系统,其将强大的可扩展特性与关系库最有用的特性进行了整合,像:次级索引,范围查询和排序等特性。而MongDB也内建了类似MapReduce汇聚和地理空间索引等有用特性。
历经艰苦的努力,MongDB也拥有了易操作和用户友好等特性,同时,其还具备开发友好的模型、管理友好的配置选项及用起来感觉轻松自然的API和数据库shell。MongDB尽力让使用者省心,从而可以专注于编程而不用担心数据存储方面的问题。
2.特性
1)丰富的数据模型
MongDB是一个面向文档的数据库,而不是关系数据库。其之所以放弃关系模型的原因是为了易于扩展,当然,还有其他的优势方面的考虑。MongDB的理念是用一个更灵活的模型——“文档”,去替代关系库中行的概念。通过文档中嵌入文档和数组,其可以实现通过一条记录来表示复杂的层级关系,这点非常适合使用现代面向对象语言的开发者考虑数据的方式。
MongDB中没有模式的概念,一个文档的键无需通过任何方式预先定义或固定。通常,没有模式发生改变,就无需进行大量数据的迁移。新增或删除键可以在应用层面进行处理,而无需强制他们都适应固定且同样的格式。这在处理数据模型演化时给予了开发者许多灵活性。
2)易扩展性
现代应用的数据规模正以难以置信的速度增长。高级传感技术、可用带宽的增长以及互联网上手持设备的流行,这都将创建一个场景,其中哪怕小规模的应用都将产生前所未有的大量数据,TB级的数据,是之前闻所未闻的数据量,而现在却随处可见。
开发者数据量增长的同时,导致其将会面临一个困难的决定,他们将如何扩展他们的数据库?如果扩展数据库,将会面临纵向扩展(服务器硬件升级的更为强大)或横向扩展(将数据分布到多台服务器上)。纵向扩展通常是最容易的方法,但它也带来诸多缺陷,比如:更强大的服务器通常会很昂贵,当买不起更强大的服务器时,这种方法将到达一个物理上的硬性限制。对于人们最想建的大型web应用来说,通过一台服务器来实现不太可能,其成本也是难以承受的。
而横向扩展则兼具扩展性和经济性,为了增加存储空间和提升性能,你可以另外购买一台服务器,并将其加入你目前的集群。MongDB一开始就设计为横向扩展,其面向文档的数据模型允许它将数据在多个服务器间自动拆分,数据和负载能在集群内进行平衡,文档可以自动重新分布,这使得开发者专注应用开发,而非扩展数据库。当需要更多容量时,只需将一台新服务器加入现有集群,并让数据库自己想办法完成后续的一切。
3)维持高性能
卓越性能是MongDB的主要目标,并且,这也已经导致了有关它的很多设计决定。MongDB用二进制线性协议作为和服务器交互的主模式,其动态填补文档并预先分配数据文件以额外空间换取稳定的性能。MongDB默认存储引擎中使用内存映射文件,并将内存管理的任务交给操作系统。此外,其还具有动态查询优化器的特点,这使得它能记住执行查询的最快方式。简而言之MongDB几乎每个方面都是为维持高性能而设计。
虽然,MongDB足够强大且尽力试图保留关系库的很多特性,但其并非被设计来完成关系库的所有事情。任何时候,MongDB都尽量将处理和逻辑交给客户端的驱动或代码,保持这种流线设计是MongDB能获得如此高性能的原因之一。
4)易于管理
MongDB通过服务器自我管理来尽可能的简化数据库的管理。除了启动数据库服务器,很少需要人工管理。如果主库宕掉了,MongDB能自动切换到备库并将这个备库提升为主库。分布式环境中,集群只需要被告知一个新节点的加入,然后,MongDB将自动对其进行集成和配置。
5)其他特点
i)索引:MongDB支持通常的次级索引,允许各种快速查询,且支持唯一、复合及地理空间索引等。
ii)存储java脚本:开发者能在服务器端存储和使用java函数,以替代存储过程功能。
iii)汇聚:MongDB支持MapReduce和其他汇聚工具。
iv)固定大小集合:封顶集合大小固定,且其适用于类似日志的某些数据类型。
v)文件存储:MongDB支持存储大文件和文件元数据的易于使用的协议。
此外,MongDB并不支持关系库的某些常见特点,特别是连接(join)和复杂的多行事务。这些也是允许强大扩展特性的架构所决定的,因为分布式系统中难以支持关系库的那些特点。
3.架构
1)单库:如果单个MongDB库能承担所有数据和负载,且不考虑数据冗余和高可用,单节点没问题,研发和测试环境,这个架构比较常见,也比较容易部署,这里就不再多说了。
2)主从复制:主从复制架构是MongDB支持的最常见的复制环境。这种架构非常灵活,且能被用于备份、故障切换、读扩展及更多其他用途,这种架构至少需要两台服务器配置成一主一备,也可以用多台服务器配置成一主多备,当然,也可以通过同一服务器上的多个实例配置成一主一备或一主多备,结果就是,同一服务器上的多个实例实现的这种架构,无论在其灵活性、备份、高可用还是读扩展等方面,其作用都会大打折扣,生产环境中还是多个硬件服务器配置成的主备库架构更常见。
3)复制集:复制集基本就是一个可以自动故障切换的主备库集群。其和前述的主备库架构之间的最大差别就是复制集并没有一个固定的主库,而是由集群选出一个主库,当前的主库宕掉后,另外一个服务器上的备库会转变为主库。另外,两种架构都总是有一个主库和一个或多个从库。复制集的好处是一切都是自动的,集群自己会自己完成很多管理任务,将从库提升为主库并确保数据的一致性。对开发者来说,这种架构的易用性也很好,只需确定集群中的服务器,驱动程序将自动发现所有的服务器,如果当前服务器宕掉后会自动完成故障切换。
4)分片:所谓分片,就是将数据拆分并将拆分后的不同部分数据存储到不同的服务器,这样,在没有升级为更强大硬件服务器的情况下,才可能存储更多数据和处理更多负载。分片分为手工分片和自动分片。
i)手工分片:几乎针对任何数据库系统,都可以进行手工分片。其中,每个应用都保持到几个不同数据库服务器的连接,这些数据库服务器是相互完全独立的,应用代码负责管理将不同的数据存储到不同的服务器上,以及查询相应的服务器以获取到正确的结果数据。手工分片会运行的很好,但服务器的增减以及数据的分布和负载平衡模式发生改变时,相应工作人工维护起来会越来越困难。
ii)自动分片:MongDB支持自动分片,这消除了人工分片中管理维护工作的困难,MongDB负责维护数据的自动拆分和再平衡,同时,开发者也不用关心数据分布和负载均衡问题。MongDB自动分片时,会将其集合分散成小的数据块,这些数据块分布到不同的分片(服务器),其中的每个分片负责总数据集合中的一部分子集。通过mongos路由进程,MongDB实现了数据分片对用户应用程序的透明,应用程序无需关心什么分片存储什么数据,甚至数据被分散到多个分片服务器上。所有数据分片工作,都是通过所有分片前端的mongos路由进程来完成。应用的工作只是知道mongos进程的连接方式,并像连接MongDB一样成功
连接它就可以了。
浅谈MongoDB基础及架构的更多相关文章
- 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore
本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...
- 浅谈大型web系统架构
动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...
- 转:浅谈大型web系统架构
浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...
- AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构
requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...
- 【ZZ】浅谈大型web系统架构 | 菜鸟教程
浅谈大型web系统架构 http://www.runoob.com/w3cnote/large-scale-web-system-architecture.html
- 五分钟DBA:浅谈伪分布式数据库架构
[IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以“互联网行业应用最佳实践”为主题,定位于互联网架构设计.应用开发.应用运维管理,同时,峰会邀请 ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
- 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route
心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...
- 浅谈HTML5单页面架构(三)—— 回归本真:自定义路由 + requirejs + zepto + underscore
本文转载自:http://www.cnblogs.com/kenkofox/p/4650310.html 不过,这一篇,我想进一步探讨一下这两个框架的优缺点,另外,再进一步,抛开这两个框架,回到本真, ...
随机推荐
- 用 mongodb + elasticsearch 实现中文检索
而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库. 当然,可以在 web 应用中存储数据的时候,再主动写一份到 ...
- 2019SDN上机第2次作业
1. 利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 创建拓扑: 拓扑支持OpenFlo ...
- Linux权限及归属管理 磁盘管理 文件系统 LVM管理
第五六七章 alias 查看系统别名 67 chmod 设置文件或目录的权限 -R表示以递归的方式设置目录及目录下的所有子目录及文件的权限 u:属主 g:属组 o:其他人 a:所有人 +:添加 ...
- Note | PyTorch官方教程学习笔记
目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...
- oracle--oracle18C DG搭建(二)
配置清单 任务 数据库 创建主数据库数据文件的备份副本 主 为备用数据库创建控制文件 主 为备用数据库创建参数文件 主 将文件从主系统复制到备用系统 主 设置环境以支持备用数据库 备库 启动物理备用数 ...
- CodeForces 487E Tourists(圆方树+线段树+树链剖分)
题意 \(n\) 个点 \(m\) 条边的无向连通图,每个点有点权,\(q\) 个要求,每次更新一个点的点权或查询两点间路径权值最小的点最小的路径. 思路 算是圆方树的板子吧?圆方树处理的主要 ...
- eclipse 设置所有文件编码为UTF-8(最全)
如何修改eclipse工作空间的字符集以及项目的字符集? 第一种方式:修改eclipse的配置文件 打开{ECLIPSE_HOME}/eclipse.ini文件 在最后一行加上属性: -Dfile ...
- centos7.5安装java JDK、tomcat、mysql
参考资料: https://www.cnblogs.com/sxdcgaq8080/p/7492426.html https://blog.csdn.net/ds986619036/article/d ...
- java语言规范
一.标志符 命名规则: 标识符由26个英文字符大小写(a~zA~Z).数字(0~9).下划线(_)和美元符号($)组成. 不能以数字开头,不能是关键字 严格区分大小写 标识符的可以为任意长度 命名规范 ...
- C++ 类中的3种访问权限和继承方式
访问权限:public 可以被任意实体访问,protected 只允许子类(无论什么继承方式)及本类的成员函数访问,private 只允许本类的成员函数访问.三种继承方式分别是 public 继承,p ...