线上服务挂掉了出core是常有的事,有时候怕影响服务器的IO就选择将core拷贝到自己的开发机 之后,再进行gdb,拷贝的时候用scp –l进行限速。前些时就做了一件特别傻的事,线上的core 是30GB大小,然后用命令scp –l 80000限速10M远程拷贝(注意:80000kbit/s=10M/s),结果拷 贝到本地一看发现core变成了60GB,足足浪费了我近两个小时,当时拷贝的过程中也没闲着,听 音乐、刷微博呗^_^。
对于一个流量很大的网站,后端的服务器可能有成百上千台,当某个词典需要更新时,我们就需 要写个脚本将更新后的词典分发到各个服务器上,可能只是添加了一个新词,但要想生效,也得 一个一个scp过去。这种场景下,也非常适合用rsync,而非scp。
常用的scp形式为:
scp -rC xxxx.com:/home/sth ./
常用的rsync形式为:
rsync -avrzPS xxxx.com:/home/sth ./
接下来说说rsync的优势吧,只说重点,要知道scp的manpage就100多行,而rsync的manpage有 2500多行解释呢。
首先rsync本身通过delta-transfer算法,做到了节俭,即只传输不一样的部分,而scp就是全 部拷贝然后覆盖。因为这个特点,它非常适合做数据的日常镜像备份。
du -sh xxx.data
命令得到的是文件占用磁盘大小,而ll xxx.data
是文件的实际大小,这 两个大小之所以不一样,是因为Linux做了存储优化,比如ftruncate
一个文件到10GB,但不 往里面写内容,那么Linux就只是记录文件大小为10GB,但并不真正开辟磁盘空间,真正要用到 的时候才会开辟。而scp在做拷贝时就不会管这些,直接按照文件大小拷贝,而使用rsync -S
就可以避免出现像上面说的那样,30GB的core拷贝一下就成了60GB,即费带宽,又费磁盘。
当没有拷贝的目的参数时,会显示出路径中的文件列表,即rsync xxxx.com:/home/user/
相当 于ssh xxx.com 'cd /home/user/ && ls -l'
默认rsync跟scp一样是通过ssh通道进行文件传输,但有时候,机器不是属于你的,你没有权限 安装sshd守护进程,这时rsync还可以通过自有协议,以一个daemon形式运行,指定监听端口 来进行文件传输,注意咯,获取daemon形式的帮助应使用命令rsync --daemon --help
。一旦 涉及到搭建一个服务,那么配置项就很多啦,可以使用man 5 rsyncd.conf
来了解如何编写配置 文件。用rsync搭建一个类似于ftp的服务,最简单的配置文件rsyncd.conf如下:
uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /tmp/rsyncd.pid
lock file = /tmp/rsyncd.lock
log file = /tmp/rsyncd.log
[ftp]
path = /tmp
comment = ftp export area
其实就是将本机的tmp目录开放访问了,因为uid为nobody,跟ftp的anonymous一个意思,无需用 户名密码就可以访问。启动服务的命令如下:
rsync --daemon --address=127.0.0.1 --config=/tmp/rsyncd.conf --port=8080 --bwlimit=8000
其中bwlimit设置了传输带宽限制。客户端使用如下命令来查询可访问目录:
rsync rsync://xxxx.com:8080
使用如下命令来获取文件:
rsync rsync://xxxx.com:8080/ftp/xxxx.txt ./
注意,这里的路径已经被虚拟过了,也就是ftp被映射为了/tmp目录。
最常用的命令形式为rsync -avzr xxx.com:~/tobak ./
,参数中a表示打包传输,v表示打印 详细信息到屏幕,z表示压缩传输,r表示递归,跟scp -r
中的r是一个意思。特别要注意的是 路径后面的反斜杠,刚才的命令跟rsync -avzr xxx.com:~/tobak/ ./
尽管只有一个反斜杠的 差别,却可能引起灾难性的后果,前者表示tobak这个目录同步到本地,而后者表示tobak/里的 文件同步到本地,简单地说,前者会在本地创建一个tobak目录,而后者不会。有点像windows 上的rar工具,是解压到tobak文件夹,还是解压到当前文件夹。
rsync支持--exclude=PATTERN
和--include=PATTERN
两个参数,这跟tar支持的--exclude和 --include意思一样,就是通过正则来排除或者额外包含一些文件或者目录,比如我们在同步一个 服务程序到另一台机器时,我们并不希望将日志文件也同步过去。而scp是不支持这两个参数的, rsync在灵活性方面也完全优于scp。
对于拷贝时的链接的解析方式rsync也有非常多的控制参数,当你遇到麻烦时这个有时候还挺 有用的,--links
表示连结在拷贝后重新创建好,--copy-links
表示解析链接为目标对象, --copy-unsafe-links
表示在解析链接时,对于指向目录树外的也解析为目标对象, --safe-links
就只处理指向树内的目标对象的链接,--copy-dirlinks
和--keep-dirlinks
控制了对文件夹符号链接的处理方式。
rsync还可以用来做本地拷贝用,按如下命令,可以考虑目录结果,而不用提前使用mkdir -p来创建好目录:
rsync -R ./xxx/xxx/xxx.txt ./output/
特别注意:
当默认端口不是22时,需要使用-e参数来手动指定建立ssh的方式:
rsync -e 'ssh -p8822' src_file xxx@yyy.com:/home/