数据库系统、RDBMS和Tos对象存储实战 | 青训营笔记

424 阅读8分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第13篇笔记

GO-学习笔记

数据库系统

存储系统

  • 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件
  • 代码即简单又复杂
  1. 对外接口分支少,清晰
  2. 异常处理,要全覆盖
  • 软件架构,容易受硬件影响
  1. 系统和存储介质之间要有抽象统一的接入层
  • RAID技术,将单机存储系统做到高性能/高性价比/高可靠性
  1. Redundant Array Of Inexpensive Disks
  2. RAID0,多块磁盘简单组合;条带化存储,提高带宽;没有额外容错设计
  3. RAID1,一块磁盘对应一块额外镜像盘;空间利用率50%;容错能力强
  4. RAID0+1,一组RAID0加上一组RAID1;空间利用率50%;容错能力强;写入带宽好

数据库

  • 关系,任意元素组成的若干有序偶对
  • 关系代数,关系运算的抽象查询语言
  • SQL,一种DSL,domain-specific language,领域特定语言,方便阅读的关系代数表达式
  • 关系型数据库
  1. 是一种存储系统
  2. 结构化数据友好
  3. 支持事务
  4. 支持复杂查询语言
  • 非关系型数据库
  1. 不要求严格的结构化
  2. 可能支持事务
  • 事务能力
  1. Atomicity 原子性操作
  2. Consistency,执行前后,数据状态一致
  3. Isolation,可以隔离多个并发事务
  4. Durability,持久化

主流产品

  • 单机存储系统,单个计算机节点上的存储软件系统,不涉及网络交互
  1. 本地文件系统,Linux一切皆文件
  2. key-value存储,LSM-Tree,牺牲读性能,追求写入性能;RocksDB;追求顺序写入
  • 分布式存储系统,涉及网络交互
  1. 分布式文件系统,HDFS,海量数据存储;高容错性;弱POSIX语义;性价比高;Management Node对Storage Node进行管理和路由
  2. 分布式存储,Ceph,一切皆对象,支持对象/块/文件接口;主备复制模型;数据分布式模型采用CRUSH算法,一份数据分为多副本进行冗余存储,HASH+权重+随机抽签
  • 单机数据库,单个计算机节点上的数据库系统,事务在单机内执行
  1. 关系型数据库,Oracle/MySQL/PostagreSQL,内存树状结构,每一个节点都是一个page,保存在磁盘的page file中
  2. 非关系性数据库,Mongodb/Redis/Elasticsearch
  • 分布式数据库
  1. 解决容量/弹性/性价比的问题,存储节点池化,动态扩缩容资源
  2. 解决多写/内存弹性/分布式事务

演进

  • 架构/AI增强/新硬件
  • SPDK(Storage Performance Development Kit),Bypass OS Kernal,绕开内核,避免调用内核态,中断调整为轮询,避免上下文切换,无锁数据结构,Lock-free queue
  • AI/Machine Learning结合数据存储,改变数据存储格式,通过AI决定行存/列存/行列混存
  • 高性能硬件,RDMA网络(新网络协议栈,将用户态内存映射给网卡,减少CPU拷贝开销);Persistent Memory;可编程交换机(P4 Switch配备可计算单元);CPU/GPU/DPU

RDBMS

  • 关系型数据库
  • Transaction,事务,一组SQL语句组成的一个程序执行单元,体现ACID
  1. Consistency,一致性,业务的合法性
  2. Isolation,两个操作同时对一个对象操作,应该保持隔离,避免互相影响
  • 数据库应该有高并发/高可靠/高可用
  • DBMS,按照某种数据模型来组织、存储和管理数据的仓库
  1. 网状数据库,每个数据都是一个节点,N对N的树形结构,一个父节点可以有多个子节点,一个子节点,可以有多个父节点
  2. 层次数据库,树形结构,一个父节点有多个子节点,一个子节点只能有一个父节点
  3. 关系数据库,实体和实体的关系通过二维表结构表示

关键技术

  • sql的执行过程
  1. 解析器,解析sql,生成语法树,Abstract Syntax Tree
  2. 优化器,生成plan tree
  3. 执行器,进行执行
  • Parser,解析器,解析出语句的执行目标
  1. 词法分析,解析关键字,进行语句分类
  2. 语法分析,生成语法树
  3. 语义分析,检查语句合法性
  • Optimizer,优化器,选择最优的执行路径
  1. RBO,Rule Base Optimizer,基于规则的优化
  2. CBO,Cost Base Optimizer,基于代价的优化,选择整体并发处理花费最少的时间
  • Executor,执行器
  1. 火山模型,层层算子向下执行,数据向上层层返回,每个算子都是独立的,相互没有耦合;每次计算,都有函数调用,CPU效率不高
  2. 向量化,每次返回数据,都是一批数据;CPU Cache命中率更高;利用CPU的SIMD机制(Single Instruction Multi Data,单指令多数据流,一条指令控制多个处理器同时处理)
  3. 编译执行,动态编译,将操作过程编译成一个动态执行函数,减少函数调用
  • InnoDB,存储引擎
  1. In-Memory/On-Disk,内存部分(缓存池)和磁盘部分(元信息/日志文件)
  2. Buffer Pool,每个页面16K存储数据,每个chunk128M,整个Buffer Pool分为instance;HashMap映射位置;LRU机制管理内存空间
  3. Page,16k,存储的最小单位。变长字段列表/NULL值标志位/id信息/
  4. B+ Tree(层高低,减少IO次数),构建索引;页目录中使用二分查找对应的槽,遍历该槽对应分组中的记录找到对应的记录
  • 事务引擎
  1. Atomicity,原子性,通过Undo Log,记录数据的变化的逆逻辑,方便进行回滚
  2. Isolation,隔离性,通过锁,读读共享,写写互斥;MMVC(Multi-Version Concurrency Control,多版本并发控制),读写互不阻塞,降低死锁概率,实现一致性,通过roll ptr,对数据的版本形成链表
  3. Durability,持久化,通过Redo Log,WAL(Write-ahead logging,预写式日志),记录页面变化,通过日志更新到磁盘

实践

  • 大流量
  1. Sharding,数据库分表分库,业务层水平拆分
  2. 代理层实现数据路由
  • 突增流量
  1. 扩容DB物理节点数量,利用影子表进行压测,通过路由层对请求进行分片,保证集群可以承担预期流量
  2. 代理连接池,业务侧/代理侧预热连接池,连接预先缓存
  • 稳定性和可靠性
  1. 3AZ高可用,有多个独立的机房,通过日志进行数据同步,进行流量调度和监控报警
  2. HA管理,高可用管理,及时切换宕机节点,自动屏蔽故障宕机节点

Tos对象存储实战

  • Top/头条 objects storage
  • 对象存储,数量无限制;云原生,按需申请使用;成本低;具有冷热数据分级存储能力
  • 结构
  1. Bucket为一个数据库,里面包含数个对象 image.png
  • 支持HTTP接口,支持restful API
  • 适用场景
  1. 适用于存储多种静态资源
  2. 不适用于结构化数据/关系型数据/KV缓存数据/随机写/Append写/更新频繁

使用

  • 申请Bucket
  • 业务逻辑开发,Restful风格
  1. PUT,上传对象
  2. GET,对象内容
  3. HEAD,对象元信息
  4. DELETE,删除对象
  • 大对象的上传,分部分上传
  1. InitUpload
  2. UploadPart,分块上传
  3. CompleteUpload,整合
  • 分页查看
  1. ListPrefix
  • 测试

字节实践

  • 架构
  1. 接入层,接入解析并处理接口请求,租户隔离/数据校验
  2. 元信息层,存储对象元信息
  3. 存储引擎层,存储对象内容
  • 业务场景
  1. 容量型,片源存储/转码,海量/高吞吐/高持久度,需要可扩展性/成本低/持久度高
  2. QPS型,源视频审核中每秒需要抽帧,操作频繁,QPS需可线性扩展
  • 可扩展性
  1. Partition,分治处理,分布式存储
  2. 存储/计算/压力都要均匀分布
  3. 通过partition Logic,实现负载均衡
  • 持久度
  1. 不可靠的硬件/软件/自然灾害/太阳黑子,单节点存储不可靠
  2. Replication,数据复制多份,强吞吐能力,多个副本提供服务
  3. 拷贝方式,同步复制/异步复制/半同步复制(写入的节点个数满足指定条件,表示写入成功)
  4. 一致性问题,因果(线程A修改过,线程B访问的为最新值)/读写/会话/单调读/单调写(写操作顺序执行)
  • 成本
  1. EC,Erasure Coding,冗余编码,通过校验块可以推断出故障数据块的数据
  2. 低冗余度,需要额外计算
  3. EC编码,纠删码,Reed Solomon算法,m个数据库+n个校验块,有多少个校验块就最多可容忍多少个块丢失
  4. 多机房EC,分布式EC。一个线程定期扫描数据,比如对数据块和校验块做crc校验,如果发现有数据块或者校验块失效,则启动恢复线程;恢复线程先根据EC组现有的数据情况,从远程或本地获取必要的数据进行解码,恢复失效数据
  5. 冷热转换,冷的数据放到便宜的、差的设备
  • 高可用
  1. 拆分降低爆炸半径,一个集群拆分成多个集群
  2. 镜像灾备,主备Bucket,增量双向同步,进行容灾
  • 未来展望
  1. 容量治理
  2. 成本优化
  3. 大数据生态
  4. 稳定性提升
  • 整体架构 image.png