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