chunk是kfs管理的原子单位,类似于文件系统的block。chunk大小是64MB, 每64K数据是一个checksum(32bit)计算单位。
chunk的管理者--chunkserver,chunkserver拥有管理chunk必要的metadata,chunk的metadata和content都存储在chunkserver上,其中metadata在chunkserver启动时加载到内存。
metadata:关联的文件(用户操纵的是文件)
chunk version(用于保证一致性)
checksum(便于校验)
磁盘上的chunk的metadata:
int metaMagic; /**< magic num */ int metaVersion; /**< 元信息版本 meta version */ kfsFileId_t fileId; /**< 文件id */ kfsChunkId_t chunkId; /**< chunk id */ kfsSeq_t chunkVersion; /**< chunk version */ off_t chunkSize; /**< chunk 大小 */
/**< 所有块的校验和 */ uint32_t chunkBlockChecksum[MAX_CHUNK_CHECKSUM_BLOCKS]; uint32_t numReads; /**< 读取次数,用于统计 */ char filename[MAX_FILENAME_LEN]; /**< 块所属的文件名 */
chunkserver中用ChunkInfo_t结构体记录chunk信息和操作,其中有序列化和反序列化操作。
序列化是把这个结构体转成可以存储的databuffer,反序列化从磁盘metadata构造内存metadata。