存储基本知识
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
epoll底层由消息主动通知,从底层讲也可以理解为异步的,但是在用户层来说通过
epoll_wait
等待,因此是同步的(select/poll应该是同步阻塞,epoll是同步非阻塞的 · Issue #194 · CyC2018/CS-Notes (github.com) )如果将等待时间设置为无限,则使用select、poll和epoll也是阻塞的
Reactor模式
信号驱动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博客
- 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.