cocalele / PureFlash

A ServerSAN storage system designed for flash device
GNU General Public License v3.0
101 stars 29 forks source link

disk layout #28

Open cocalele opened 12 months ago

cocalele commented 12 months ago

磁盘的元数据区 大小可以通过meta_size 在配置文件中配置。缺省40GB

#define META_RESERVE_SIZE (40LL<<30) //40GB, can be config in conf
#define MIN_META_RESERVE_SIZE (4LL<<30) //4GB, can be config in conf

#define S5_VERSION 0x00020000

支持PFS2需要进行下面的修改:

  1. 版本号NBS5需要修改以示不同, 改为0x00030000
  2. 需要在 Redolog后面预留一个4K page, 作为ATS锁区域。 (检查元数据区最小长度是否够, 配置文件中的元数据长度设置作用?) 在原来的元数据区,2.5GB 以后的位置是空的,这里开辟一片锁区域,大小为32M. 每4K为一个锁。其中第一个作为global meta lock, 其他的保留作为volume lock
    SSD head layout in LBA(4096 byte):
    0: length 1 LBA, head page
    LBA 1: length 1 LBA, free obj queue meta
    LBA 2: ~ 8193: length 8192 LBA: free obj queue data,
     4 byte per object item, 8192 page can contains
         8192 page x 4096 byte per page / 4 byte per item = 8 Million items
     while one object is 4M or 16M, 4 Million items means we can support disk size 32T or 128T
    offset 64MB: length 1 LBA, trim obj queue meta
    offset 64MB + 1LBA: ~ 64MB + 8192 LBA, length 8192 LBA: trim obj queue data, same size as free obj queue data
    offset 128MB: length 512MB,  lmt map, at worst case, each lmt_key and lmt_enty mapped one to one. 8 Million items need
          8M x ( 32 Byte key + 32 Byte entry) = 512M byte = 64K
    offset 1GByte - 4096, md5 of SSD meta
    offset 1G: length 1GB, duplicate of first 1G area
    offset 2G: length 512MB, redo log
    offset 2G+512M, length 32MB,  ATS lock area
     - 1st LBA(4K)  global meta lock
     - others, reserve as volume lock
    

当存储节点启动时要检查磁盘是否为新盘,对新盘需要进行创建元数据操作。由于共享盘挂在多个存储节点上,为避免多个节点同时对盘进行初始化,初始化前每个节点要获取global meta lock。 流程如下:  1. 判断盘是否为新盘,如果是:     a. 获取global meta lock     b. 再次判断盘是否为新盘,如果已经被其他节点初始化了,则结束初始化     c. 初始化global meta     d. 释放global meta lock

qiyuanzhi commented 12 months ago

PFS2默认启动在host上,大部分场景可能是在启动PFS2之后,添加/删除共享盘的FS,而非启动PFS2时就已经存在共享盘,因此可能需要支持的流程:

a. 向PFS2进程挂载 share disk;

b. 初始化share disk元数据;

c . 删除share disk;

qiyuanzhi commented 12 months ago

meta 区域的 backup 是有必要的;否则无法解决下刷 freelist/trimlist/MTL过程中,异常掉电的问题

cocalele commented 12 months ago

PFS2默认启动在host上,大部分场景可能是在启动PFS2之后,添加/删除共享盘的FS,而非启动PFS2时就已经存在共享盘,因此可能需要支持的流程:

a. 向PFS2进程挂载 share disk;

b. 初始化share disk元数据;

c . 删除share disk;

也就是说,盘是动态添加上去的,而不是通过pfs配置文件预先加进去的。还可以更进一步,在pfs2部署的时候,完全去掉store服务。只提供动态加盘的命令 mkfs.pfs2 , 这个命令初始化元数据,并把加入到zookeeper。 形式上更像本地文件系统的使用习惯,只是背后依赖了pureflash的集群管理机制。

去掉store节点后,原来store里面的IO下发功能需要移到client实现。

cocalele commented 12 months ago

meta data需要owner来负责维护,owner由store节点担任。因此store节点还不能完全移除

qiyuanzhi commented 12 months ago

meta data需要owner来负责维护,owner由store节点担任。因此store节点还不能完全移除

非owner store进程,似乎没有具体的工作了

qiyuanzhi commented 11 months ago

元数据规格计算: 1)lmt key_size: 32 byte, lmt entry_size: 48byte。 假设一个key对应一个entry,两者相加80byte; 2)假设使用4M的object size; 3)假设最大规则支持100T的共享盘

FreeList需要预留:(100T/4M) 4 byte = 100M TrimList需要预留:(100T/4M) 4 byte = 100M LMT需要预留:(100T/4M) * 80byte = 2000M

Metadata layout:

image