这是我参与「第五届青训营」伴学笔记创作活动的第11天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。
如果不做数据持久化,系统将没有长期的记忆。
数据库可能需要达到的效果
- 校验数据合法性
- 高效的数据结构组织数据
- 内存中的:便于写入存储介质
- 写入存储介质:以寿命&性能友好的方式写入长期存储介质。
挑战
- 数据不丢失?
- 多人修改?(同步,并发,一致性?)
- 结构化数据,那么其他数据呢?
- 多种操控数据库的方式?
- 除了数据库之外的存储系统?
存储系统
- 提供读写,控制类接口
- 能安全有效将数据持久化的软件
系统特点
- 性能敏感
- 易受硬件影响(或硬件无关的设计?)
数据从应用到存储介质 缓存十分重要 拷贝很昂贵,需要减少
RAID 技术
背景:
- 单块大容量磁盘==价格 ==> 多块小容量磁盘
- 单块写入==性能== < 多块并发
- 单块磁盘的容错性有限
数据库
数据库= =存储系统?
关系 :Relation
关系代数:对关系做运算
- 交
- 并
- 笛卡尔积
- ...
SQL:一种DSL domain specific Language
关系型数据库特点
关系型数据库指的是使用关系模型(二维表格模型)来组织数据的数据库。
首先它是存储系统,但是又有其他能力:
- 结构化数据友好
- 支持事务——ACID
- 支持复杂查询(可能没有到所有关系代数的阶段)
- 数据存储在磁盘,安全可靠
传统关系型数据库的缺陷:
- 高并发读写能力差:网站类用户的并发性访问非常高,而一台数据库的最大连接数有限,且硬盘 I/O 有限,不能满足很多人同时连接。
- 海量数据情况下读写效率低
- 无法快速容纳新的数据类型
非关系型数据库(NOSQL)的特点
非关系型数据库又被称为 NoSQL(Not Only SQL 。通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据。
常见的NoSQL分类:
- 键值数据库:redis、Memcached、Riak
- 列族数据库:Bigtable、HBase、Cassandra
- 文档数据库:MongoDB、CouchDB、MarkLogic
- 图形数据库:Neo4j、InfoGrid
特点:
- 速度快,效率高(甚至采用内存作为载体)
- 高并发,拓展简单
- 近年来来时逐渐支持SQL子集查询
- 虽然支持拓展,但是数据的一致性需要通过一定策略才能保障。
思考
- 写入存储系统的粒度太大,会不会导致数据原子性问题?例如一次性写100MB,如果系统突然crash,会不会只有一部分数据持久化了,另一部分丢失了?如果要解决原子性问题,一般会设计什么机制?
- 如果系统不崩溃,批操作每次都正常完成,那么不会导致原子性问题。
- 但是出现crash的情况,可能会出现原子操作被拆开的现象,解决方案是建立错误回滚机制,事务异常之后,应该回滚到上一个保障数据一致性的点。
- 在从应用程序到存储介质的链路上,无论读还是写,数据可能要被拷贝好几次,这几次拷贝能不能去掉?如果我们去掉大部分拷贝操作,会有什么副作用,要怎么缓解副作用?
- 可以
- ...
- 可以
- 一个关系型数据库大概率是会被并发访问的,如果要保证并发安全,除了在行数据上加悲观锁还有其他方式吗?
- 两阶段锁:锁升级策略,读数据需要获取共享锁(支持并发读),写数据获取独占锁(不允许其他读写)。
- 在数据库领域,把数据按行存和按列存各有好处,你能从性能优先的角度设计出一种混合存储格式吗?
- 可能要根据日常查询需要设计....
:)