其他分享
首页 > 其他分享> > 分布式存储 Cephfs 读取优化方案

分布式存储 Cephfs 读取优化方案

作者:互联网

1.背景说明

继上次分享的《Ceph介绍及原理架构分享》《分布式存储Ceph之PG状态详解》,这次再分享点干货。

用户需要从cephfs存储系统中检索一个大文件指定关键字的一行信息, 并且对延迟和性能要求比较高。


2. 原始方案

2.1 流程图

图片

2.2 说明

2.3 实战

图片

2.4 优缺点

优点

- 简单方便

- 开发成本低

缺点

- 用户端检索延迟大,影响用户体验

- 客户端集群网卡带宽波动较大,带宽有限,每次都需要把大日志文件拉取到客户端

- 对ceph集群负载也有波动影响

2.5 总结

用户拉取文件,必须先通过cephfs拉取文件到本地,然后根据关键字检索这行数据。如果用户检索量比较大的时候,并且文件大小都不统一,拉取文件越大网络延迟越高,并且在大文件中过滤关键字效率非常低,严重影响用户的体验。


3. 优化方案

3.1 流程图

图片

3.2 说明

3.3 实战

图片

3.4 优缺点

缺点

- 需要额外开发成本

优点

- 提升用户体验,从以前检索单个2.8G文件耗时10s左右, 优化后控制在100ms左右

- 客户端网络网卡带宽可用率得到提升

- 减少对ceph集群的冲击影响

3.5 总结

思路:

由于文件信息是放到服务端,进行切片存储到数据节点。

我们能不能只拉取我需要的块信息,不用全量拉取到本地,答案是肯定的。

优点:

- 提升用户体验,从以前检索单个2.8G文件耗时10s左右, 优化后控制在100ms左右

- 客户端网络网卡带宽可用率得到提升

- 减少对ceph集群的冲击影响


4. 深入分析

4.1 文件对应object信息

4.1.1 Jewel版本

图片

4.1.2 源码跟踪

ceph jewel版本,cephfs代码

https://github.com/ceph/ceph/blob/v10.2.9/src/cephfs.cc#L117

```c/c++

struct ceph_ioctl_layout layout;

memset(&layout, 0, sizeof(layout));

//获取layout信息

err = ioctl(fd, CEPH_IOC_GET_LAYOUT, (unsigned long)&layout);

if (err) {

cerr << "Error getting layout: " << cpp_strerror(errno) << endl;

return 1;

}

图片

图片

图片

图片

图片

4.1.2 Luminous版本

Luminous版本里,没有src/cephfs.cc文件, 发现test_ioctls.c 其实有相关的测试代码。

https://github.com/ceph/ceph/blob/master/src/client/test_ioctls.c
/src/client/test_ioctls.c

```c/c++

int main(int argc, char **argv)

{

...

fd = open(fn, O_CREAT|O_RDWR, 0644);

if (fd < 0) {

perror("couldn't open file");

return 1;

}

图片

图片

图片

图片

图片

4.5 项目工具

1. 源码地址

- https://github.com/lidaohang/cephfs_readline

2. dss_readfile工具

- 根据存储池、文件信息、offset获取对应的信息

图片

3. ngx_cephfs_readline

- 为了提升性能以及用户体验,基于ceph module + librados 开发,充分利用nginx优秀的高并发性能。

图片

4.7 资料


标签:文件,Cephfs,读取,object,拉取,ceph,offset,cephfs,分布式
来源: https://blog.51cto.com/u_15127582/2757074