Ceph分布式存储-CEPH

【优化】Cephfs查找文件某行数据信息

2018-09-30  本文已影响6人  lihanglucien

1.背景说明

用户需要从一个文件从检索出一行数据, 并且对延迟和性能要求比较高。

1.1 现在做法

普通的做法是A用户上传2G的文件到Ceph集群, B用户拉取该2G的文件到本地,然后根据offset检索这行数据。

这其中的做法是用户检索量比较大的时候,都需要拉取不同文件的2G数据,延迟比较高,严重影响用户的体验。

缺点:

1.2 优化方案

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

思路:

优点:

2. 方案逻辑

2.1查看文件映射object信息

root@xxx$ cephfs /mnt/kernel_log_push.log map
WARNING: This tool is deprecated.  Use the layout.* xattrs to query and modify layouts.
    FILE OFFSET                    OBJECT        OFFSET        LENGTH  OSD
              0      10002b63282.00000000             0       4194304  61
        4194304      10002b63282.00000001             0       4194304  67
        8388608      10002b63282.00000002             0       4194304  70
       12582912      10002b63282.00000003             0       4194304  68

2.2根据offset查找object信息

root@xxx$ cephfs /mnt/kernel_log_push.log show_location -l 12582912
WARNING: This tool is deprecated.  Use the layout.* xattrs to query and modify layouts.
location.file_offset:  12582912
location.object_offset:0
location.object_no:    3
location.object_size:  4194304
location.object_name:  10002b63282.00000003
location.block_offset: 0
location.block_size:   4194304
location.osd:          68

2.3获取这个对象信息

#这是整个4M读取,有点浪费资源,不推荐
root@xxx$ rados -p cephfs_data get 10002b63282.00000003 test

2.4获取这个对象的某行数据

/*
问题点:
1. 一行数据可能会拆分为两个对象
解决方案:
用户给的offset属于这一行的结尾, 只需要读取上一行是否存在\n,
如果存在\n证明该行,属于完整的行。
否则不存在\n证明该行,被拆分为两个对象,在上一个对象的结尾offset往上读,直到遇到\n 合并两个对象读取的数据为完整的行。
*/
#Contents of object 'hw'
print ioctx.read("hw",length=int,offset=int) #length 默认是对象长度,offset默认是0
上一篇 下一篇

猜你喜欢

热点阅读