Alluxio FUSE在京东的实践

京东分布式存储系统专家刘洪通,作的题为“Alluxio FUSE在京东的实践”的报告。他介绍了Alluxio FUSE在京东的落地使用情况,深度剖析了Alluxio FUSE原理和架构,以及如何提升Alluxio FUSE的POSIX兼容性。最后,他还介绍了京东在Alluxio社区的贡献。

展开查看详情

1.Alluxio FUSE在京东的实践 京东零售 技术与数据中台 数据基础平台部 刘洪通 2019-09-01

2.目录 1 Alluxio FUSE在京东的应用 2 解读Alluxio FUSE原理和架构 Alluxio FUSE的POSIX兼容性 京东在Alluxio社区的贡献 3 4

3.1 Alluxio FUSE在京东的应用

4.Alluxio FUSE在京东的应用 - 平台架构 4

5.Alluxio FUSE在京东的应用 – 早期海量文件共享服务 一写多读 数据从HDFS推送至 费时 Cephfs,约增加一倍耗时 费力 需要数据一致性校 验,耗费大量时间 内核ceph模块增加 劣势 操作系统不稳定性 稳定性 Ceph集群不易运维,新 手难以掌握 难度大 5

6.Alluxio FUSE在京东的应用 – 海量文件高速共享服务 Hadoop Client集成Alluxio A Client,应用编程无感知,只需 替换Schema 数据经过Alluxio同步地写穿到 B HDFS,耗时只是略微增加,省去 推送环节,较早期模型约缩短一 倍时间 C 不影响操作系统稳定性 同样使用Native fs,文件消 D 费者无感知 缺点 • Alluxio FUSE宜采用Direct_IO,无Page Cache加速 • FUSE受限于架构设计,性能不及内核态fs • Alluxio的稳定性将影响BDP SLA 6

7.Alluxio FUSE在京东的应用 - 备选方案 待改进 distributedLoad实际效果相比load性能提升有限,待进一步优化 7

8. 解读Alluxio FUSE原理和架构 2

9.解读Alluxio FUSE原理和架构 - 核心架构  FUSE: Filesystem in Userspace(用户空间文件系统) AlluxioFuse 1 Alluxio基于jnr-fuse 实现用户态文件系统 的守护进程 2 jnr-fuse An FUSE implementation in java using Java Native libfuse 3 Runtime fuse 的用户态库 4 vfs Virtual File System, 虚拟文件系统 /dev/fuse 5 AlluxioFuseFileSystem extends FuseStubFS { fuse模块创建的字符设 + int create(String path, long mode, FuseFileInfo fi) 备,是内核与libfuse + int open(String path, FuseFileInfo fi) 交互的通道,所有挂载 6 kernel fuse 点(Mount Point)共享 + int chmod(String path, long mode) 基于vfs实现的内核模块 + int chown(String path, long uid, long gid) + int mkdir(String path, long mode) + int readdir(String path, Pointer buff, FuseFillDir filter, long offset, FuseFileInfo fi) ...... }

10.解读Alluxio FUSE原理和架构 - 使用方法  安装依赖 # yum install -y fuse-libs fuse  配置 # cat alluxio-2.0.0/conf/alluxio-site.properties alluxio.master.hostname=x.x.x.x # echo user_allow_other >> /etc/fuse.conf  挂载Alluxio FUSE # ./alluxio-2.0.0/integration/fuse/bin/alluxio-fuse mount -o <options> /mountpoint /path/in/alluxio  查看Alluxio FUSE挂载点 # ./alluxio-2.0.0/integration/fuse/bin/alluxio-fuse stat pid mount_point alluxio_path 130741 /mountpoint /path/in/alluxio  查看挂载参数 # mount -t fuse.alluxio-fuse alluxio-fuse on /mountpoint type fuse.alluxio-fuse \ (rw,nosuid,nodev,relatime,user_id=1001,group_id=1001,allow_other)  查看存储空间 # df -h -t fuse.alluxio-fuse Filesystem Size Used Avail Use% Mounted on alluxio-fuse 211T 53G 211T 1% /mountpoint  卸载Alluxio FUSE # ./alluxio-2.0.0/integration/fuse/bin/alluxio-fuse umount /mountpoint 或 # umount /mountpoint

11.解读Alluxio FUSE原理和架构 - 初始化流程 1. jnr-fuse将AlluxioFuseFileSystem打 包传给libfuse 2. libfuse打开/dev/fuse字符设备,返回 文件描述符fd(File Descriptor)。fd在 进程内的线程间共享,因此fuse很容 易支持multi-thread模式;fd在进程 间不共享,且file支持私有数据,因此 fuse支持多种类型的挂载点 3. mount系统调用传参fd,libfuse和 kernel fuse通过fd这个桥梁建立虚拟 连接 4. super_block和file的私有数据对应虚拟连接 5. multi-thread模式下,多个线程同时从/dev/fuse读取请求 6. 当前无请求时,read系统调用阻塞 7. 当请求到来时,唤醒被阻塞的线程,read返回文件系统请求

12.解读Alluxio FUSE原理和架构 - mkdir流程

13. Alluxio FUSE的POSIX兼容性 3

14.Alluxio FUSE的POSIX兼容性 - 兼容性测试  fstest - 简化版的文件系统POSIX兼容性测试套件 01 02 https://www.tuxera.com/community/posix-test-suite/ ext4  使用方法 极少数失败 xfs wget http://download.tuxera.com/sw/qa/pjd-fstest-20080816.tgz 极少数失败 tar xf pjd-fstest-20080816.tgz cd pjd-fstest-20080816 03 ceph-fuse make (切记,进入待测试目录!!!) kernel ceph 04 少数失败 cd /your/test/dir 极少数失败 整体测试 prove -r pjd-fstest-20080816/tests 05 单独测试 Alluxio-fuse 06 prove pjd-fstest-20080816/tests/unlink/00.t 部分失败 hdfs-fuse  定位失败测试 大部分失败 # strace -T -f -r prove pjd-fstest-20080816/tests/mkfifo/00.t > /tmp/ mkfifo.log 2>&1 [pid 54451] mknod("fstest_34c2d9dbec1aed322d9ffc452ce32469", S_IFIFO|0644 <unfinished ...> [pid 54451] <... mknod resumed> ) = -1 ENOSYS (Function not implemented) <0.000814> 14

15.Alluxio FUSE的POSIX兼容性 - 兼容性  兼容列表  User & Group create, rename, open, unlink POSIX定义的文件元数据中记录User & Group ID getattr, chmod, chown 如果系统中不存在该ID对应的User或Group: mkdir, readdir ,rmdir # chown 12345:12345 TODO read, write, flush dup2 stat显示UNKNOWN …… # stat TODO Uid: (12345/ UNKNOWN) Gid: (12345/ UNKNOWN)  不兼容列表 不支持在创建文件或目录时指定权限<已解决> ls显示ID 不支持修改文件属主或属组为当前不存在的用户或组 # ls -l TODO 不支持软连接 -rw-r--r-- 1 12345 12345 6972 Dec 4 2013 TODO 未检查文件名长度是否超出255 <已解决> 不支持mkfifo, mknod Alluxio使用User & Group Name 不支持truncate 如果系统中不存在该User或Group,则无法转换为ID, 不支持扩展属性 目前折中的方案是使用挂载用户的User & Group ID 不支持fallocate 不支持utimes 不支持append ...... 15

16. 京东在Alluxio社区的贡献 4

17. JD Contribution to Alluxio New Web UI Shell Command ui-grid based sort/pagination/filter add cp/ls/load/rm/format an input field Cache Consistency Change Log Level check startsup shell check every time RESTful API Business Watermark Evict Strategy Strategy Bugfix high watermark start evict Deadlock low watermark stop evict thrift add timeout time … JVM Pause Monitor Test monitor JVM pause periodically SyncQuery log message and metrics AlluxioTools … 17

18.京东在Alluxio社区的贡献 近期贡献 支持statfs,通过df命令可以查询挂载点信息 1 限制文件名长度不超过255个字符 2 创建文件或目录时支持指定permission 3 解决偶发umount失败问题 4 支持文件或目录的真实创建者 5 解 决 CACHE_THROUGH 模 式 下 Alluxio 和HDFS文件属主不一致的问题 6 18

19.京东在Alluxio社区的贡献 持续发力 新功能开发 兼容性提升 社区合作 技术分享 19

20.Q&A

21.Thank You!