README.md

    项目整体背景

    比如说现在要执行一个命令,hadoop fs -mkdir /usr/warehouse 来创建一个目录节点,这里其实是做了两件事-- 1. 在内存里的目录树中加入对应的目录节点 2. 在磁盘里写入一条edits log,记录本次元数据的修改

    而针对于hdfs client 去创建目录的话,会给hdfs NameNode发送一条rpc接口调用的请求, 来调用mkdir接口,在那个接口里面就会完成上述的两件事情

    分布式存储系统的创建目录功能实现

    注意一点的就是内存里面的文件目录树肯定是多线程并发写的资源,所以必须要用synchronized 来保护起来

    1. 创建目录树时首先是把路径截为数组

    2. 遍历数组,判断是否是第一个节点""" 如果是的话直接continue

    3. 接着会走递归方法 3.1 递归中首先会判断dirTree 内存目录树中是否有字节点,如果没有直接退出 3.2 然后如果有字节点的话那么就取出子节点,并获取字节点的path跟当前的splitpath比较,如果相等直接返回字节点目录 3.3 如果不相等的话,那么就递归调用--参数传入子节点和splitpath, 并判断返回结果是否为空,如果不为空也直接返回结果

    4. 判断递归调用的结果是否为空,如果不为空,就将结果赋给父节点目录,并continue

    5. 如果递归调用共结果为空,那么就直接基于splitpath new出来一个目录对象加入到父目录对象中

    edits_log的全局txid机制以及双缓冲机制实现

    1. 首先创建一个成员变量--txidSeq:即为当前递增的txid的序号,并在记录日志方法中对txidSeq进行++操作
    2. 创建一个内存双缓存 2.1 里面放入一个用于记录日志的currentBuffer,还放入一个同步日志的synchBuffer 2.2 用于记录日志的write方法 2.3 用于currentBuffer和synchBuffer交换数据的方法 2.4 用于synchBuffer刷入数据到磁盘的同步方法
    3. 在logEdit()方法中将日志信息写入到buffer缓存区 4 注意在写入缓存区需要加锁---因为有可能多个线程对txidSeq进行操作

    基于editlog实现分段加锁机制

    基于wait与notify实现edits_log批量刷磁盘

    通过分段加锁,把耗时的写磁盘或者写网络放在锁代码块之外。 需要注意的点:需要体会在哪个地方wait,又在哪个地方通过notify进行唤醒

    基于editlog实现分段加锁和基于wait与notify实现edits_log批量刷磁盘整体逻辑

    1. 首先还是会再次加锁 synchronized(this)
    2. 然后判断是否正在刷磁盘的标志位--isSyncRunning 是否为true 如果为true,表示有线程正在刷磁盘 2.1 那么就取出当前线程的txid,并获取editLogBuffer中最大的txid,两者进行比较 2.2 如果txid小于editLogBuffer中最大的txid说明当前线程的edit log已经被线程刷入或将要刷入磁盘,然后直接return 做别的事 2.3 反之如果小于,那就再继续看是否有线程在等待刷磁盘的标志位isWaitSync是否为true,如果有也直接return 2.4 反之如果isWaitSync 为false,那么当前这个线程需要把标志位设为true 2.5 然后执行while(isSyncRunning)---wait(2000) 操作,注意这一步如果执行到wait,意味着会释放锁,然后2s后继续执行while 2.6 更改isWaitSync是否为false
    3. 如果为false表示没有正在刷磁盘的, 3.1 那么需要交换currentBuffer与synchBuffer; 3.2 保存当前要同步到磁盘中去的最大的txid; 3.3 更改标志位isSyncRunning为true
    4. 执行到这里线程就出了再次加锁的代码块,这个时候其他的线程就可以重新进入logEdit中的代码块,将edit log信息写入到内存缓冲
    5. 然后这个线程会执行刷磁盘操作
    6. 执行完刷磁盘操作后就会再次更改标志位isSyncRunning 设为false,

    项目简介

    本项目是基于hadoop的文件存储架构原理,基于volatile,synchronized,wait等并发相关知识手撸出分布式文件存储系统

    发行版本

    当前项目没有发行版本

    贡献者 1

    ayu_programer @m0_37900506

    开发语言

    • Java 100.0 %