这是我参与「第三届青训营 -后端场」笔记创作活动的的第13篇笔记
GO-学习笔记
数据库系统
存储系统
- 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件
- 代码即简单又复杂
- 对外接口分支少,清晰
- 异常处理,要全覆盖
- 软件架构,容易受硬件影响
- 系统和存储介质之间要有抽象统一的接入层
- RAID技术,将单机存储系统做到高性能/高性价比/高可靠性
- Redundant Array Of Inexpensive Disks
- RAID0,多块磁盘简单组合;条带化存储,提高带宽;没有额外容错设计
- RAID1,一块磁盘对应一块额外镜像盘;空间利用率50%;容错能力强
- RAID0+1,一组RAID0加上一组RAID1;空间利用率50%;容错能力强;写入带宽好
数据库
- 关系,任意元素组成的若干有序偶对
- 关系代数,关系运算的抽象查询语言
- SQL,一种DSL,domain-specific language,领域特定语言,方便阅读的关系代数表达式
- 关系型数据库
- 是一种存储系统
- 结构化数据友好
- 支持事务
- 支持复杂查询语言
- 非关系型数据库
- 不要求严格的结构化
- 可能支持事务
- 事务能力
- Atomicity 原子性操作
- Consistency,执行前后,数据状态一致
- Isolation,可以隔离多个并发事务
- Durability,持久化
主流产品
- 单机存储系统,单个计算机节点上的存储软件系统,不涉及网络交互
- 本地文件系统,Linux一切皆文件
- key-value存储,LSM-Tree,牺牲读性能,追求写入性能;RocksDB;追求顺序写入
- 分布式存储系统,涉及网络交互
- 分布式文件系统,HDFS,海量数据存储;高容错性;弱POSIX语义;性价比高;Management Node对Storage Node进行管理和路由
- 分布式存储,Ceph,一切皆对象,支持对象/块/文件接口;主备复制模型;数据分布式模型采用CRUSH算法,一份数据分为多副本进行冗余存储,HASH+权重+随机抽签
- 单机数据库,单个计算机节点上的数据库系统,事务在单机内执行
- 关系型数据库,Oracle/MySQL/PostagreSQL,内存树状结构,每一个节点都是一个page,保存在磁盘的page file中
- 非关系性数据库,Mongodb/Redis/Elasticsearch
- 分布式数据库
- 解决容量/弹性/性价比的问题,存储节点池化,动态扩缩容资源
- 解决多写/内存弹性/分布式事务
演进
- 架构/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
- Consistency,一致性,业务的合法性
- Isolation,两个操作同时对一个对象操作,应该保持隔离,避免互相影响
- 数据库应该有高并发/高可靠/高可用
- DBMS,按照某种数据模型来组织、存储和管理数据的仓库
- 网状数据库,每个数据都是一个节点,N对N的树形结构,一个父节点可以有多个子节点,一个子节点,可以有多个父节点
- 层次数据库,树形结构,一个父节点有多个子节点,一个子节点只能有一个父节点
- 关系数据库,实体和实体的关系通过二维表结构表示
关键技术
- sql的执行过程
- 解析器,解析sql,生成语法树,Abstract Syntax Tree
- 优化器,生成plan tree
- 执行器,进行执行
- Parser,解析器,解析出语句的执行目标
- 词法分析,解析关键字,进行语句分类
- 语法分析,生成语法树
- 语义分析,检查语句合法性
- Optimizer,优化器,选择最优的执行路径
- RBO,Rule Base Optimizer,基于规则的优化
- CBO,Cost Base Optimizer,基于代价的优化,选择整体并发处理花费最少的时间
- Executor,执行器
- 火山模型,层层算子向下执行,数据向上层层返回,每个算子都是独立的,相互没有耦合;每次计算,都有函数调用,CPU效率不高
- 向量化,每次返回数据,都是一批数据;CPU Cache命中率更高;利用CPU的SIMD机制(Single Instruction Multi Data,单指令多数据流,一条指令控制多个处理器同时处理)
- 编译执行,动态编译,将操作过程编译成一个动态执行函数,减少函数调用
- InnoDB,存储引擎
- In-Memory/On-Disk,内存部分(缓存池)和磁盘部分(元信息/日志文件)
- Buffer Pool,每个页面16K存储数据,每个chunk128M,整个Buffer Pool分为instance;HashMap映射位置;LRU机制管理内存空间
- Page,16k,存储的最小单位。变长字段列表/NULL值标志位/id信息/
- B+ Tree(层高低,减少IO次数),构建索引;页目录中使用二分查找对应的槽,遍历该槽对应分组中的记录找到对应的记录
- 事务引擎
- Atomicity,原子性,通过Undo Log,记录数据的变化的逆逻辑,方便进行回滚
- Isolation,隔离性,通过锁,读读共享,写写互斥;MMVC(Multi-Version Concurrency Control,多版本并发控制),读写互不阻塞,降低死锁概率,实现一致性,通过roll ptr,对数据的版本形成链表
- Durability,持久化,通过Redo Log,WAL(Write-ahead logging,预写式日志),记录页面变化,通过日志更新到磁盘
实践
- 大流量
- Sharding,数据库分表分库,业务层水平拆分
- 代理层实现数据路由
- 突增流量
- 扩容DB物理节点数量,利用影子表进行压测,通过路由层对请求进行分片,保证集群可以承担预期流量
- 代理连接池,业务侧/代理侧预热连接池,连接预先缓存
- 稳定性和可靠性
- 3AZ高可用,有多个独立的机房,通过日志进行数据同步,进行流量调度和监控报警
- HA管理,高可用管理,及时切换宕机节点,自动屏蔽故障宕机节点
Tos对象存储实战
- Top/头条 objects storage
- 对象存储,数量无限制;云原生,按需申请使用;成本低;具有冷热数据分级存储能力
- 结构
- Bucket为一个数据库,里面包含数个对象
- 支持HTTP接口,支持restful API
- 适用场景
- 适用于存储多种静态资源
- 不适用于结构化数据/关系型数据/KV缓存数据/随机写/Append写/更新频繁
使用
- 申请Bucket
- 业务逻辑开发,Restful风格
- PUT,上传对象
- GET,对象内容
- HEAD,对象元信息
- DELETE,删除对象
- 大对象的上传,分部分上传
- InitUpload
- UploadPart,分块上传
- CompleteUpload,整合
- 分页查看
- ListPrefix
- 测试
字节实践
- 架构
- 接入层,接入解析并处理接口请求,租户隔离/数据校验
- 元信息层,存储对象元信息
- 存储引擎层,存储对象内容
- 业务场景
- 容量型,片源存储/转码,海量/高吞吐/高持久度,需要可扩展性/成本低/持久度高
- QPS型,源视频审核中每秒需要抽帧,操作频繁,QPS需可线性扩展
- 可扩展性
- Partition,分治处理,分布式存储
- 存储/计算/压力都要均匀分布
- 通过partition Logic,实现负载均衡
- 持久度
- 不可靠的硬件/软件/自然灾害/太阳黑子,单节点存储不可靠
- Replication,数据复制多份,强吞吐能力,多个副本提供服务
- 拷贝方式,同步复制/异步复制/半同步复制(写入的节点个数满足指定条件,表示写入成功)
- 一致性问题,因果(线程A修改过,线程B访问的为最新值)/读写/会话/单调读/单调写(写操作顺序执行)
- 成本
- EC,Erasure Coding,冗余编码,通过校验块可以推断出故障数据块的数据
- 低冗余度,需要额外计算
- EC编码,纠删码,Reed Solomon算法,m个数据库+n个校验块,有多少个校验块就最多可容忍多少个块丢失
- 多机房EC,分布式EC。一个线程定期扫描数据,比如对数据块和校验块做crc校验,如果发现有数据块或者校验块失效,则启动恢复线程;恢复线程先根据EC组现有的数据情况,从远程或本地获取必要的数据进行解码,恢复失效数据
- 冷热转换,冷的数据放到便宜的、差的设备
- 高可用
- 拆分降低爆炸半径,一个集群拆分成多个集群
- 镜像灾备,主备Bucket,增量双向同步,进行容灾
- 未来展望
- 容量治理
- 成本优化
- 大数据生态
- 稳定性提升
- 整体架构