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

2024-05-10 17:48

本文主要是介绍把对象存储转为文件存储,到底香不香?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前开源的文件存储有很多,譬如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-containersecurityContext:privileged: truecapabilities:add:- SYS_ADMIN

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

补充说明:

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

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

这篇关于把对象存储转为文件存储,到底香不香?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977131

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MySQL常见的存储引擎和区别说明

《MySQL常见的存储引擎和区别说明》MySQL支持多种存储引擎,如InnoDB、MyISAM、MEMORY、Archive、CSV和Blackhole,每种引擎有其特点和适用场景,选择存储引擎时需根... 目录mysql常见的存储引擎和区别说明1. InnoDB2. MyISAM3. MEMORY4. A