一天入门redis-为什么要学nosql
早年的单机mysql架构
应用层-数据访问层-数据库
当前的互联网时代:3V+3高
Volume+Variety+Veloctiy,高并发+高可扩+高性能
出现瓶颈:索引、数据过大一台服务器放不下,读写没有分离,数据库压力过大
Memcached的出现
通过mysql的垂直拆分,使用缓存技术缓解数据库压力,优化数据库结构和索引。使用Memcached的出现解决文件缓存共享的问题以及大量小文件缓存的问题。
主从读写分离
Memcached只能缓解读压力,开始使用master-slave模式(也就是主从复制,redis里面有加强版的哨兵模式)来达到读写分离。
数据增长问题
数据增长过程中,出现了分表分库+水平拆分+mysql Cluster集群,一定程度上缓解了这种压力
大文本数据问题
mysql有事会面临存储大文本字段的场景,如果数据出现问题,恢复会非常的慢,而且此时想要更改表结构也会非常困难。
NOSQL的兴起
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。
在超大规模和高并发的SNS类型的web2.0纯动态网站发展的情况下,有些数据存储不需要固定的模式,无需多余操作就可以横向扩展。
那么显而易见,NOSQL的特点就有:
易扩展:数据之间无关系,架构层面有有扩展可能性
数据量时的高读写性能:对比MySQL使用Query Cache,nosql的cache是记录级的,力度更小,性能更高
无需定义数据模型:增删字段更加自由
架构发展历程
第四代架构解决了性能和海量数据问题(Memcached集群、KV、CDN,数据切分,分布式存储)
第五代架构:敏捷、开发、体验
大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案(阿里):UDSL
传统RDBMS VS NOSQL
传统RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
nosql相关介绍
NOSQL的聚合模型以及相对应数据库
KV键值
类似map结构的kv,对应于redis
Bson
json的一种二进制形式的存储格式,对应MongoDB
列族
存储结构化和半结构化数据,方便做数据压缩,对应HBase
图形
专注于构建关系图谱,对应InfoGrid
什么是cap?
先来看看什么是传统的acid
- A (Atomicity) 原子性
- C (Consistency) 一致性
- I (Isolation) 独立性
- D (Durability) 持久性
下面是CAP
- C:Consistency(强一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
CAP三选二
CAP就是说在分布式存储系统中,最多只能实现上面的两点。
当前的网络硬件肯定会出现延迟丢包等问题,分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,目前没有NoSQL系统能同时保证这三点。
- CA 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。传统Oracle数据库
- AP 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。大多数网站架构的选择。Redis、Mongodb。
- CP 满足一致性,分区容忍必的系统,通常性能不是特别高。
分布式产品主流方向:牺牲C换取P
原因:
- 很多web对读一致性的要求很低,有些场合对写一致性要求并不高
- 对于很多web应用来说,并不要求这么高的写读实时性
- 对复杂的SQL查询,特别是多表关联查询的需求
什么是BASE
BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。
BASE其实是下面三个术语的缩写:
- 基本可用(Basically Available)
- 软状态(Soft state)
- 最终一致(Eventually consistent)
分布式概念
通过rpc、rmi通信调用、不同服务器上不同的服务对外提供组内组外协作
集群概念
不同的多台服务器上部署相同的服务,通过分布式调度软件进行统一调度,对提供服务