把对象存储转为文件存储,到底香不香?

目前开源的文件存储有很多,譬如NFS、GlusterFS、CephFS等,但实话实话这些文件存储都存在一定的问题,譬如NFS的多集群要折腾、GlusterFS的小文件存储性能差、CephFS的运维复杂度和稳定性不高。结合公司的业务场景:图片、pdf、文档 存储的特性,在公司内部主推的是对象存储。
但在推广对象存储的时候,也面临一些老系统的改造压力,这些老系统之前都是使用商业NAS,如果迁移到对象存储需要改造的点有很多,而且还需要考虑历史数据的读取。如果对象存储能够保持和之前商业NAS一样的有个文件系统,通过目录和文件的方式读写那就可以快速的帮助业务迁移到对象存储。
我们都知道Fuse文件系统,它是linux提供的用户态文件系统,曾帮助我们解决docker的proc文件系统问题,这次我第一个想到的也是它。能不能通过Fuse对接到S3对象存储上面呢?搜索了一下,还真有很多相关的实现,happy。赶紧拿来测试一下。

首先打包一个s3fs的Docker镜像

FROM  xx.xx.xx/basic/centos:7.5.1804 
RUN  yum install epel-release -y && yum install s3fs-fuse -y

如果是Docker直接启动

# docker run -it   --privileged  

然后在容器内执行挂载前需要将s3的秘钥写入passwd-s3fs

#  echo ACCESS_KEY:SECRET_KEY > ${HOME}/.passwd-s3fs&&chmod 600 ${HOME}/.passwd-s3fs
# s3fs   bucketname /abc/   -o url=http://s3.xx.xx/ -o use_path_request_style  -o endpoint=default

挂载成功后便可以像操作本地文件系统一样的读写数据了。

sh-4.2# cd /abc
sh-4.2# ls
aa  abc.txt  bb  cc  kk

可以看到和我们对象存储里面的内容是保持一致的(截图来着我们team自研的对象存储管理页面)
在这里插入图片描述
是不是很香,如果是在kubernetes的环境中,需要先开启策略

      containers:
      - name: my-container
        securityContext:
          privileged: true
          capabilities:
            add:
              - SYS_ADMIN

这种使用方式相对于常规的容器挂载文件系统的好处有两点:
第一是避免业务改造代码
第二是可以避免主机挂载,如果是主机挂载NAS,当NAS出现故障后,会导致容器无法删除、Docker hang住等问题。
但这种方式也不是万能的,毕竟的它的后端还是一个对象存储,对象存储的最佳实践就是一次写入,后续都是读请求。如果有个业务的研发误用,将s3挂载的目录用于记录日志,那么无疑是打开了潘多拉的魔盒,一直PUT对象。所以我们需要监控每个bucket的读写次数并设置告警,避免误用。所以这样看来它又并不是那么香了。
所有的技术都是有适用场景的,没有银弹,没有银弹,没有银弹,重要的事情说三遍。

补充说明:

  • 如果上面s3挂载没有成功,也不会报错,可以通过mount命令查看是否挂载成功
    可以通过追加“-o dbglevel=info -f -o curldbg”查看debug信息。

  • 如果是window或则mac也支持挂载,不过看了几款都是收费(可以试用30天)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章