认识存储与数据库| 青训营

认识存储与数据库

存储系统

存储系统是一种提供读写和控制接口的软件,用于有效、安全地将数据持久化。作为后端软件的基础,存储系统的性能至关重要。

存储系统的特点

  • 性能敏感:存储系统的性能直接影响整个应用的表现。
  • 受硬件影响:存储系统的架构容易受底层硬件的影响。
  • 复杂代码:存储系统的代码可能会同时具有“简单”和“复杂”的特点。

存储器层级结构

存储系统的层级结构对数据访问的速度和成本都有影响,从高到低包括: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)
posted @ 2023-08-07 00:47  LucianaiB  阅读(3)  评论(0编辑  收藏  举报  来源