01. NoSql简介
NoSql简介
关系型数据库:
- 性能瓶颈:磁盘IO性能低下
- 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群。
解决思路:
- 降低磁盘IO次数,越低越好。
使用内存存储
- 尽量去除数据间的关系,越简单越好
不存储关系,仅存储数据
NoSql : 即 Not-Only SQL (泛指非关系型数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征:
- 可扩容,可伸缩
- 大数据量下高性能
- 灵活的数据模型
- 高可用
NoSql数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模的存储。
这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
常见的NoSql数据库:
- Redis
- memcache
- HBase
- MongoDB
常见的电商解决方案:
- 商品基本信息(名称、价格、厂商) ,存放在关系型数据库中,例如MySQL
- 商品附加信息(描述、详情、评论),访问量较高,存放在 MongoDB 中
- 图片信息,存储在分布式文件系统中,例如 FastDFS
- 搜索关键字,存放在全文检索中,例如 ES、Lucene、Solr
- 热点信息(高频、波段性),存放在缓存中,例如 Redis、Memcache、Tair
NoSQL数据库主要分类:
分类 | Examples | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldmort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等 | key指向value的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当做字符串或二进制数据 |
列存储数据库 | Cassandra, Hbase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDB | Web应用(与key-value类似,value是结构化的,不同的是数据库能够了解value的内容) | key-value对应的键值对,value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法 |
图数据库(Graph) | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案 |
BSON:BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。它和JSON一样,支持内嵌的文档对象和数组对象。
MongoDB:是一个基于分布式文件存储的数据库。由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。
传统的RDBMS(关系型数据库)的事务的ACID:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)、持久性(Durability)。
CAP理论:强一致性(Consisitency)、可用性(Availabity)、分区容错性(Partition tolerance)。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求,最多只能较好的满足两个。
因此,根据CAP原理,将NoSQL数据库分成了满足CA原则、满足CP原则、满足AP原则三个大类。
对于分布式系统。一定要满足分区容错性。
- CA
单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大。
例如:RDBMS
- CP
满足一致性、分区容忍性的系统,通常性能不是特别高。
例如:MongoDB、Hbase、Redis
- AP
满足可用性。分区容忍性的系统,通常可能对一致性要求低一些。
例如:CouchDB、Cassandra、DynamoDB
对于传统关系型数据库,主要满足CA。
对于NoSQL数据库,分区容忍性是必须实现的,剩下的在一致性和可用性之间取舍。
BASE:基本可用(Basically Available)、软状态(Soft state)、最终一致(Eventually consistent)。
BASE是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
它的思想是通过让系统放松对某一时刻数据强一致性的要求,来换取系统整体伸缩性和性能上改观。为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。
CAP + BASE 示例:电商活动高峰期,为了满足订单等实时性,可以暂时让每个用户看到的订单总数稍有偏差,牺牲强一致性。等高峰期过去之后,最终还是要达到一致性。
分布式和集群
分布式系统(Distributed system):由多态计算机和通信的软件组件通过计算机网路连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正式因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在不同的平台上,如:PC、工作站、局域网、广域网等。
分布式:不同的多台服务器上部署不同的服务器模块(工程),他们之间通过RPC/RMI之间通信和调用,对外提供服务和组内协作。
集群:不同的多态服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。