本文描述了linux下使用rsync单向同步两个机器目录的问题。 使用rsync同步后可以保持目录的一致性(含删除操作)。

数据同步方式

从主机拉数据

备机上启动的流程

同步命令:

rsync -avzP --delete root@{remoteHost}:{remoteDir} {localDir}

参数说明:

-a 参数,相当于-rlptgoD(-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件);
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息;

示例:

rsync -avzP --delete root@192.168.1.100:/tmp/rtest1 /tmp/

向备机推数据

主机上启动的流程

同步命令:

rsync -avzP --delete {localDir} root@{remoteHost}:{remoteDir}

示例:

rsync -avzP --delete /tmp/rtest1 root@192.168.1.101:/tmp/

自动同步配置

描述同步时不输入密码的配置的方法。

使用ssh key

该方法可以直接使用rsync命令进行同步,同步过程中无需输入密码。

  • 在主机上产生ssh key :

    ssh-keygen -t rsa

  • 在备机上加入pubkey

    ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.101

    或者手动添加:

    在主机上执行以下命令获取pubkey:

    cat ~/.ssh/id_rsa.pub

    在备机上加入key内容:

    vi ~/.ssh/authorized_keys

使用pexpect自动输入密码

示例代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*- import pexpect
import time
import traceback def doRsync(user,passwd,ip,srcDir,dstDir,timeout=3600):
cmd = "rsync -azPq --delete {srcDir} {rUser}@{rHost}:{dstDir}".format(
rUser = user,rHost=ip,srcDir=srcDir,dstDir=dstDir
)
try:
ssh = pexpect.spawn(cmd,timeout=timeout)
print cmd
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.read()
ssh.close()
except :
#print traceback.format_exc()
pass if __name__ == '__main__':
doRsync("root","","192.168.1.101","/tmp/rtest1","/tmp")

上面是使用python实现的代码,大家可根据情况用其它语言实现该功能。

其它

1、rsync在执行过程中被kill掉会怎么样;

http://unix.stackexchange.com/questions/5959/how-can-i-pause-resume-rsync

It is safe to kill an rsync process and run the whole thing again; it will continue where it left off. It may be a little inefficient, particularly if you haven't passed --partial (included in -P), because rsync will check all files again and process the file it was interrupted on from scratch.

rsync被kill掉是安全的,下次启动时还可以正常工作。

2、rsync不能指定时间段;

1)该问题可以通过kill来解决
2)或者使用pexpect的timeout参数来控制
3)可以先通过find查找过滤出文件夹的名字,然后使用rsync进行同步 这个可以根据现有业务的特征进行,比如:

find /tmp -name '*' -newermt '2016-03-08' ! -newermt '2016-03-20'

3、rsync在写文件过程中同步(比如录音过程中执行rsync操作)

经测试,rsync会同步部分文件内容,文件写入完成后再执行rsync会保持文件的一致

4、当文件数量达到百万级以上时,rsync同步时扫描改变的文件非常耗时

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2016/20160818_使用rsync同步目录.md

欢迎补充

使用rsync同步目录的更多相关文章

  1. rsync同步目录及同步文件

    最简单的只读同步工作. 一,服务端的配置 1,安装rsync(阿里云默认已有此程序) 略 2,生成文件rsyncd.conf,内容如下: #secrets file = /etc/rsyncd.sec ...

  2. rsync同步目录

    -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) -r, --recursive recurse into directories - ...

  3. [CentOS] rsync同步目录进行备份文件

    操作不难,网上一堆.这里列几个 CentOS7 参考地址: https://www.server-world.info/en/note?os=CentOS_7&p=rsync Copy fil ...

  4. 运维工作中常用到的几个rsync同步命令

    作为一个运维工程师,经常可能会面对几十台.几百台甚至上千台服务器,除了批量操作外,环境同步.数据同步也是必不可少的技能.说到“同步”,不得不提的利器就是rsync. 下面结合本人近几年运维工作中对这一 ...

  5. rsync+inotify 实现资源服务器的同步目录下的文件变化时,备份服务器的同步目录更新,以资源服务器为准,去同步其他客户端

    测试环境: 资源服务器(主服务器):192.168.200.95 备份服务器(客户端):192.168.200.89 同步目录:/etc/test 同步时使用的用户名hadoop密码12345 实验目 ...

  6. Linux使用rsync客户端与服务端同步目录进行备份

    一.服务端设置 1. 修改 server 端配置 # vi /etc/rsyncd.conf 修改: uid = nobody # 该选项指定当该模块传输文件时守护进程应该具有的uid.默认值为&qu ...

  7. rsync实现目录同步

    rsync rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 外文名 rsync 全     ...

  8. 使用rsync, 向另外一台服务器同步目录和文件的脚本

    #!/bin/bash #亚特兰蒂斯-同步目录#定时任务ini_file="/usr/local/sunlight/conf/rsync-file.ini"target_ip=&q ...

  9. puppet使用rsync模块同步目录和文件

    puppet使用rsync模块同步目录和文件 2013-09-23 14:28:57 分类: LINUX 环境说明: OS :    CentOS5.4                         ...

随机推荐

  1. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  2. atitit 商业项目常用模块技术知识点 v3 qc29

    atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...

  3. 修改linux的hosts 后提示“无效的参数”

    碰到个问题,修改linux的主机名问题. vim /etc/hosts 192.168.154.129 129192.168.154.132 132192.168.154.133 133 本地ip是1 ...

  4. 微信JSAPI支付

    最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下: 1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api ...

  5. PHP 高级编程(4/5) - SPL异常类之 LogicException 逻辑异常

    SPL 提供了一系列标准异常.日常的使用中我们应该根据需求科学的使用它们,来使我们的程序更加健壮.LogicException 是从 Exception 基类派生的,没有添加任何附加方法.抛出逻辑异常 ...

  6. Notes:SVG(4)基于stroke-dasharray和stroke-dashoffset圆形进度条

    stroke-dasharray:定义描边的虚线长度,如果提供奇数个,则会自动复制该值成偶数 stroke-dashoffset:定义虚线描边的偏移量(在路径开始的前面,看不到) 实现如下所示 svg ...

  7. 探寻 JavaScript 逻辑运算符(与、或)的真谛

    十二月已经过半,冬季是一个美妙的季节,寒冷的空气逼得人们不得不躲在安逸舒适的环境里生活.冬季会给人一种安静祥和的氛围,让人沉浸在其中,仿佛是一个旧的阶段的结束,同时也是一个新的阶段的开始.这么说来,西 ...

  8. 微信JS-SDK坐标位置转换为百度地图坐标

    微信JS-SDK开发过程中,使用getLocation获取坐标位置,如何将微信获取的坐标直接应用到百度地图中,显示以下效果: 说明:红色图标是从微信转换过来的位置,蓝色图标是周边位置.首先从微信开发流 ...

  9. 图解使用VS的安装项目打包程序

    背景 这段时间一直在做客户端程序的打包程序,遇到各种坑.因为以前没有任何这方面的经验,历经各种折腾,费尽九牛二虎之力总算是完成了. 虽然没有太多技术含量,但是因为挺繁琐的,所以还是在此记录一下. 由于 ...

  10. 执行插入语句,object val = cmd.ExecuteScalar() val = null

    在写接口的过程中遇到错误:空对象不能转换为值类型 因为我们使用的是petapoco,经过调试后发现是 object val = cmd.ExecuteScalar() 这一句造成的报错, val = ...