架构师训练营 -week08- 总结
本周重点学习了以下几个方面的内容:
操作系统里文件的存储方式,以及硬盘读取文件的原理介绍
常见的数据结构:链表、数组、队列、HashMap、树、跳表,以及相关算法的介绍
网络7层/4层模型和通信协议介绍,和优化方案
NIO的介绍
机械硬盘HDD 和 固态硬盘SSD
机械硬盘:
磁头移动比较慢,至少毫秒级
如果数据是非连续的话,随机的读写效率很低
固态硬盘:
没有机械装置,速度快
也尽量要用连续的存储方式
B+树 和 LSM树
目前常见的主要的三种存储引擎是:哈希、B+树、LSM树:
哈希存储引擎:是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表性能最好。
B+树存储引擎是B+树的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。
LSM树(Log-Structured MergeTree)存储引擎和B+树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。LSM树存储引擎的代表数据库就是HBase,其核心思想的核心就是放弃部分读能力,换取写入的最大化能力。LSM就是结构化合并树的意思,它的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到足够多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。然而LSM-tree在某些情况下,特别是在查询需要快速响应时性能不佳。通常LSM-tree适用于索引插入比检索更频繁的应用系统。
RAID 独立硬盘冗余阵列
RAID 0 - 读写速度快, 数据安全性差
RAID 1 - 有完整的备份,提升了数据的安全性,但性能较差
RAID 10 - 高可用,高性能,浪费磁盘
RAID 5 - 通过一块磁盘记录校验信息,通过校验信息反算,磁盘利用率高。通过亦或操作,计算校验信息
RAID 6 - 两个校验信息
分布式文件系统 HDFS
NameNode - 相当于文件控制块,记录元数据。
DataNode - 存储数据,64M一个数据块。
安全性 - 缺省复制三份数据块,跨机架复制。
数据结构与算法
推荐极客时间上的专栏《数据结构与算法之美》和算法训练营,都是质量非常高的学习资料。
网络通信基本原理与性能优化
七层模型和四层模型概念:
非阻塞网络I/O
BIO、NIO、AIO的概念和区别
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
NIO (New I/O):NIO是一种同步非阻塞的I/O模型,I/O 操作立即返回,不会阻塞等待。
系统I/O 复用方式:select,poll,epoll
Select(poll) 管理下的read 过程 - 遍历Socket,高并发性能比较差
epoll 管理下的read 过程 - epoll需要操作系统本身支持,构建event列表,在列表上指定了在哪些Socket上有事件到达。在Socket很多的时候,性能获得很大的提升。
AIO (Asynchronous I/O):AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。(除了 AIO 其他的 IO 类型都是同步的,这一点可以从底层IO线程模型解释,推荐一篇文章:《漫话:如何给女朋友解释什么是Linux的五种IO模型?》 )
评论