V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

请教一个关于分块存储文件同步的问题

  •  
  •   zxCoder · 2020-10-09 09:10:52 +08:00 · 559 次点击
    这是一个创建于 1303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据 rsync 算法,客户端将文件分块,计算两种 hash 值,然后发送给服务端,然后服务端会返回一个列表,表示新的文件的分块情况,有可能是直接引用原文件的某一块,也有可能是新的数据。

    那么如果是引用原文件的某一块,原文件在分块的时候要把每一块内容先缓存起来比较好,还是等到需要用到的时候再从某某字节开始读取一块比较好?

    第 1 条附言  ·  2020-10-09 09:54:28 +08:00
    我还有一个问题,比如在两台电脑文件同步,电脑 A 把最新文件同步到服务器上,然后电脑 B 开机,这时候,怎么判断应该把服务器上最新文件同步到电脑 B,还是要把电脑 B 上"最新的"文件(其实是原来的文件)同步到服务器上呢?
    4 条回复    2020-10-09 16:33:08 +08:00
    wakzz
        1
    wakzz  
       2020-10-09 10:18:52 +08:00   ❤️ 1
    这里就是缓存的方案了,缓存肯定是要缓存的,现在主流两种缓存策略:
    1. 软件本身不管理缓存,缓存由操作系统的文件系统管理,典型案例是 Elasticsearch,优点是减少了很多工作量,缺点也很明显,自己不管理缓存,热点数据的缓存容易被冷数据的缓存覆盖
    2. 软件管理缓存,典型案例是 mysql 的 innodb 引擎,所有缓存加载在软件的堆内存内,优点是缓存管理由自己处理,通过各种策略防止热点数据缓存被冷数据缓存覆盖,缺点是有很多额外工作量,还需要预防 OOM
    wakzz
        2
    wakzz  
       2020-10-09 10:22:55 +08:00   ❤️ 1
    另一个问题就是版本控制的细节了,可以去了解一下 git 的实现,简单来说就是提交时间+版本号,版本新旧比较很简单了,真正麻烦的是版本冲突后的处理。
    zxCoder
        3
    zxCoder  
    OP
       2020-10-09 16:22:10 +08:00
    @wakzz 想请教一个问题,如果保证服务端的文件是最新的,那客户端想把这个最新的文件拉下来,要怎么判断应该是完全覆盖的更新,还是要解决冲突呢?这点一直想不太明白
    zxCoder
        4
    zxCoder  
    OP
       2020-10-09 16:33:08 +08:00
    @wakzz 我目前的简单理解是,如果本地的文件修改时间**早于**服务端的文件修改时间,那文件直接拉下来然后覆盖,如果**晚于**服务端,说明本地的文件在更新到最新版本之前就进行了修改,所以这时候再拉下来就会冲突,就需要解决冲突了。不知道这种理解对不对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2541 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:10 · PVG 21:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.