浅谈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基础及架构)