一、Rsync
Rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据镜像同步备份的优秀工具。rsync适用于unix/linux/windows等多种操作系统平台。
http://www.samba.org/ftp/rsync/rsync.html
Rsync全称为remote rynchronization,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于scp命令,但优于scp。还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这类似于cp命令,同样也优于cp命令。
rsync还可以实现类似rm的删除功能
rsync的特性
支持拷贝特殊文件如链接,设备等
可以有排除揸定文件或目录同步的功能,相当于打包命令tar的排除功能
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高。
可使用rcp,rsh,ssh等方式来配合传输文件
可以通过socket(进程方式)传输文件和数据
支持匿名的或认证(无需系统用户)的进程模式传输,可实现主主便安装的进行数据备份及镜像
二、Rsync命令同步参数选项
rsync [OPTION…] SRC… [DEST]
常用参数选项说明:
-v --verbose详细模式输出,传输时的进度等信息
-z --compress 传输时进行压缩以提高传输效率
-r --recursive 对子目录以递归模式
-t --time 保持文件时间信息
-o --owner 保持文件属主信息
-p --perms 保持文件权限
-g --group 保持文件属组信息
-P --progress 显示同步过程及传输时的进度等信息
-a --archive 归档模式,等于-rtopgDl
-D --devices 保持设备文件信息
-l --links保留软链接
-e --rsh=COMMAND 使用的信协议,如ssh
--exclude=PATTERN 指定排除不需要传输的文件模式
三、rsync大致使用三种主要的传输数据的方式:
主机本地间的数据传输(此类似于cp命令的功能)
借助rcp,ssh等通道来传输数据(此类似于scp命令的功能)
以守护进程(socket)的方式传输数据(这个是rsync的重要的功能)
- 本地数据传输模式(local-only mode)
语法:rsync [OPTION…] SRC… [DEST]
1) rsync为同步的命令
2) [OPTION..]为同步时的参数选项
3) SRC为源目录、分区或文件
4) [DEST]为目的分区、文件或目录等
实例1:把系统的hosts文件同步到/opt目录
[root@58server1 ~]# rsync /etc/hosts /opt
实例2:把opt目录拷贝到/mnt下
[root@58server1 ~]# rsync -avz /opt /mnt/
提示:在上面例子中,/opt/和/opt 仅差一个/意义就不大相同,/opt/把/opt/目录里面的内容同步,opt目录本身并不同步,而后者/opt 表示把opt目录本身及里面的内容全都同步到/tmp下
- 通过远程shell进行数据传输(remote shell mode)
通过远程shell (rcp、ssh等)传输可以分为两种情况,其语法分别为
拉取 pull: rsync [OPTION…] [USER@]HOST:SRC… [DEST]
推送 push: rsync [OPTION…] SRC… [USER@]HOST:DEST
1) Rsync为同步的命令
2) [OPTION..]为同步时的参数选项
3) [USER@]HOST为Rsync同步的远程连接用户和主机地址
4) SRC为源分区、文件或目录等,和HOST之间用一个冒号连接
5) [DEST]为目的分区、文件或目录等
其中拉取表示同远端主机把数据同步到执行命令的本地主机相应目录;推送表示从本地主机执行命令把本地的数据同步到远端主机指定目录下。
拉取实例:
rsync -avzP -e "ssh -p22" root@192.168.1.111:/opt /tmp
推送实例:
rsync -avzP /tmp -e "ssh -p22" root@192.168.1.111:/opt
语法说明:
1)-vzrtopg 相当于上文伯-avz 表示同步时文件和目录属性不变
2)--progress显示同步的过程,可以用-P替换
3)-e “ssh -p 22” 表示通过ssh的通道传输数据
4)root@192.168.1.111:/opt 是远程的主机用户,地址和路径
5)/tmp 本地的路径
配置ssh key密钥实现数据免登陆验证
[root@64server1 .ssh]# ssh-keygen -t dsa
[root@64server1 .ssh]# ssh-copy-id -i id_dsa.pub 192.168.1.111
#!/bin/sh
. /etc/init.d/functions
file="$1"
remote_dir="$2"
if [ $# -ne 2 ];then
echo "usage:$0 argv1 argv2"
echo "must have two argvs."
exit
fi
for ip in $(cat /home/scripts/iplist.txt)
do
# scp -P22 -r -p $file root@$ip:~ >/dev/null 2>&1 &&\
#ssh -p22 -t root@$ip sudo rsync ~/$file $remote_dir >/dev/null 2>&1
rsync -avzP $1 -e "ssh -p 22" root@$ip:$2 >/dev/null 2>&1
if [ $? -eq 0 ];then
action "$ip is successful." /bin/true
else
action "$ip is failure." /bin/false
fi
done