数据系统_数据密集型型系统设计

数据库基本功能

1.数据检索Retrieval 与 持久化Persistence 功能
   写缓冲Buffer、读缓存Cache     WAL 的核心思想是 日志先行 
   
   WAL 只允许在尾部追加数据 Append-Only ,不允许修改日志记录。
   这种不变性 Immutability 有利于并发控制:删改数据只能通过追加新的日志实现,因此修改前无需对数据加锁,直接在日志末尾追加新的记录即可
    WAL 的体积也不可能无限增长,系统需要周期性周期性的清理无用的日志记录,减少文件碎片,释放磁盘空间	
2.数据结构 或者索引结构
     Hash Index( 哈希索引)是一种常用的索引结构
	 SSTable(Sorted String Table)是一种常用的存储结构,用于实现高效的键值存储和检索
	 LSM-Tree(Log-Structured Merge Tree)是一种常用的数据结构
	 B-tree(平衡树)是一种常用的自平衡搜索树
	 Skip List(跳表)是一种基于链表的数据结构	
	 Inverted Index(倒排索引)是一种常用的索引结构
	 Suffix Tree(后缀树)是一种用于处理字符串的数据结构
3.在内存中存储一切	 以及 基于磁盘的索引实现的数据模型
      管理磁盘上的数据结构
      省去了将内存数据结构编码为磁盘数据结构的开销
	内存和磁盘
    
	  
4.在线事务处理(OLTP, OnLine Transaction Processing)和 在线分析处理(OLAP, OnLine Analytice Processing)
   OLTP:  高可用 与 低延迟
   OLAP--》 抽取-转换-加载(ETL) --》 data warehouse 数据仓库
   行存储和列存储
足够的概念和词汇储备--去读懂数据库的文档,从而选择合适的数据库	 

数据流动

 通过数据库( 通过数据库的数据流”)
 通过服务调用( “通过服务传输数据流:REST和RPC”)--服务中的数据流
 通过异步消息传递( “消息传递数据流”)--消息传递中的数据流  消息代理与数据库对比
 
数据--在线系统-流处理系统-批处理系统
  online--nearline-offline 
  online--service--服务  
  nearline--stream--事件-event 	  
  offline--job--作业	  
  
  数据库通常支持二级索引和各种搜索数据的方式,
  而消息代理通常支持按照某种模式匹配主题,订阅其子集。

Unix哲学-- 自动化,快速原型设计,增量式迭代,对实验友好,将大型项目分解成可管理的块  
       -- Unix工具的最大局限在于它们只能在一台机器上运	

数据存储和查询

存储-持久化-查询-搜索-检索	  
#!/bin/bash
db_set () {
    echo "$1,$2" >> database
}

db_set

db_get () {
    grep "^$1," database | sed -e "s/^$1,//" | tail -n 1
}

Hash

键值的存储和查询 
功能一:
 功能: 
 底层文件:
   底层的存储格式非常简单:一个文本文件,每行包含一条逗号分隔的键值对	   
   特点: 文件末尾追加记录, 更新键的时候旧版本的值不会被覆盖 
           找最新值的时候,需要找到文件中键最后一次出现的位置
		   
    日志(log):也就是一个仅追加(append-only)的数据文件	- AOF (Append Only File) 只追加日志文件
	      追加频率,日志同步频率
        01.记录了不同的系统活动和应用程序运行状况	
            包括但不限于错误信息、调试信息、警告信息、重要事件等
功能二:
   高效查找数据库中特定键的值,我们需要一个数据结构:索引(index)
      选择的索引加快了读查询的速度,但是每个索引都会拖慢写入速度	
    哈希索引--内存
      offset  seek	
	日志-分段合并 segment   散列索引的日志段
 实施中遇到的问题
     存储的格式
	 删除记录-部分写入记录-并发控制
	 崩溃恢复

日志结构

LSM树
Log-Structured Merge Tree
功能三:
    排序字符串表  记录分组到块--维护有序结构-BTree-按照任何顺序插入,按照排序顺序读取 
	内存表memtable-SSTable排序字符串表
	LSM-tree 还有额外的 compaction 机制

功能四: LSM树--基于合并和压缩排序文件原理的存储-LSM存储引擎
    优化访问-Bloom过滤器--布隆过滤器

日志结构索引--将数据库分解成可变大小的段-并按照顺序编写段
	日志结构索引(如LSM树)形成鲜明对比,只附加到文件(并最终删除过时的文件),但从不修改文件。

BTree

 BTree 将数据库分为固定大小的块或者页,并且一次只能读取和写入一个页面每个页面都可以使用地址和位置来标识 
   是用新数据覆盖磁盘上的页面。覆盖不改变页面的位置;即当页面被覆盖时,对该页面的所有引用保持完整
   并发控制: 常通过使用锁存器(latches)(轻量级锁)保护树的数据结构来完成
   使数据库对崩溃具有韧性,
    B树实现通常会带有一个额外的磁盘数据结构:预写式日志(WAL, write-ahead-log)(也称为重做日志(redo log))这是一个仅追加的文件 
 就地更新 

其他索引结构

行被存储的地方被称为堆文件(heap file),并且存储的数据没有特定的顺序
聚簇和覆盖索引
R-tree是一种常用的数据结构,用于高效地组织和检索多维空间数据,特别是用于范围查询和最近邻查询
多列索引被称为 连接索引(concatenated index)
多维索引(multi-dimensional index) 是一种查询多个列的更一般的方法 
   PostGIS使用PostgreSQL的通用Gist工具将地理空间索引实现为R树
全文搜索和模糊索引

分布式数据

副本(replica)
    从库失效:追赶恢复  主库失效:故障切换
 复制的困难之处在于处理复制数据的变更(change)	
    变更复制算法:单领导者(single leader),多领导者(multi leader)和无领导者(leaderless)
 “复制延迟问题” 
    数据变更捕获(change data capture)	 

批处理和流处理

生产者发送消息的速度比消费者能够处理的速度快会发生什么?
   一般来说,有三种选择:系统可以丢掉消息,将消息放入缓冲队列,或使用背压(backpressure)	
消息代理(message broker)(也称为消息队列(message queue))

参考

https://vonng.gitbooks.io/ddia-cn/content/ch3.html
005.精读《B-Tree vs LSM-Tree》 https://blog.csdn.net/jankin6/article/details/143651228	
tinydb 源码阅读 https://developer.aliyun.com/article/929064
探索TinyDB:轻量级数据库的优雅之旅  https://blog.csdn.net/east196/article/details/141783595
 TinyDB的详细使用(python3经典编程案例) https://developer.aliyun.com/article/1611932
 《数据密集型型系统设计》   
posted @ 2024-12-27 17:21  辰令  阅读(39)  评论(0)    收藏  举报