一、概述
1.1 数据库环境
1.2RDBMS数据库管理系统(DBMS,Database Management System)是为管理数据库而设计的软件管理系统;当前最广泛的DBMS系统是RDBMS(RelationalDBMS),在RDBMS模型中,使用二维表格来表示数据库中的数据,代表性的RDBMS包括:Oracle、MicrosoftSQL Server、MySQL、PostgreSQL等;数据库管理系统使用情况世界排名,参考:https://db-engines.com/en/ranking;
1.3 CAP 定理1998年,加州大学计算机科学家 Eric Brewer 提出:在设计一个分布式环境的应用程序时,存在三个基本(需求)指标,分别是一致性、可用性、分区容错性(首字母分别是 C、A、P),在任何时间点,一个分布式系统都只能满足上述三个指标中任意二个,而不可能三个指标同时满足;这个结论就叫做 CAP 定理(又称"布鲁尔定理",Brewer'stheorem);CAP理论的核心是:一个分布式系统不可能同时很好的满足"一致性、可用性、分区容错"这三个需求,最多只能同时较好的满足两个;因此,根据 CAP原理可以将数据库分成三类:(1)满足CA原则:单点集群,满足一致性,可用性的系统,通常可扩展性较差;传统RDBMS系统属于CA;(2)满足CP原则:满足一致性,分区容忍性的系统,通常性能不是特别高???(3)满足AP原则:满足可用性,分区容忍性的系统,通常可能对一致性要求低一些;
1一致性(Consistency):所有节点在同一时间具有相同的数据;即:写操作之后,再进行读操作,必须返回写入的值;即:一旦写入数据,以后的任何读取请求都应包含该数据;比如:更新订单状态后,所有客户端都应该能够看到相同的数据;2可用性(Availability):保证每个请求不管成功或者失败都应该有响应;即:只要收到用户的请求,服务器就必须给出回应,服务器不应该有任何宕机时间;3分区容错(Partition tolerance):大多数分布式系统都分布在多个子网络中,每个子网络就叫做一个区(Partition);分区容错意味着即使服务器之间的通信不稳定,系统也应继续运行;比如:某个分区中的服务器不可用,但其他分区中的服务器始终不受影响;1.4 水平(横向)扩展传统RDBMS数据库系统面临新的挑战,比如:(1)数据库并发负载高,读写请求万次/秒;(2)海量数据存储,万条/秒,亿条/天;(3)数据库空间占用越来越大;(4)很多应用系统并不要求严格的数据库事务,或事务要求降低;(5)对数据的实时性要求降低;(6)多表之间的关联查询被弱化;在"如何扩展传统RDBMS数据库"问题(性能,空间,速度等)上,是个头疼的问题,通常采用的方式有二种:扩展方式描述1纵向扩展(scale up,垂直扩展)使用性能更强劲的机器来满足(单个节点的)扩展需要;但(单节点)物理机器都有性能极限,当达到极限时,将很难再扩展了;2横向扩展(scale out,水平扩展)通过数据分区(或类似方式)将数据分散到(分布式)多台机器上(类似集群);当需要提高性能时,添加新机器并加入到集群中;MongoDB的"横向扩展"方式包括:"Replica Sets复制集","Sharding分片集群";实际生产环境下,"横向扩展"的优势将更加明显,但实际实施过程中,"横向扩展"需求看似简单,却困难重重;比如RDBMS系统中:(1)MySQL/PostgresSQL都无法在多台服务器上同时运行单个数据库(多台服务器无法同时读取或修改数据);(2)Oracle可以通过RAC(Real Application Clusters,实时应用集群)构架实现横向扩展,但价格及其高昂;1.5 NoSQL常用的数据存储方式有三种:(1)文件系统直接存储(比如:excel、access等);(2)关系型数据库系统(RDBMS);(3)NoSQL数据库系统;传统RDBMS系统适用于保存结构化数据,使用SQL查询数据;RDBMS系统基于ACID(Atomic原子性、Consistent一致性、Isolated隔离性、Durable持久性)事务的概念;(1)Atomic原子性:对于一个事务而言,要么全做,要么全不做;(2)Consistent一致性:当一个事务被提交后,提取特定数据的查询都将得到相同的结果;(3)Isolated隔离性:被应用到相同数据集的事务都是独立的,一个事务不会干扰另一个事务;(4)Durable持久性:数据的改变是永久的,即使出现故障也不会丢失;NoSQL(NotOnly SQL)是一种非关系型、分布式数据库系统,它放弃了传统RDBMS中的结构化模型,也不完全遵循ACID特性,而是使用更加接近系统数据流需求的方式实现数据模型;实际优势如下:高可扩展性、分布式计算、没有复杂的关系、低成本、架构灵活、半结构化数据;NoSQL适用于超大规模数据的存储;常见的NoSQL数据模型包含如下几类:存储方式描述主要产品1列存储按"列"存储数据,方便存储"结构化"或"半结构化"的数据,数据压缩方便,在针对某列或某几列的查询中有非常大的I/O优势;SimpleDB、BigTable(Google)、HBase(Apache)、Cassandra(Facebook)、Hypertable、Azure TS2键值方式Key-Value存储;通过key键可快速查询到value值;(1)In-memory:Memcached(数据仅存储在内存中,以牺牲数据持久性来换取速度)(2)Disk Based:Redis、Tokyo Cabinet、Dynamo(Amazon)、Voldemort、Flare、Tyrant、BerkeleyDB3对象式存储通过类似"面向对象语言"的语法方式操作数据库,通过对象的方式存取数据;db4o、Versant4文档样式存储使用JSON格式存储数据,存储的内容是文档型的;MongoDB、CouchDB(Apache)、SimpleDB、LotusDomino、Riak5图形式存储图形关系的最佳存储方式;Neo4j、FlockDB、InfiniteGraph、Virtuoso、GraphDB6XML式存储高效存储XML数据,并支持XML的内部查询语法(比如XQuery、Xpath等)BaseX,Berkeley DB XML、MarkLogic