V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
srliuhao
V2EX  ›  程序员

大文件上传下载用搭建哪种服务好?

  •  1
     
  •   srliuhao · 248 天前 · 3125 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上古时期都是搭个 FTP ,但是由于不安全,越多越多的地方不让用了。但有加密传输的 SFTP 之类的,安全性如何?感觉很多单位只要对带 FTP 的就很敏感,SFTP 也不让用,有什么合理的理由么 那系统里如果需要大文件上传下载服务,如果不选择现在商业第三方的组件的话,还有什么替代选择么? 或者 SFTP 就是没问题的

    30 条回复    2023-08-25 09:22:28 +08:00
    BG7ZAG
        1
    BG7ZAG  
       248 天前   ❤️ 1
    试试 SCP
    mightybruce
        2
    mightybruce  
       248 天前   ❤️ 7
    你需要一个专门的存储系统。
    存储系统总体来分,可以分为:块存储,对象存储和文件存储。
    简单一点的小文件存储系统,比如 fastdfs
    对象存储系统比如 minio

    对象存储适合的场景:
    1 、一次写,不修改,多次读。(比如互联网的图片,音视频等)上传结束就是文件修改结束。
    2 、基本没有随机访问共享数据内部位置的需求。
    3 、没有多个客户端同时修改一个文件的需求。
    4 、平坦结构,没有类似目录的层级关系。(有人会挑战说对象的 key 可以是个带有/前缀字符串来模拟目录,但其实跟文件目录差距非常大,后面我们讨论)

    文件存储适合的场景:
    1 、可以修改文件数据,随时修改,随时读。文件系统没有文件“修改结束”这个概念。
    2 、支持文件内容的随机访问。
    3 、多客户端通过文件系统交换数据,客户端 1 写数据(修改数据),客户端 2 ,读数据。我们比较一下文件存储和对象存储的异同。文件存储:客户端 1 写共享文件存储上的文件,写完之后关闭。客户端 2 直接打开共享存储上文件读。对象存储:客户端 1 ,在本地写数据,写完数据,要把整个文件上传,客户端 2 下载数据到客户端 2 本地,然后再打开本地文件读文件。可以发现对象写本地,上传远端,相当于写了两次;下载到本地,读本地文件,相当于读了两次。从交换数据的效率来看,频繁在客户端之间交换数据的应用场景不适合对象,适合文件。因此高通量计算/批量计算基本上倾向于文件存储。
    4 、文件存储支持两个客户端同时修改一个文件,比如高性能计算 MPI 。
    5 、无论是 NAS 还是私有客户端的共享文件存储基本上都会为了性能设计客户端的缓存系统,因此性能比较高。对象存储的客户端自己是不带缓存系统的,因为对象操作的数据要不就是本地数据待上传,要不就是得把数据完全下载到本地才能访问,因此不需要什么客户端缓存系统,性能角度要比文件存储差。
    6 、目录层级关系。文件的目录和对象 key 的带有/前缀有啥差别?差别大了,rename/mv 高层目录,对文件系统而言只是目录改名,代价很小。对象存储 prefix 如果想模拟目录改名那么只能是所有带有 prefix 的 key 的批量更新。
    7 、文件存储中各种软/硬链接等复杂语义对象存储没有对应的实现。(很多人认为文件存储是个树形结构,其实是错误的,因为有 hardlink 所以文件存储系统是个图结构,两个树枝的叶节点可以交汇)
    ruixue
        3
    ruixue  
       248 天前   ❤️ 1
    基于 https 的 webdav 就挺好的,无论兼容性、传输效率还是安全性都不错
    zedpass
        4
    zedpass  
       248 天前
    如果要放在公网,提供给多人使用的话,还是使用云厂商的对象存储吧
    Kumo31
        5
    Kumo31  
       248 天前   ❤️ 1
    感觉 2 楼说偏了,文件、块和对象都只是上层接口而已,面向的“使用者“不同,Ceph 就都用 osd 对象存储的模式存。**简单来说,没有特殊需求的情况下**,直接读写裸盘的程序用块存储,直接给人用的上文件存储,而普通程序不需要像数据库或者 OS 一样直接对块级别做细粒度的管理,也不需要文件这种形式的抽象,对象存储的 KV 语义是最适合的。
    laqow
        6
    laqow  
       248 天前
    p2p 单次链接单次下载就 croc 或者基于 udp 的 wormhole
    cnbatch
        7
    cnbatch  
       248 天前   ❤️ 4
    SFTP 是基于 SSH 的,SCP 也一样,可以认为是基于 SSH 分出来两种不同的传输程序,其中 SFTP 比 SCP 完善得多

    FTPS 才是原始 FTP 套一层 TLS/SSL

    FTP 与 FTPS 的关系,就如同 HTTP 和 HTTPS 的关系

    许多单位不懂这些其实不算奇怪,他们的技术水准甚至连半桶水都没有,顶多也就是塑料瓶的几滴水。这本来没什么,问题在于他们还十分懒,稍微查下资料都懒得查,表层理解都不愿理解。
    cnbatch
        8
    cnbatch  
       248 天前
    个人觉得,对于这种单位,直接给他们部署 SMB 得了
    tabris17
        9
    tabris17  
       248 天前
    对于“传统”公司,刻 DVD 快递
    srliuhao
        10
    srliuhao  
    OP
       248 天前
    @BG7ZAG 您说的是 Linux 下的 SCP 命令么,我的场景下不行,面相客户端的,在 windows 甚至下 web 下进行的上传下载
    srliuhao
        11
    srliuhao  
    OP
       248 天前
    @tabris17 超大文件确实有刻盘这一选项,不过一般的文件还是需要在线传输的^_^
    srliuhao
        12
    srliuhao  
    OP
       248 天前
    @mightybruce 感谢回复,不过我这个场景还不在存储的设计上,需要解决客户端传输文件的问题
    srliuhao
        13
    srliuhao  
    OP
       248 天前
    @ruixue 感谢,我查查看
    srliuhao
        14
    srliuhao  
    OP
       248 天前
    @zedpass 单位自建机房的,就头疼
    srliuhao
        15
    srliuhao  
    OP
       248 天前
    @cnbatch 是这样的,主要是没人愿意担责……
    layxy
        16
    layxy  
       248 天前
    minio
    nuk
        17
    nuk  
       248 天前
    丢云盘让客户自己下载
    cnbatch
        18
    cnbatch  
       248 天前
    那就可以考虑给他们同时提供两种做法:Web 的就 HTTPS ,客户端就 SMB (既可以 Linux+SAMBA ,也可以直接就用 Windows 共享文件夹)。
    这样可以覆盖大多数场景了,而且弄起来也不算特别复杂。
    leaflxh
        19
    leaflxh  
       248 天前   ❤️ 1
    搞个 nextcluod 之类的,可以做用户权限控制

    不搞第三方商业产品的话那就 nginx 搭个 webdav 然后手撸权限控制吧


    安装 nginx 模块:

    apt-get install libnginx-mod-http-dav-ext
    nginx 配置文件:

    server {
    listen 4500;
    server_name _;

    location /dav
    {
    client_max_body_size 5G;
    #目录
    alias /mnt/slice256;
    index index.html index.htm;
    autoindex on;
    client_body_temp_path /tmp;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    create_full_put_path on;

    dav_ext_methods PROPFIND OPTIONS;
    #偷个懒,单纯用 ip 段限制访问。后续添加 http auth
    allow 192.168.0.104;
    deny all;
    }
    }
    在 Windows 的文件管理器 - 右键此电脑 - 映射网络驱动器 - 输入 http://ip:port/dav/即可挂载

    浏览器直接访问 http://ip:port/dav/即可下载
    lovelylain
        20
    lovelylain  
       248 天前
    @leaflxh nginx 做 webdav 有一点不好,必须有个临时目录,例如你这里 client_max_body_size 5G; client_body_temp_path /tmp; 如果/tmp 是 tmpfs 且你的剩余内存小于 5G ,是上传不了 5G 大文件的。
    stephenxiaxy
        21
    stephenxiaxy  
       248 天前
    minio
    leaflxh
        22
    leaflxh  
       248 天前
    @lovelylain 这就去狠狠的踢 chatGPT 的屁股(
    realpg
        23
    realpg  
       248 天前
    不要瞎折腾
    文件不是高度敏感的话,老老实实 ftp 就好
    ssl 系列加密的 性能都不咋地
    dayeye2006199
        24
    dayeye2006199  
       248 天前
    对象存储。上面套 CDN

    如果流量费用敏感,P2P 也是可以的
    815979670
        25
    815979670  
       248 天前
    如果是内部系统用的话 随便找一个开源的网盘系统不就行了?
    BG7ZAG
        26
    BG7ZAG  
       248 天前
    @srliuhao 内网的话,直接开 smb 服务,win 链接跟打开其他盘一样。或者像上面说的用 minio 自建文件服务

    如果是最简单没有权限的,而且存储的地方也是 win 的话,直接开启 win 自带的邻居共享,设置个共享目录或者共享盘。

    还有一个就是搭建 svn ,客户端安装小乌龟访问
    HashV2
        27
    HashV2  
       248 天前
    公司用的 minio 还挺舒服,搭了两个
    一个内部分享开发环境包、工具包以及一些其它的文件,一个开发项目用的
    conglovely
        28
    conglovely  
       248 天前
    搭 minio 试试喽
    unco020511
        29
    unco020511  
       248 天前
    一般公司不是都有文件存储服务吗,业务无关的,供公司内部业务条线使用
    daxin945
        30
    daxin945  
       247 天前
    搞个 seafile 然后弄个 HTTPS ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3942 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:15 · PVG 13:15 · LAX 22:15 · JFK 01:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.