后端与数据息息相关,数据库因此是逃不开的一环。本文以用户注册一个网站的账号为例,从数据库的一些简要介绍开始,到Go中对database操作相关封装的库的操作,体现数据流动过程。
存储系统
存储系统,希望可以做到既有不易失,又物美价廉,存储空间大。而数据库相比于存储系统,体现出支持事务的优越性(ACID)。
- 作为后端软件的底座,性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,既简单又复杂
数据流动
用户注册信息 --> 后端服务器 --> 数据库 --> 其他系统
数据的持久化
- 校验数据的合法性:该用户是否已经存在?
- 修改内存:用高效的数据结构组织数据
- 写入存储介质:以寿命&性能友好的方式写入硬件
其中缓存贯穿整个存储体系,而拷贝这一操作很昂贵,应当尽量减少。
数据库基本信息
基本类别
关系型数据库描述实体间的关系
- 结构化数据友好
- 支持事务(ACID)
- 支持复杂查询语言 SQL 而非关系型数据库
- 对非结构化数据友好
- 可能支持事务(ACID)
- 可能支持复杂查询语言,比如SQL
事务特点
其中ACID为
- Atomicity:事务内的操作要么全做,要么不做。原子性。
- Consistency:事务执行前后,数据状态是一致的。比如转账,A->B 500元,则A账户内应少500元,并且B账户内多500元。
- Isolation:可隔离多个并发事务,避免影响
- Durability:事务一旦提交成功,数据保证持久性
主流存储产品相关分析
-
单机存储 单个计算机节点上的存储软件系统,一般不涉及网络交互。
本地文件系统:
- 一切皆文件
- 系统繁多,但都遵循统一抽象接口
- Index & Directory
Key-value存储: 通过Key,索引value,value是内容,Key是门牌号
- 常见使用方式:put(k,v) & get(k,v)
- 常见数据结构:LSM-tree,某种程度上牺牲读性能,追求写入性能
-
分布式存储 单机存储基础上实现了分布式协议,设计大量网络交互。
分布式文件系统:
比如HDFS, 20s初,当时专用高级硬件很贵,同时数据存量很大,要求超高吞吐 ,核心特点有:
- 支持海量数据存储
- 高容错性
- 弱POSIX语义,一些单机文件系统上的操作并不支持
- 使用普通x86服务器,性价比高
分布式对象存储:
比如Ceph,一切皆对象,核心特点有:
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法
- 一套系统支持对象接口、块接口、文件接口,但一切皆对象
-
单机关系型数据库 事务在单机内执行,也可能通过网络交互实现分布式事务。 Oracle, MySQL, PostgreSQL
-
单机非关系型数据库 mongoDB, Redis
-
分布式数据库 解决容量问题。存储节点池化,动态扩容。 解决性价比问题。
database/sql
封装好的包,希望用统一接口处理不同数据库相关服务。而且数据的存储受到硬件影响很大,硬件设备又五花八门,需要有抽象统一的接口。
可以用driver+DSN进行初始化DB连接。