存储基本知识

Ethereal Lv4

1. iops (input/output per second) + vfs

  • 通常,计算IOPS的基本公式是:(总的读+写的操作量)/ 时间(秒)
  • 目前PCIe4.0固态硬盘,一些高性能产品的顺序读取速度可达7000MB/s,4K随机读/写可达1000K/1000K IOPS以上。
  • 4k读写性能其实就是针对小文件的读写性能

2. 分布式事务

  • BASE理论(Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性))

    • BASE 理论是对 CAP 中 AP 的一个扩展,通过牺牲强一致性来获得可用性

    • 基本可用:分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。

    • 软状态:由于不要求强一致性,所以BASE允许系统中存在中间状态(也叫软状态),这个状态不影响系统可用性。

    • 最终一致:最终一致是指经过一段时间后,所有节点数据都将会达到一致。

  • 2PC:推荐采用 Seata 实现 2PC

  • TCC (Try、Confirm、Cancel)

    • TCC需要注意三种异常处理分别是空回滚幂等悬挂

    • 2PC 通常都是在跨库的 DB 层面,而 TCC 则在应用层面的处理,需要通过业务逻辑来实现。

  • 可靠消息最终一致性

  • 最大努力通知

3. IO

上图中,page cache其实属于文件系统,buffered IO区别于mmap的点是多一次由内核向用户态程序的复制,同理类似sprintf也存在,fflush只是将内容写入page cache而已

自从Linux-2.4版本之后,buffer cache管理指向page cache list的指针

mmap可以使用匿名页进行内存共享,因为page cache由操作系统管理,同理文件空洞也在文件系统层,ext只需要把中间的inode指针置为空即可。

JAVA只包含Mapped和buffered,注意下面direct其实只是mapped而已。JAVA无法绕过page cache,除非使用JNA

BIO(同步阻塞),NIO(同步非阻塞),AIO(异步非阻塞)

  • BIO使用while循环,内部等待会阻塞,无法执行其他代码。

  • NIO需要主动检查是否存在新的消息,因此常用while循环,如果没有消息则执行其他代码,因此为非阻塞,而处理消息必须排队处理因此为同步。演化路程为select->poll->epoll

  • 信号驱动IO:提醒为异步,但是收到信号后需要主动获取数据

  • 开多线程或协程即为异步

  • AIO不需要主动检查,因此常用回调方式,传入回调函数解决。此外,也可以使用协程方式。

    • linux提供libaio(利用程序和IO设备异步性,只支持direct IO)、POSIX AIO(利用线程)和io_uring实现

    • io_uring使用了类似spdk的思路,使用SQs (submission)和CQs (completion)队列。

    • Proactor模式

4. RDMA

RDMA协议栈与ISO协议栈不同,因此需要全部由硬件实现

5. lock-free

  • 实现一:队列方式,FIFO具有的天然特性使得无锁实现很简单

  • 实现二:使用CAS(compare-and-swap)TAS(test-and-set)TTAS(test and test-and-set)FAA(fetch-and-add)等原语(cmpxchg是一个比较交换指令,原意是Compare and Exchange)

  • setnx实现分布式锁

6. Shared Disk && Shared Nothing && Shared Everything

从Shared Everything到Shared Nothing:数据仓库技术架构的演进-百度开发者中心 (baidu.com)

7. View Synchrony

Virtual Synchrony (rutgers.edu)

On programming with view synchrony | IEEE Conference Publication | IEEE Xplore

8. fs操作

create/delete/mkdir

内核OverlayFS—创建与删除文件 | Arking (arkingc.github.io)

Linux C/C++源码实现常见命令mkdir_c++ mkdir-CSDN博客

nlink->硬链接数目

附录

分布式事务有这一篇就够了! - 知乎 (zhihu.com)

【linux】随机读写之DirectIO|MMAP和DIRECT IO区别_linux directio-CSDN博客

从 Buffer 和 Cache 到 Linux 的 PageCache 和 BufferCahe - 知乎 (zhihu.com)

一文彻底解释清楚Java 中的NIO、BIO和AIO | 二哥的Java进阶之路 (javabetter.cn)

IO多路复用——深入浅出理解select、poll、epoll的实现 - 知乎 (zhihu.com)

Linux 系统中的 POSIX 接口详细介绍_linux posix-CSDN博客

linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)-CSDN博客

解析Linux权限管理:ACL 权限 - 知乎 (zhihu.com)

Linux的ACL权限实现原理及实现详解 (baidu.com)

Linux UGO和ACL权限管理 - Gordon0918 - 博客园 (cnblogs.com)

区分一下cluster、MPP、SMP和SSMP_massive parallel processing-CSDN博客

五分钟理解服务器 SMP、NUMA、MPP 三大体系结构-CSDN博客

why parallel architecture

OLAP vs. OLTP: What’s the Difference? - IBM Blog

OLTP 与 OLAP — 数据处理系统之间的区别 — AWS (amazon.com)

  • Title: 存储基本知识
  • Author: Ethereal
  • Created at: 2024-03-07 16:00:46
  • Updated at: 2025-01-09 15:29:32
  • Link: https://ethereal-o.github.io/2024/03/07/存储基本知识/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments