在Linux的日常操作管理中,我们常常会用到同步的功能,文件同步,目录同步,说白了其实就是复制。但是对于我们的CP命令来说,目标是个非常大的文件的话CP命令将会相当占用资源,此时我向大家推荐rsync命令,此命令与cp的不同之处在于,当一个较大文件放生了微小的变化时,rsync只会将变化的那部分数据给同步过去,并不像cp那样把整个文件都复制过去。这样就大大节省了资源。
一、rsync的特点
特点:
1、可以镜像保存整个目录树或文件系统;
2、较高的数据传输效率;
3、可以借助于ssh实现安全数据传输;
4、支持匿名传输;
rsync命令的工作模式:
第一种模式:shell模式,也称作本地模式;
第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;
第三种模式:列表模式,仅列出源中的内容,-nv
第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求;
二、rsync命令的用法
rsync命令的选项:
-n: 同步测试,不执行真正的同步过程;
-v: 详细输出模式
-q: 静默模式
-c: checksum,开启校验功能
-r: 递归复制
-a: 归档,保留文件的原有属性;
-p: 保留文件的权限;
-t: 保留文件的时间戳;
-l: 保留符号链接
-g: 保留属组
-o: 保留属主
-D:保留设备文件
-e ssh: 使用ssh作为传输承载;
-z: 压缩后传输;
--progress: 显示进度条
--stats: 显示如何执行压缩和传输
【示例1】
三、配置rsync工作在服务模式下
1、设定rsync服务器端
yum -y install xinetd chkconfig rsync on
2、为rsync提供配置文件
vim /etc/rsyncd.conf uid = nobody gid = nobody use chroot = no max connections = 10 strict modes = yes pid file = /var/run/rsyncd.pid pid文件存放处 log file = /var/log/rsyncd.log log文件存放处 [tools] path = /data 服务默认路径 ignore errors = yes read only = no write only = no hosts allow = 172.16.0.0/16 允许此网段的访问 hosts deny = * list = false uid = root 以root身份访问 gid = root 以root组访问
3、启动服务
service xinetd start
监听于873/tcp
注:若要开启rsync服务,首先要修改配置文件/etc/xinetd.d/rsync,把里边的disable = yes 改为disable = no
配置成rsync服务器后的推送与拉取命令
拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
【示例2】把本机的/tmp目录推送给 服务器
rsync -a /tmp 172.16.249.29::tools
四、配置rsync服务端启用用户认证的功能
在/etc/rsyncd.conf文件中添加如下两行
创建密码文件/etc/rsyncd.passwd
vim /etc/rsyncd.passwd tom:jsh 创建用户为tom,密码为jsh chmod 600 /etc/rsyncd.passwd
注:此文件不能允许其它用户有访问权限,且密码不能超过8个字
这样用户在下次推送或者拉取时就需要输入用户名和密码
五、安装inotify-tools实时触发rsync进行同步
1、查看服务器内核是否支持inotify
2、 安装inotify-tools
cd inotify-tools-3.14 解压 cd inotify-tools-3.14 ./configure --prefix=/usr/local/inotify 配置 make && make install 编译安装
3、设置系统环境变量,添加软连接
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh source /etc/profile.d/inotify.sh 使设置立即生效 echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf ln -s /usr/local/inotify/include /usr/include/inotify
4、修改inotify默认参数(inotify默认内核参数值太小)
修改参数:
sysctl -w fs.inotify.max_queued_events="99999999" sysctl -w fs.inotify.max_user_watches="99999999" sysctl -w fs.inotify.max_user_instances="65535" vi /etc/sysctl.conf #添加以下代码 fs.inotify.max_queued_events=99999999 fs.inotify.max_user_watches=99999999 fs.inotify.max_user_instances=65535
参数说明:
max_queued_events:
inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
max_user_watches:
要同步的文件包含多少目录,必须保证max_user_watches值大于统计结果
max_user_instances:
每个用户创建inotify实例最大值
5、创建脚本,实时触发rsync进行同步
vim /usr/local/inotify/rsync.sh #!/bin/bash srcdir=/data dstdir=/tmp rsyncuser=tom rsyncpassdir=/etc/rsyncd.passwd dstip="172.16.249.29" for ip in $dstip do rsync -a --progress $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir done /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srcdir | while read file do for ip in $dstip do rsync -a --progress $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1 done done chmod +x /usr/local/inotify/rsync.sh
6、设置脚本开机自动执行
vim /etc/rc.d/rc.local 编辑,在最后添加一行 bash /usr/local/inotify/rsync.sh & 设置开机自动在后台运行脚本
好了,这就完成了。接下来就是测试了!!!