zoukankan      html  css  js  c++  java
  • AeroSpike 4.x 基本原理和读写流程

    AeroSpike 4.x 基本原理和读写流程

    AeroSpike 是一个基于Hash的NoSQL,本质上是一个KV存储系统

    最简单的理解就是内存中存放了一个红黑树,红黑树里面存放的是索引,索引里面存放的是hash之后的值以及数据存放的位置

    classDiagram class Index{ ...... // offset: 4 cf_digest keyd;//20 bytes ...... // offset: 47 uint64_t rblock_id: 37; // can address 2^37 * 16b = 2Tb drive uint64_t n_rblocks: 19; // is enough for 8Mb/16b = 512K rblocks uint64_t file_id: 7; // can spec 2^7 = 128 drives ...... }

    索引中不会存放Key的值,而是存放一个hash值(通过key+set计算cf_digest_compute2),索引另外还存放了设备号(实际是文件)以及具体的rblock_id以及value的长度(n_rblocks)

    大概的查询流程

    st=>start: Start
    find_index=>operation: 查内存索引
    hit_index=>condition: 索引命中
    find_swb=>operation: 查写入缓冲区(SWB)
    find_ssd=>operation: 查磁盘
    hit=>condition: 命中
    e=>end
    
    st->find_index->hit_index
    hit_index(yes)->find_swb->hit
    hit_index(no)->e
    hit(yes)->e
    hit(no)->find_ssd
    find_ssd->e
    

    理解 rblock,swb

    设备(实际上是个文件描述符)

    什么是rblock

    我们把一个文件区域进行划分块,每一块大小为16byte

    | rblock0 | rblock1 | rblock2 | ... | rblockn |

    因此通过rblock_id 很容易就能确定value是在哪里存储

    nblock是这条记录占用block的数量

    什么是swb

    swb 是写入缓冲区

    因为写磁盘这个操作比较耗时,为了降低系统调用次数可以引入缓冲区,每次先写这个缓冲区,写满之后再刷盘

    AeroSpike所有操作都是基于写入的,只会操作当前缓冲区,不会更改之前写入的记录,比如删除一条记录也是写入一条某个key被删除

    缓冲区大小是 8M

    无效的key处理

    后台线程扫描文件,整理块

  • 相关阅读:
    谁说固态硬盘没容量?4TB诞生、明年8TB!
    微软.NET Framework 4.5.2 RTM正式版
    Chrome 应用推荐
    MS14-021: Internet Explorer 安全更新: 2014 年 5 月 1 日
    百视通与微软共同宣布9月在华发布Xbox One
    支付宝5月4日起将停止收款主页业务 保留三种收款方式
    Chrome 应用推荐
    为什么《舌尖上的中国》让你欲罢不能?
    求连续子数组的最大乘积
    损失函数与代价函数区别
  • 原文地址:https://www.cnblogs.com/stdpain/p/12635528.html
Copyright © 2011-2022 走看看