rsync用于数据迁移/备份的几个细节
上周我们的一个GitLab服务频繁出现web页面卡死问题,得重启虚拟机才可恢复,但重启之后没多久又会卡死。后来发现是虚拟机的磁盘大小超过了2T,而虚拟机管理那层的文件系统是ext3,最大单文件只能支持到2T(也不知道当初这个3T的虚拟磁盘镜像是怎么建立起来的,难道Xen不会给出警告?)。由于该机房没有可调动的磁盘了,于是只能另外找机房重新搭建一个环境,将数据迁过去。
只同步指定的子目录
场景:
0) 要迁移的是gitlab里面的git库数据
- 要迁移的数据很多(大约2T),由于跨机房网络速度一般,我们期望先迁移部分重点用户的,但fork出来的git库是在不同的子目录下的(比如
ssmp/ssmp.git
会有zhangsan/ssmp.git
,lisi/ssmp.git
),这些都得一并迁移过去。
首先,像下面这样直接将ssmp, zhangsan, lisi
三个目录全拷贝过去,肯定是不行的
rsync -a ssmp/ssmp.git zhangsan/ssmp.git lisi/ssmp git@new-repo:/home/git/repositories
因为不仅原来的目录结构丢了,三个ssmp.git还混到一起了。
解决方法是用rsync的 filter 特性
rsync -a --delete --filter="merge /tmp/gitlabFilter" repositories/ git@new-repo:/home/git/repositories/
但写这个filter内容的写法跟我们原来在tar
那里习惯了的目录排除不一样,比如上面的场景写成下面这样是不能工作的:
+ ssmp/ssmp.git
+ zhangsan/ssmp.git
+ lisi/ssmp.git
- *
这是因为最后那个- *
就已经把顶层的ssmp, zhangsan, lisi
这几个目录排除掉了,于是ssmp
下面的子目录是没法加进来的。
对于这个问题,rsync的man page说得很清楚(只不过我看见大段的英文就有些晕头),需要写成下面这样:
+ ssmp/
- ssmp/*
+ ssmp/ssmp.git
+ zhangsan/
- zhangsan/*
+ zhangsan/ssmp.git
+ lisi/
- lisi/*
+ lisis/smp.git
- *
这里还有一个详细的描述: Rsync backups: excluding directories
linux的磁盘cache导致拷贝速度逐渐下降
用rsync拷贝数据过程中发现一个现象:开始拷贝的时候速度很快,每秒有40MB左右,但拷贝几十分钟之后就降到10MB左右了,两边机器都没有跑什么应用,网络用netcat测也没有问题…
然后我观察到的一个问题是两边的free
命令都显示出内存占用很高,并且是buffered/cache
一栏很高,因为这个缓存是可以手工释放的,就抱着试试看的想法试了一下:
sync; echo 3 > /proc/sys/vm/drop_caches
ssh root@new-repos 'sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"'
没想到速度马上恢复了!
于是我改了脚本,每次调用一次rsync同步完一个git库及其fork,就调上面的语句将cache清掉,速度基本上不受影响。
补充说明
- linux操作系统会将文件系统的内容缓存起来,以便后面用到时加速,但在数据迁移场景下,基本上没有“后面用到时”这个场景,这个缓存反而碍事(TODO: 为什么导致网络io下降)
- 对于本机内大量拷贝文件,有人提供了一个
nocache
命令(https://github.com/Feh/nocache Debian/Ubuntu已经收录了这个工具 https://packages.debian.org/search?keywords=nocache )。它的功能是临时禁用cache,用法是将要执行的命令用nocache
包住,比如:nocache cp -a ~/ /mnt/backup/home-$(hostname)
,但rsync会使用网络通讯,所以nocache rsync
对远端没有作用( *Note however, that rsync uses sockets, so if you try a nocache rsync, only the local process will be intercepted.) - 也有人在多年以前给rsync提交了一个补丁(https://bugzilla.samba.org/show_bug.cgi?id=9560 ),增加了
--drop-cache
选项,但遗憾的是没被接纳,说是过于linux-specific,开发人员的意见(见comment 3 )是改用nocache
:nocache rsync -aiv --rsync-path='nocache rsync' some-host:/src/ /dest/
. P.S. nocache工具的主页最后在acknowledgements部分 说,其实它是衍生自rsync的这个补丁的。
参考资料:
- kernel - Can I copy large files faster without using the file cache? - Ask
- linux - How can I limit the cache used by copying so there is still memory
已经备份过的文件不再重复拷贝(从旧备份硬链接未修改过的文件)
场景:要求每天建立一个备份。因为数据量很大,所以从备份速度、空间占用上来说,期望重复文件就不要重复拷贝了
第一个版本是这样的:
rm -rf backup.2
mv backup.1 backup.2
cp -al backup.0 backup.1
rsync -a -l --delete source_dir backup.0
在上面的脚本中,多个备份之间的硬链接是依靠cp -a -l
来建立的,而新增的文件依靠rsync -a -l
也可以尽量硬链接已有的文件。
但这个脚本有点问题: 如果文件内容没变,只是文件属性(属主、修改时间、权限)发生变化的话,rsync不会重新拷贝文件,而是直接修改原文件的属性,而由于采用了硬链接,backup.1
和backup.2
等旧备份目录里面的文件属性也发生了变化!
解决这个问题的方法是改为:
rm -rf backup.2
mv backup.1 backup.2
mv backup.0 backup.1
rsync -a --link-dest=backup.1 source_dir backup.0
注意这里的--link-dest=backup.1
,它的含义是:先到backup.1这个目录找找有没有一样的文件,有的话将其硬链接到目标目录(backup.0
),没有的话再拷贝。属性的变化会认为是不同的文件,会生成新拷贝。
如果文件属性的变化对于你的场景没有场景,那么两种方法都可以用,第一种方法还能少一些拷贝文件。
参考资料
- Incremental, Snapshot-based Backup with Rsync and SSH
- Easy Automated Snapshot-Style Backups with Rsync
打包(archive)差异备份文件
场景:比较老的备份打包后转到其它机器(或者磁带机)上,每周一次全量备份,然后每天的增量单独打包
rsync -a --compare-dest=backup.week backup.1 backup.incremental-20150604
cd backup.incremental-20150604
tar zcvf ../backup.incremental-20150604.tar.gz *
--compare-dest
的含义跟上面--link-dest
类似:先到这个参数指定的目录找找有没有想要的文件,如果没有再从源目录拷贝
rsync用于数据迁移/备份的几个细节的更多相关文章
- Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...
- Docker数据卷Volume实现文件共享、数据迁移备份(三)
数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...
- [Sqlite]-->数据迁移备份--从低版本号3.6.2到高版本号3.8.6
引子: 1. Sqlite在Windows.Linux 和 Mac OS X 上的安装过程 2.嵌入式数据库的安装.建库.建表.更新表结构以及数据导入导出等等具体过程记录 个字段IPHONE和LOGI ...
- linux之rsync远程数据同步备份
rsync服务是一种高效的远程数据备份的工具,该服务的port号为873, 是Liunx下的一种非独立服务.由xinetd超级服务管理,取代监听873port. 长处: 1.rsync能够利用ssh和 ...
- rsync实现数据增量备份
环境说明: 主机ip:192.168.0.201 需备份的目录:/opt/mail 备份机器ip:192.168.0.215 1.编辑/etc/rsyncd.conf文件(etc目录不存在的话,需要手 ...
- MongoDB 数据迁移 备份 导入(自用)
MongoDB bin文件夹下 备份:mongodump -h IP:PORT -d 库名 -c 集合名 -o 存储路径 恢复:mongorestore -h IP:PORT -d 库名 -c 集合名 ...
- MySQL大数据迁移备份
MySQL迁移通常使用的有三种方法: 1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入. 2.使用第三方迁移工具. 3.数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL ...
- shell mysql数据迁移/备份
保存为.sh文件,配置运行即可 #!/bin/bash #### change the values below where needed..... #### 多数据库DBNAMES="My ...
- EF Core数据迁移操作
摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...
随机推荐
- P2246 SAC#1 - Hello World(升级版)
P2246 SAC#1 - Hello World(升级版)典型的字符串dpf[i][j]表示a串匹配到i,b串匹配到j的方案数.if(a[i]==b[j])f[i][j]=f[i-1][j-1]+f ...
- 不要再用if(xxx != null)或者try catch NullPointerException了,Optional可以帮你解决
public static void testIfPresent() { Map<String, Map<String, String>> map = new HashMap& ...
- Java开发人员必须掌握的Linux命令(三)
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣)的表达来讲解知识或者技术,让学习之旅充满乐趣,这就是写博 ...
- hihoCoder挑战赛19 A.Rikka with Sequence(状压DP)
题目链接 比赛链接 \(Description\) \(Solution\) 参考:https://www.cnblogs.com/SovietPower/p/9781573.html 暴力:\(f[ ...
- LOJ6070 基因 分块+回文自动机
这个在翁文涛的论文里有讲到 大概的就是一个子串的回文自动机是原串回文自动机的子图 于是每隔$\sqrt n$重新跑一个$(k \times \sqrt n,n)$的回文自动机 记录回文串个数和位置 并 ...
- 如何查看jdk和eclipse是几位的(eclipse快捷键)
查看jdk public class rr{ public static void main(String[] args) {String arch = System.getProperty( ...
- git 分支合并冲突
准备新的feature1分支,继续我们的新分支开发 [root@node1 git]# git checkout -b feature1 D git/LICENSE.txt Switched to a ...
- unity3d 射线的原理,基础用法
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 . Ray射线类和RaycastHit射线投射信息类是射线中常用的两个工具类. 用途:射线多 ...
- ASP.NET 多次点击button后事件执行多次 并发解决 频繁操作解决办法
首先让我们体验一下频繁操作: 1)打开项目,在后台aspx.cs等服务器页面,设置断点. 2)点击页面按钮 3)调试开始进入断点,然后重复点击页面按钮 4)服务器第一次事件已经处理完毕,调试再次进入了 ...
- Alpha通道
Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算 为 ...