重要更新点一:Page Store 存储模型
在以 ORC / Parquet 格式文件构建的数据仓库以及其他 OLAP 数据库的应用场景中,大量的随机读 IO 会带来数据缓存的放大问题:
数据以 Block 形式缓存时,即使只需要 Block 中一小段的热数据,也会对 UFS 产生整个 Block 级别的读取带宽放大,对响应延迟有极大地影响;
包含热点数据区段的 Block 都会被缓存到 GooseFS 中,GooseFS 的缓存空间被明显放大,导致缓存空间利用率降低。
上述问题尤其是在数据文件本身比较大,但是随机 IO 却相对比较小数据查询分析场景中,尤为凸显。
因此,GooseFS 在 1.4.7 版本中全新引入了 Page Store 的存储模型设计,在不增加 Master 节点的元数据管理负担的前提下,允许 GooseFS 的数据节点以 Page 这种更小粒度存储单元来缓存数据,极大地缓解了海量随机访问场景下的数据放大问题,下图是原有 Block Store 与新的 Page Store 的设计对比。
在引入了 PageStore 的设计以后,对于存放在 COS/CHDFS 等 UFS 上的数据,我们都可以按需请求与缓存。同时,在 Page Store 的设计中实现了单数据节点的缓存击穿优化,即使多个请求同时访问了一个热点数据区段,也能够有效地降低对 COS/CHDFS 的带宽访问冲击,提升了整个存算分离架构的稳定性。
重点更新点二:统一故障降级能力
GooseFS 在 v1.4.7 版本中增强了全场景读写流的容灾能力,GooseFS 客户端会持续观测读写流状态,在状态异常时自动将流切到 Under FileSystem (一般为 COS/CHDFS), 同时在 GooseFS 状态恢复后自动切回来。
参考下图,写 GooseFS 过程中如果出现异常,客户端写流会自动触发降级写,最终只要 COS/CHDFS 能够写成功,整体写流就认为成功。GooseFS 不会缓存异常点之后的数据,初次读时会从 COS/CHDFS 重新 Load。
参考下图,读 GooseFS 过程中读流如果出现异常,GooseFSClient 会重新建立 COS/CHDFS 的读流,并从故障 Position 位置续读,同时会启动异步线程监听 GooseFSStore 状态,故障恢复时会自动升级。
读写降级能力对客户屏蔽了 GooseFS 的故障情况,极大提高了 GooseFS 的容灾能力。
新增配置项说明
以下是在 GooseFS 1.4.7 版本中新增的一些配置项。
参数 | 默认值 | 描述 |
goosefs.worker.block.store.type | FILE | 指定 Worker 上的存储类型,可选项为 FILE 和 PAGE。 默认为 FILE,即传统的 Block 存储模式,指定 PAGE 则为 Page 存储模式。 |
goosefs.worker.page.store.page.size | 1MB | 指定每个 Page 页的大小。默认大小为 1MB,这里可以按需指定,例如 128KB 或 256KB 亦可。 |
goosefs.worker.page.store.dirs | /tmp/goosefs-cache | 指定 Page Store 的数据目录。例如: /data/goosefs-data/paged-block 。 |
goosefs.worker.page.store.size | 512MB | 指定 Page Store 的数据目录的大小,默认为 512MB,如果超出了容量限制,则会触发 Page 粒度的淘汰。 |
goosefs.worker.cache.request.pending.timeout | 500ms | 用来优化高并发冷读场景下的缓存击穿问题的超时等待选项,默认是 500 毫秒。 如果在同一 Worker 节点上发生了缓存击穿的并发读取,则后到的请求会尝试等待 500ms,以便于直接从缓存中直接返回数据,而不是穿透到底层存储。 若等待超时,才会从底层存储读取并返回。 当该值设置为小于等于 0 的值时候,则相当于关闭了缓存击穿优化。 |
goosefs.worker.page.store.overhead | 0.1 | Page 存储空间的预留分位。默认值为 0.1,表示会预留百分之十的空间作为保留空间。达到水位以后,开始触发淘汰动作。 |
goosefs.worker.page.store.evictor.class | com.qcloud.cos.goosefs.client.file.cache.evictor.LRUCacheEvictor | Page 存储的淘汰算法,支持的选项为: com.qcloud.cos.goosefs.client.file.cache.evictor.LRUCacheEvictor; com.qcloud.cos.goosefs.client.file.cache.evictor.LFUCacheEvictor。 |
goosefs.worker.page.store.eviction.retries | 10 | 最大淘汰尝试次数,默认为 10 次。 |
goosefs.worker.page.store.evictor.lfu.logbase | 2.0 | 指定 LFU 淘汰算法的 LogBase。 |
goosefs.worker.page.store.local.store.file.buckets | 1000 | 存放 Paged Block 目录的 Hash 桶数目,默认为 1000。 |