Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

disk layout #28

Open
cocalele opened this issue Aug 28, 2023 · 6 comments
Open

disk layout #28

cocalele opened this issue Aug 28, 2023 · 6 comments

Comments

@cocalele
Copy link
Owner

磁盘的元数据区 大小可以通过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
Copy link
Collaborator

qiyuanzhi commented Aug 28, 2023

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

a. 向PFS2进程挂载 share disk;

b. 初始化share disk元数据;

c . 删除share disk;

@qiyuanzhi
Copy link
Collaborator

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

@cocalele
Copy link
Owner Author

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
Copy link
Owner Author

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

@qiyuanzhi
Copy link
Collaborator

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

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

@qiyuanzhi
Copy link
Collaborator

qiyuanzhi commented Sep 4, 2023

元数据规格计算:
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: In Progress
Development

No branches or pull requests

2 participants