认识存储与数据库| 青训营
认识存储与数据库
存储系统
存储系统是一种提供读写和控制接口的软件,用于有效、安全地将数据持久化。作为后端软件的基础,存储系统的性能至关重要。
存储系统的特点
- 性能敏感:存储系统的性能直接影响整个应用的表现。
- 受硬件影响:存储系统的架构容易受底层硬件的影响。
- 复杂代码:存储系统的代码可能会同时具有“简单”和“复杂”的特点。
存储器层级结构
存储系统的层级结构对数据访问的速度和成本都有影响,从高到低包括:CPU Cache、主存储器、本地磁盘、网络存储等。
数据从应用到存储介质的流程
数据传输涉及缓存和拷贝。缓存在整个存储体系中起到重要作用,而拷贝操作需要尽量减少。抽象统一的接入层可以适应不同的硬件设备。
RAID技术
RAID(Redundant Array of Independent Disks)技术用于提高单机存储系统的性能、可靠性和性价比。
- RAID 0:数据条带化存储,提高磁盘带宽。
- RAID 1:磁盘镜像,提供强大的容错能力。
- RAID 0+1:结合了RAID 0和RAID 1,同时具备高性能和容错性。
数据库
数据库用于存储、管理和检索数据,关系型数据库和非关系型数据库是常见的类型。
系 = 集合 =任意元素组成的若有序偶对
反应了事物间的关系
关系代数 = 对关系作运算的抽象查询语言
交、并、笛卡尔积·-.. SOL = 一种DSL = 方便人类阅读的关系代数表达形式
关系型数据库特点
关系型数据库是存储系统,但是在存储之外,又发展出其他能力
- 结构化数据友好:适合处理结构化数据。
- 支持事务(ACID特性):保证数据的一致性和可靠性。
- 支持复杂查询语言:例如SQL用于数据操作和查询。
非关系型数据库特点
非关系型数据库也是存储系统,但是一般不要求严格的结构化
- 半结构化数据友好:适合存储半结构化数据。
- 可能支持事务:具体取决于数据库类型。
- 可能支持复杂查询语言:灵活性较高。
数据库 vs 经典存储
-
结构化数据管理:数据库使用表格管理数据,而文件系统自定义数据结构。
-
事务能力:数据库的事务具有ACID特性,保证数据的一致性和可靠性。
事务具有:
A(tomicity),事务内的操作要么全做,要么不做
C(onsistency),事务执行前后,数据状态是一致的
I(solation),可以隔离多个并发事务,避免影响
D(urability),事务一旦提交成功,数据保证持久性
-
复杂查询能力:数据库支持复杂查询,使数据检索更便捷。
主流存储产品剖析
单机存储
本地文件系统
本地文件系统在Linux中是一种经典的哲学,一切皆文件。文件系统管理单元为文件,接口多样,如Ext2/3/4和sysfs。
Linux经典哲学:一切皆文件
文件系统的管理单元:文件
文件系统接口:文件系统繁多,如Ext2/3/4,sysfs,但都遵循VFS的统一抽象接口rootfe
Linux文件系统的两大数据结构 :Index Node & Drectorv
# 创建新文件
touch myfile.txt
# 查看文件内容
cat myfile.txt
key-value存储
键值存储以键值对的形式存储数据,常见操作包括put(写入)和get(读取)。
世间一切皆key-value:key是你身份证,value是你的内涵 :
常见使用方式 : put(k, v) & get(k)
常见数据结构: LSM-Tree,某种程度上牺牲读性能,追求写入性能
拳头产品: RocksDB
# 使用RocksDB进行键值存储
import rocksdb
db = rocksdb.DB("mydb", rocksdb.Options(create_if_missing=True))
db.put(b'key1', b'value1')
value = db.get(b'key1')
print(value)
分布式存储
分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
HDFS HDFS : 堪称大数据时代的基石
时代背景 : 专用的高级硬件很贵,同时数据存量很大,要求超高吞吐
HDFS(Hadoop Distributed File System)是大数据时代的基石,支持海量数据存储、高容错性和弱POSIX语义。
# 在HDFS中创建文件夹
hdfs dfs -mkdir /user/hadoop/data
# 将本地文件上传到HDFS
hdfs dfs -put localfile /user/hadoop/data/
Ceph
Ceph是多功能的分布式存储系统,支持对象、块和文件接口。
Ceph : 开源分布式存储系统里的 万金油
# 创建Ceph对象存储池
rados mkpool mypool
# 将本地文件上传到Ceph对象存储
rados put mypool myobject /path/to/localfile
单机数据库
单机数据库 = 单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
单机关系型数据库
商业产品Oracle称王,开源产品MySQL & PostgreSQL称霸
单机非关系型数据库
MongoDB、Redis、Elasticsearch三足鼎立
关系型数据库一般直接使用SQL交互而非关系型数据库交互方式各不相同 非关系型数据库的数据结构千奇百怪没有关系约束后,schema相对灵活 不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”
分布式数据库
解决容量问题
单点容量有限,受硬件限制 存储节点池化,动态扩缩容
解决弹性问题
CPU资源紧张,不够用了 缩容成功,访问新数据库 扩容成功,访问新数据库
解决性价比问题
新技术演进
软件架构变更
Bypass操作系统内核已经成为一种趋势,例如使用SPDK。
// 使用SPDK进行I/O操作
#include <stdio.h>
#include <spdk/ioat.h>
int main() {
// 初始化SPDK
spdk_ioat_probe();
// 执行I/O操作
// ...
// 关闭SPDK
spdk_ioat_cleanup();
return 0;
}
AI增强
人工智能在存储领域发挥越来越大的作用,如数据分析和存储格式转换。
# 使用机器学习库进行数据分析
import pandas as pd
data = pd.read_csv('data.csv')
result = data.groupby('category').mean()
print(result)
高性能硬件
新硬件技术如RDMA网络、持久内存和可编程交换机正在推动存储性能的提升。
# 使用RDMA进行网络传输
rdma_send data.txt remote_server
// 使用持久内存进行数据存储
#include <pmem.h>
PMEMobjpool *pop = pmemobj_create("my_pool", "my_layout", PMEMOBJ_MIN_POOL, 0666);
PMEMoid root = pmemobj_root(pop, sizeof(struct my_root));
struct my_root *root_ptr = pmemobj_direct(root);
// 在持久内存中存储数据
root_ptr->data = 42;
pmemobj_persist(pop, &root_ptr->data, sizeof(root_ptr->data));
# 使用可编程交换机进行数据处理
from scapy.all import *
def process_packet(packet):
if IP in packet:
print("Source IP:", packet[IP].src)
print("Destination IP:", packet[IP].dst)
sniff(filter="ip", prn=process_packet)