AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 741346
Accepted
mikebabcock
mikebabcock
Asked: 2015-12-08 09:23:49 +0800 CST2015-12-08 09:23:49 +0800 CST 2015-12-08 09:23:49 +0800 CST

rsync 目录,因此所有更改都以原子方式显示

  • 772

我为本地网络做一些经常使用的存储库的夜间和每周镜像。有几次,有人试图在 rsync 发生时进行更新,但由于预期的文件还没有全部到位而失败。

是否可以进行 rsync 以使所有更改的文件在完成时仅以正确的名称出现?我知道 rsync 在每次传输过程中使用临时 .hidden 文件,但是我可以推迟重命名直到它以某种方式完成吗?

或者,我似乎可以使用 --backup 选项将所有更改移动到一个目录并在之后自动移动它们,但我希望该功能与现在的功能相反。

我在 Linux 上是为了它的价值。

linux
  • 4 4 个回答
  • 3718 Views

4 个回答

  • Voted
  1. Best Answer
    Florin Asăvoaie
    2015-12-08T09:31:35+08:002015-12-08T09:31:35+08:00

    您可以使用该--link-dest=选项。基本上你会创建一个新文件夹,所有文件都硬链接到新文件夹。一切完成后,您只需交换文件夹名称并删除旧文件夹名称即可。

    在 Linux 中不可能做到 100% 原子,因为它没有内核/VFS 支持。但是,交换名称实际上只需要 2 个系统调用,因此完成它应该花费不到 1 秒的时间。只能在 Darwin (MAC/OSX) 上使用 HFS 文件系统上的 exchangedata 系统调用。

    • 5
  2. Craig Estey
    2015-12-08T15:22:08+08:002015-12-08T15:22:08+08:00

    我对备份 [到磁盘] 做了类似的事情,rsync由于备份运行时守护程序更新文件,我遇到了同样的问题。

    与许多程序不同,rsync 有许多不同的错误代码 [参见手册页底部]。感兴趣的是两个:

    23 -- 由于错误导致
    部分传输 24 -- 由于源文件消失导致部分传输

    当 rsync 进行传输并遇到其中一种情况时,它不会立即停止。它跳过并继续它可以传输的文件。最后,它显示了返回码。

    因此,如果您收到错误 23/24,只需重新运行 rsync。随后的运行速度会更快,通常只是传输上一次运行中丢失的文件。最终,你会[或应该得到]一个干净利落的运行。

    至于原子性,我在传输过程中使用“tmp”目录。然后,当 rsync 运行干净时,我将其 [原子地] 重命名为<date>

    我也使用该--link-dest选项,但我使用它来保留增量备份(例如--link-dest=yesterday每天)

    虽然我自己没有使用过它,但它--partial-dir=DIR可以防止隐藏文件弄乱备份目录。确保 DIR 与备份目录位于同一文件系统上,因此重命名将是原子的

    当我在 perl 中执行此操作时,我编写了一个脚本,该脚本总结了我一直在说的内容,并针对您的特定情况提供了更详细/更精确的内容。它采用类似 tcsh 的语法,[未经测试且有点粗糙],但将其视为伪代码,以根据您的选择编写自己的bash, perl,脚本。python请注意,它对重试没有限制,但您可以根据自己的意愿轻松添加。

    #!/bin/tcsh -f
    # repo_backup -- backup repos even if they change
    #
    # use_tmp -- use temporary destination directory
    # use_partial -- use partial directory
    # use_delta -- make delta backup
    
    # set remote server name ...
    set remote_server="..."
    
    # directory on server for backups
    set backup_top="/path_to_backup_top"
    set backup_backups="$backup_top/backups"
    
    # set your rsync options ...
    set rsync_opts=(...)
    
    # keep partial files from cluttering backup
    set server_partial=${remote_server}:$backup_top/partial
    if ($use_partial) then
        set rsync_opts=($rsync_opts --partial-dir=$server_partial)
    endif
    
    # do delta backups
    if ($use_delta) then
        set latest=(`ssh ${remote_server} ls $backup_backups | tail -1`)
    
        # get latest
        set delta_dir="$backup_backups/$latest"
    
        if ($#latest > 0) then
            set rsync_opts=($rsync_opts --link-dest=${remote_server}:$delta_dir)
        endif
    endif
    
    while (1)
        # get list of everything to backup
        # set this to whatever you need
        cd /local_top_directory
        set transfer_list=(.)
    
        # use whatever format you'd like
        set date=`date +%Y%m%d_%H%M%S`
    
        set server_tmp=${remote_server}:$backup_top/tmp
        set server_final=${remote_server}:$backup_backups/$date
    
        if ($use_tmp) then
            set server_transfer=$server_tmp
        else
            set server_transfer=$server_final
        endif
    
        # do the transfer
        rsync $rsync_opts $transfer_list $server_transfer
        set code=$status
    
        # run was clean
        if ($code == 0) then
            # atomically install backup
            if ($use_tmp) then
                ssh ${remote_server} mv $backup_top/tmp $backup_backups/$date
            endif
            break
        endif
    
        # partial -- some error
        if ($code == 23) then
            continue
        endif
    
        # partial -- some files disappeared
        if ($code == 24) then
            continue
        endif
    
        echo "fatal error ..."
        exit(1)
    end
    
    • 5
  3. Karol Nowak
    2015-12-08T11:25:45+08:002015-12-08T11:25:45+08:00

    不确定这是否会对您有所帮助,但是...

    如果您不介意每次都复制整个数据集并且可以使用符号链接来引用目标目录,那么您应该能够将所有内容同步到一个临时目录中,然后交换(rename())新旧以原子方式进行符号链接,如下所示:

    % mkdir old_data new_data
    % ln -s old_data current
    % ln -s new_data new
    % strace mv -T new current
    

    运行

    rename("new", "current") = 0

    并给出

    current -> new_data
    

    即使要使其正常工作,任何尝试从此设置中读取的客户端都应该cd在尝试任何读取之前进入符号链接引用的目录,否则他们可能会从旧副本和新副本中加载代码/数据的某些部分。

    • 2
  4. sam_pan_mariusz
    2015-12-08T11:52:43+08:002015-12-08T11:52:43+08:00

    镜像同步是自动的(cron任务或类似任务)吗?如果是这样,您可能为此使用了专门的操作系统用户,对吗?所以解决方案可能是,而不是简单地复制:

    1. 设置目标目录权限,以便只有rsync能够访问它。
    2. 继续同步。
    3. 更改目标的权限(无条件),以便其他人可以再次访问它。

    缺点是在同步过程中(不确定需要多长时间)目标目录将无法访问。你需要自己决定这里是否可以。

    • 1

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve