NoSQL入门
什么是NoSQL?
数据模型
结构化数据
结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范
非结构化数据
非结构化数据指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如文本、图片、HTML、视频音频等
半结构化数据
-
半结构化数据是结构化数据的一种形式,虽然不符合二维逻辑这种数据模型结构,但是包含相关标记,用来分割语义元素以及对记录和字段进行分层,例如XML、JSON等 -
半结构化数据以
树或者图的数据结构对数据进行存储 -
对于结构化数据来讲通常是先有结构再有数据,而对于半结构化数据来说则是先有数据再有结构
关系型数据库
以关系型数据库的方式做存储的架构演进
-
阶段一:企业刚发展的阶段,一台应用服务器加一个关系型数据库,每次读写数据库
-
阶段二:通常随着企业规模的扩大,应用服务器成为性能瓶颈,增加多台应用服务器并且在流量入口使用
Nginx做一层负载均衡 -
阶段三:随着企业规模的继续扩大,数据库成为性能瓶颈,此时进行读写分离,每次写主库,读备库,主备库之间通过
binlog同步数据 -
阶段四:企业发展越来越好了,读写分离数据库压力还是越来越大,增加多台数据库做分库分表,对表做垂直拆分,对库做水平拆分
关系型数据库的优缺点
优点
-
操作方便:通用的
SQL语言使得操作关系型数据库非常方便,支持join等复杂查询 -
数据一致性:支持
ACID特性,可以维护数据之间的一致性 -
数据稳定:数据持久化到磁盘,没有丢失数据风险,支持海量数据存储
-
服务稳定:最常用的关系型数据库产品
MySql、Oracle服务器性能卓越,服务稳定,通常很少出现宕机异常
缺点
-
高并发下IO压力大:数据按行存储,即使只对其中某一列进行运算,也会将整行数据从存储设备中读入内存,导致
IO较高 -
维护索引代价大:数据的更新伴随着所有二级索引的更新,降低了关系型数据库的读写能力,且索引越多读写能力越差
-
维护数据一致性代价大:
SQL标准为事务定义了不同的隔离级别,从低到高依次是读未提交、读已提交、可重复度、串行化,事务隔离提供的隔离级别越高读写性能越差 -
水平扩展带来的问题:做了分库之后,数据迁移、跨库
join、分布式事务处理都是需要考虑的问题 -
表结构扩展不方便:如果需要修改表结构,需要执行
DDL导致锁表,部分服务不可用
非关系型数据库
非关系型数据库(NoSQL,Not Only SQL)是对不同于传统的关系数据库的数据库管理系统的统称,主要用于解决数据的高并发读写、海量存储与高可扩展等需求。
NoSQL数据库的优点
-
高可扩展:
NoSQL数据之间没有关系,所以非常容易扩展 -
高性能:同样由于
NoSQL的无关系性,使其具有非常高的读写性能 -
灵活的数据模型:
NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式
NoSQL数据库的分类
| 键值存储 | 列存储 | 文档存储 | 图形存储 | |
|---|---|---|---|---|
| 存储结构 | 键值对 | 列簇式存储 | 类JSON对象 | 图结构 |
| 应用场景 | 内容缓存 | 分布式数据存储与管理 | Web应用 | 关系图谱 |
| 典型代表 | Redis、Memcached | Cassandra、HBase | MongoDB、CouchDB | Neo4j、Infinite Graph |
NoSQL的CAP+BASE
NoSQL往往是多节点,通过BASE理论保证数据一致性
CAP理论
2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。
-
一个分布式系统最多只能同时满足
强一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项-
强一致性(Consistency):更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(弱一致性与最终一致性不受CAP理论限制) -
可用性(Availability):服务一直提供相应,而且是正常响应时间 -
分区容错性(Partition tolerance):系统中任意信息的丢失或失败不会影响系统的继续运作
-
-
CAP的关系-
CP without A:一旦发生网络故障或者消息丢失等情况,就要等待所有数据全部一致了之后再提供服务,比如Redis、HBase这种分布式存储系统,或是Zookeeper这种分布式协调组件,数据一致性是它们最基本的要求 -
AP wihtout C:一旦网络问题发生,每个节点只能用本地数据提供服务,导致全局数据的不一致性,许多Web应用为了服务高可用,舍弃了强一致性退而求其次保证最终一致性(参考下面的BASE理论)
-
BASE理论
BASE 理论起源于 2008 年, 由eBay的架构师Dan Pritchett在ACM上发表。
-
BASE是基本可用(Basically Available)、软状态(Soft state)和最终一致性(Eventually consistent) -
最终一致性(Eventually consistent):系统中所有的数据副本,在经过一段时间的同步后最终能够达到一个一致的状态
什么是HBase?
HBase是基于Apache Hadoop构建的一个高可用、高性能、多版本的分布式列存NoSQL数据库,是Google BigTable的开源实现,提供海量数据高性能的随机读写能力。
HBase存储结构
数据模型
-
HBase本质上其实就是Key-Value类型的数据库 -
Key由RowKey(行键)+ColumnFamily(列族)+Column Qualifier(列修饰符)+TimeStamp(时间戳--版本)+KeyType(类型)组成,而Value就是实际上的值
系统架构
-
Client,提供了访问HBase的接口,并且维护了对应的cache来加速访问 -
Zookeeper,存储HBase的元数据,Client去Zookeeper里边拿到元数据才知道去哪台机器读写数据 -
HRegionServer,处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点 -
HMaster,处理元数据的变更和监控RegionServer的状态
HRegionServer结构
-
一张表的数据会通过
RowKey来横向切分到HRegion上,HRegion是Hbase中分布式存储和负载均衡的最小单元,一个HRegionServer可以包含多个HRegion -
HRegion的数据会通过ColumnFamily纵向切分到Store上,Store是HBase的核心存储单元,由MemStore和StoreFile组成 -
HBase在写数据的时候,会先写到MemStore,当MemStore超过一定阈值就会将内存中的数据刷写到硬盘上,形成StoreFile -
StoreFile底层是以HFile的格式保存,HFile是HBase实际存储的数据格式 -
为了防止机器宕机,内存的数据没刷到磁盘中就挂了,所以在写
Mem store的时候还会写一份HLog

参考文章
转载自:https://juejin.cn/post/6992400735937757214