V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
cnt2ex
V2EX  ›  程序员

你们在备份数据时会暂停服务以保持数据的一致性吗?

  •  
  •   cnt2ex · 19 小时 33 分钟前 · 1990 次点击

    比如一个自建云盘服务,有大量文件,除此之外还有 mariadb/postgresql 等数据库的各种文件。

    如果在备份时,云盘正好在写入操作。这时候执行自动备份的脚本,很容易出现数据不一致的情况吧。

    我想把云盘的 compose.yml 和所有 volumes 都给备份。这样在恢复时只需要下载所有数据,然后 docker compose up 就能恢复到原有的状态。但是为此必须要保持数据的一致性,每次备份时都得把服务给暂停再备份。但这样感觉当机太久了,特别是当文件数量很多的时候,即使是增量备份也会花上不少时间。

    你们在备份时,会把服务停止之后再进行备份,还是不停止就备份呢?

    13 条回复    2025-08-19 23:50:20 +08:00
    kuanat
        1
    kuanat  
       19 小时 5 分钟前
    我的话一般会停止服务,不过这个行为取决于备份粒度。一般来说我不会把很多服务的数据放在一起备份,而是单独处理。

    从应用或者服务的层面看,大多数写入行为都是非同步的,像数据库一般会设计成 WAL 同步写,主库带缓冲的形式,暂停服务可以降低不一致的“来源”。

    如果备份行为是复制,还要多考虑同一批文件由于备份这个行为的造成的时间差异,这也是不一致(匹配)的来源。如果是在 CoW 系统上,先创建快照,再将快照持久化备份会好一些。

    当然这个事情还是看需求场景,只是一般来说,维护一个高可用系统的备份和恢复机制更麻烦一些,停止备份再恢复相对来说更容易自动化。
    codehz
        2
    codehz  
       18 小时 25 分钟前 via iPhone
    数据库的话,想要不停机备份可以用官方提供的备份工具 Mariabackup 或者 pg_basebackup 这种,直接备份数据盘其实也没啥问题,数据丢失的范围仅限于正在运行的事务,要不然数据库干脆别干了
    ryd994
        3
    ryd994  
       17 小时 18 分钟前 via Android
    换一个思路:停止服务一秒,zfs/btrfs/Windows shadow copy 建一个镜像。然后就可以从镜像备份数据了
    busier
        4
    busier  
       17 小时 7 分钟前 via iPhone
    停机 btrfs 快照,在开机~~~~~
    EyebrowsWhite
        5
    EyebrowsWhite  
       16 小时 13 分钟前 via iPhone
    只有数据库这类的需要确保一致性吧,数据库比如 pg 支持用相关工具不停机备份,然后整体备份的时候忽略原本的数据库文件或者 volume ,只备份导出的文件即可
    2liuqi
        6
    2liuqi  
       15 小时 7 分钟前   ❤️ 1
    关闭服务写权限就好了
    vczyh
        7
    vczyh  
       13 小时 34 分钟前
    我使用 zfs ,docker 的配置文件和服务的数据目录全部放在 zfs 中,备份时作快照
    google2023
        8
    google2023  
       13 小时 30 分钟前
    @ryd994 用 Veeam Backup & Replication ,这些工作它都自动完成了
    ysicing
        9
    ysicing  
       11 小时 36 分钟前
    我个人服务直接用 restic 一梭子备份持久化目录,到目前为止还没遇到过啥问题
    julyclyde
        10
    julyclyde  
       9 小时 38 分钟前
    mariadb 就 mysql 嘛
    那个可以用 percona xtrabackup 来做一致性备份的

    pg 不太了解。应该也有吧
    maocat
        11
    maocat  
       9 小时 27 分钟前 via Android
    想起了上家我领导写的备份脚本,每天凌晨 3 点执行,实际没考虑服务器时区,中午 11 点开始备份,半个月服务都是卡顿的

    还有一次他要还原备份数据,死活发现还原的数据不完整,原来是之前备份和一些日志数据把服务器磁盘干满了,日志是每小时定时清理,备份是保留 7 天的,导致每天都是备份的数据不完全,要去提以前备份的数据结果发现 7 天内的都不完整
    guanyujia5444
        12
    guanyujia5444  
       9 小时 15 分钟前
    这得看备份方式,数据库支持热备份,使用热备份导出一份一致的。或者使用云服务器快照实现。但用文件同步肯定是不行的,数据库文件的文件头都不一致,没办法恢复的。
    mmdsun
        13
    mmdsun  
       1 小时 47 分钟前 via iPhone
    数据库文件不行,正在运行拷过去可能无法启动了。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1368 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:37 · PVG 01:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.