wangxiaoer
V2EX  ›  问与答

大文件读取的方案

  •  
  •   wangxiaoer · Jul 21, 2017 · 2762 views
    This topic created in 3288 days ago, the information mentioned may be changed or developed.

    应用需要读取一些大文件,单个不超过 4G,如果应用和数据部署在同一台服务器,就不存在任何问题。

    但是目前大多数情况下都是多台应用服务器+1 台数据服务器,这种情况怎么破?

    我司都是 windows 系统,之前用 windows 共享文件夹的方式,但是被权限问题搞得苦不堪言,大家都是怎么破的?

    另外,如果是 linux 环境,又有哪些方案呢?

    Supplement 1  ·  Jul 21, 2017
    总的数据量比较大,单一类型的数据都是几个 T 的,类型也比较多。

    另外,我们的应用层一般是读取一个文件后,需要从这个文件中再解析(当然这个解析是又索引机制的)出一部分数据返回。

    打个比方,我有 1000 张图片,然后合并成了一个大的图片文件,并且生成了一个索引,现在的数据就是这些一个个合并的大文件(单个最大 4G ),用户请求的时候,根据索引去大图片里面读出对应的小图片返回。只是举一个类似的例子,所以不要问为啥不直接存放单个小图片,直接返回这种。
    20 replies    2017-07-22 08:37:26 +08:00
    jinhan13789991
        1
    jinhan13789991  
       Jul 21, 2017
    一台作为主服务器,文件有更新就推送到其他从服务器。
    coolyujiyu
        2
    coolyujiyu  
       Jul 21, 2017
    你可以在数据服务器上面弄个 FTP 服务嘛。
    这样子应用服务器用 FTP 来读取好了。

    linux 的话,直接把数据服务器的硬盘挂载到每一台应用服务器了。也可以用 FTP
    wangxiaoer
        3
    wangxiaoer  
    OP
       Jul 21, 2017
    @jinhan13789991 总数据量都是几个 T 的,没法这么同步。
    wangxiaoer
        4
    wangxiaoer  
    OP
       Jul 21, 2017
    @coolyujiyu 应用层能通过 ftp 的方式读取文件?比如 java 有这样的类库?
    YouXia
        5
    YouXia  
       Jul 21, 2017
    分布式,拆分数据后,下发到每台机器,返回数据后上游做 merge。

    如果只允许一台数据服务器,那只能试试磁盘索引了。
    des
        6
    des  
       Jul 21, 2017
    我觉得是你没弄懂 windows 共享的权限的机制。
    要不看一下这个尝试下? http://www.cnblogs.com/milantgh/p/3617852.html
    wangxiaoer
        7
    wangxiaoer  
    OP
       Jul 21, 2017
    @des windows 的这个权限机制的确没弄懂过,很多时候 windows 系统中设置正常后,IIS 里面就完犊子了,要通过配置用户密码的方式,有时候配了还不行,不想折腾了,所以问问有没有别的方案。
    比如 NAS 啥的。
    des
        8
    des  
       Jul 21, 2017
    @wangxiaoer 要想匿名访问就要打开 guest 账户,然后允许无密码登陆。
    所以最好还是新建个带密码的账户,然后给这个账户文件夹权限以及共享权限。记得把子文件(夹)的权限也改了,在安全-》高级里面可以直接递归。
    Colorful
        9
    Colorful  
       Jul 21, 2017
    Hadoop
    DCjanus
        10
    DCjanus  
       Jul 21, 2017
    请问你们现有的方案是遇到了什么问题呢?权限控制过于复杂?文件共享有莫名其妙的 BUG ?还是性能跟不上?开发复杂度过高?

    另外文件索引解析的流程是以下哪一个?
    1. 大文件读取到应用服务器,解析出所需数据,抛弃其它部分
    2. 调用文件服务器接口,文件服务器完成解析后传输所需数据
    3. 从文件服务器获取索引信息,然后利用 Windows 文件共享协议提供的随机访问功能读取所需数据。

    另外所有服务器应该是在局域网环境吧,也就是相互之间带宽很高?
    coolyujiyu
        11
    coolyujiyu  
       Jul 21, 2017
    @wangxiaoer 当然有啦,FTP 操作是最基本的。。。随便一百度

    http://blog.csdn.net/dzy784858512/article/details/41279709
    loopio
        12
    loopio  
       Jul 21, 2017
    可以参考一些镜像站的架构,中科大,清华的。大部分镜像文件都是几个 G 的。比较成熟点。
    wangxiaoer
        13
    wangxiaoer  
    OP
       Jul 21, 2017 via Android
    @DCjanus 权限搞不定,莫名其妙不能用,莫名其妙又好了,当然这跟我们的水平有关。性能和开发难度倒没问题。

    另外前阵子不是爆出 445 端口漏洞吗,有些客户就死活不开这个端口了。

    目前解析流程用的是 1.
    wangxiaoer
        14
    wangxiaoer  
    OP
       Jul 21, 2017 via Android
    @loopio 不是这样的,这是纯静态大文件直接对外服务的。我们是应用层读写。
    wangxiaoer
        15
    wangxiaoer  
    OP
       Jul 21, 2017 via Android
    @DCjanus 忘了补充一下,应用服务器和数据服务器在局域网内,G 口带宽。
    catror
        16
    catror  
       Jul 21, 2017 via Android
    用 NFS 远程挂载…
    DCjanus
        17
    DCjanus  
       Jul 21, 2017
    @wangxiaoer
    还真是简单粗暴啊……
    如果是这个方案,那就很简单了,所有文件都用 HTTP 或者 FTP 拉取,比如 nginx 提供 HTTP 服务,一般 80 端口应该都会开吧?就算没开,随便找个端口开一下都可以提供服务。
    按照一般的 web 应用做一下鉴权(如果你们需要的话)即可,反正内网环境带宽够高,HTTP 的性能可以接受。

    虽然我更倾向于把文件的元信息保存在数据库,应用层查询数据库获取小文件的大小、偏移量以及宿主文件的 URL,然后用 HTTP 的 range 获取文件,性能上好太多,节省很多流量,当然,如果你们觉得麻烦,当我没说 233333
    sagaxu
        18
    sagaxu  
       Jul 21, 2017 via Android
    没钱就买 nas,有钱就买 san,成熟方案很多,别折腾了
    yidinghe
        19
    yidinghe  
    PRO
       Jul 22, 2017 via Android
    要随机读取文件,FTP 是不行的,nfs 应该可以,因为挂载之后就和本地文件差不多了。
    wangxiaoer
        20
    wangxiaoer  
    OP
       Jul 22, 2017
    @DCjanus 你说的这个思路(用 HTTP 的 range 获取文件)倒是不错,我之前没想到过,其实我们的文件适合索引存在一起的,比如 bigfile.dat 同目录会存在一个 bigfile.idx 文件,里面存放一些索引信息,我可以 http 先读取这个索引文件,解析出位置,然后 http range 读取 bigfile.dat 中指定位置的文件。

    但是这样有一个前提,就是 bigfile.dat 里面单个文件是顺序存放的,这个我要下周确认一下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5367 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 06:02 · PVG 14:02 · LAX 23:02 · JFK 02:02
    ♥ Do have faith in what you're doing.