rsync
rsync
纯通过rsync的命令,来实现,数据目录A 拷贝到数据目录B
也就是模拟cp的用法 很简单
rsync [选项] 源数据 目的数据 1.安装 yum install rsync -y 2.命令语法,分几个模式 - 本地模式 rsync 参数 源路径 目标路径 rsync -avzP /var/log /tmp 参数解释 -v 详细模式输出 -a 归档模式,递归的方式传输文件,并保持文件的属性,等同于 -rlptgoD -r 递归拷贝目录 -l 保留软链接 -p 保留原有权限 -t 保留原有时间(修改) -g 保留属组权限 -o 保留属主权限 -D 等于--devices --specials 表示支持b,c,s,p类型的文件 -R 保留相对路径 -H 保留硬链接 -A 保留ACL策略 -e 指定要执行的远程shell命令 -E 保留可执行权限 -X 保留扩展属性信息 a属性 比较常用的组合参数 rsync -avzP -a 保持文件原有属性 -v 显示传输细节情况 -z 对传输数据压缩传输 -P 显示文件传输的进度信息 你在命令行里,执行命令,喜欢看到命令的执行过程 rsync -avzP 脚本里面不需要看到详细过程 rsync -az - 远程模式需要两边的机器都安装rsync - 远程模式,推送方式,把自己的数据推送到另一台机器上(上传) 语法1 ,rsync默认走ssh协议 rsync 参数 源路径 user@ip:目标路径 rsync -avzP /var/log/ root@10.0.0.31:/tmp/ 语法2 rsync 参数 源路径 user@ip::目标路径 - 远程模式,拉取方式,拉取别人机器的数据到自己的机器上(下载) rsync 参数 user@ip:源路径 目标路径 rsync 参数 user@ip::源路径目标路径 rsync -avzP root@10.0.0.31:/var/log/ /tmp/
限速
拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多 --bwlimit=10 先生成一个5G文件 dd bs=100M count=50 if=/dev/zero of=/var/log/my_self.log rsync -avzP /var/log/my_self.log /opt iotop查看磁盘的读写IO情况 限制单个大文件的传输,速度只给他20M每秒 [root@rsync-41 ~]#rsync -avzP --bwlimit=20 /var/log/my_self.log /opt sending incremental file list my_self.log 393,117,696 7% 20.14MB/s 0:03:55
对目录同步(注意语法的区别)
拷贝后的数据,携带该目录本身 [root@rsync-41 ~]#rsync -avzP /var/log /opt 不拷贝该目录本身,拷贝目录下的数据 [root@rsync-41 ~]#rsync -avzP /var/log/ /opt
测试文件夹的增量拷贝
[root@rsync-41 ~]#rsync -avzP /test1/ /test2 sending incremental file list sent 118 bytes received 12 bytes 260.00 bytes/sec total size is 0 speedup is 0.00 [root@rsync-41 ~]# [root@rsync-41 ~]# [root@rsync-41 ~]# [root@rsync-41 ~]#echo "123" >/test1/1.png [root@rsync-41 ~]# [root@rsync-41 ~]#rsync -avzP /test1/ /test2 sending incremental file list 1.png 4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) sent 175 bytes received 35 bytes 420.00 bytes/sec total size is 4 speedup is 0.02
无差异化拷贝
使用--delete参数 将目标目录的数据清空,保证完全和源目录的数据一致 rsync -azvP --delete /test1/ /test2/ [root@rsync-41 /test2]#rsync -azvP --delete /test1/ /test2/ sending incremental file list deleting 行者孙.png ./ 白龙马.png 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/12) sent 269 bytes received 55 bytes 648.00 bytes/sec total size is 4 speedup is 0.01 [root@rsync-41 /test2]# [root@rsync-41 /test2]# [root@rsync-41 /test2]#ls /test1/ 1.png 2.png 3.png 4.png 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5 白龙马.png [root@rsync-41 /test2]#ls /test2 1.png 2.png 3.png 4.png 5.png 孙悟空1 孙悟空2 孙悟空3 孙悟空4 孙悟空5 白龙马.png # rsync拷贝文件夹,携带目录本身 # 把test1目录本身,连带着数据,都拷贝到test2下 rsync -avzP /test1 /test2/ 最终会生成 /test2/test1/ 该文件夹的数据,和源数据目录 /test1是一样的
Rsync服务模式
服务端配置
为什么需要服务模式?
Rsync 借助 SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全) /etc/passwd
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式: rsync 自身非常重要的功能(不使用系统用户,更加安全)1.安装rsync
yum install rsync -y
2.修改配置文件
cat > /etc/rsyncd.conf << 'EOF' uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync secrets file = /etc/rsync.passwd log file = /var/log/rsyncd.log ##################################### [backup] comment = chunjueH about rsync path = /backup [data] comment = this is secord backup dir,to website data.. path = /data EOF
3.创建用户以及数据目录
根据你的配置文件中定义的信息,创建对应的用户,备份的目录 该无法登录的用户,只是用于运行进程的账户 useradd -u 1000 -M -s /sbin/nologin www 创建配置文件中定义的2个备份目录 mkdir -p /data/ /backup 修改备份目录的权限 [root@rsync-41 ~]#chown -R www:www /data/ [root@rsync-41 ~]#chown -R www:www /backup/ [root@rsync-41 ~]#ll -d /data /backup/ drwxr-xr-x 2 www www 6 Apr 20 11:34 /backup/ drwxr-xr-x 2 www www 6 Apr 20 11:34 /data
4.创建rsync专用的账户密码(这一步很重要,有错基本也是来这排查)
1.创建密码文件,写入账户和密码,用于和客户端连接时候的认证 vim /etc/rsync.passwd 2.写入账户密码 [root@rsync-41 ~]#cat /etc/rsync.passwd rsync:rsync 3.待会客户端向rsync服务器推送数据,就得用这个账号密码!!!! 4.这一步,非常重要,rsync要求降低密码文件的权限,且必须是600 chmod 600 /etc/rsync.passwd [root@rsync-41 ~]#ll /etc/rsync.passwd -rw------- 1 root root 23 Apr 20 11:36 /etc/rsync.passwd
5.加入开机自启动
systemctl start rsyncd systemctl enable rsyncd 检查是否开机运行 systemctl is-enabled rsyncd
客户端配置
1.安装rsync
yum install rsync -y
2.把客户端的数据,发送给服务端的backup备份模块下
把客户端的/tmp/200M.log备份,发送到rsync-41机器上的 backup模块下 方式1(交互式): rsync -avzP /tmp/200M.log 账户@主机名::模块名 # 默认无密码变量,也无密码文件,需要你自己输入该rsync虚拟用户的密码 # 需要交互式的输入密码,无法再脚本中使用rsync同步命令 # rsync基本都是和脚本结合使用 rsync -avzP /tmp/200M.log rsync@rsync-41::backup 方式2(非交互式): 生成密码文件,每次连接都指定这个密码文件(在客户端生成) echo 'rsync' > /etc/my_rsync.pwd 还必须降低密码文件的权限才行,必须是600 chmod 600 /etc/my_rsync.pwd 此时可以传输数据了,往data模块下传输 rsync -avzP --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync@rsync-41::data 如果是脚本中的话,去掉vP显示过程的参数去掉 rsync -az --password-file=/etc/my_rsync.pwd /tmp/200M.log rsync@rsync-41::data 方式3(非交互式): 生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的值,是配置文件中的密码即可 export RSYNC_PASSWORD='rsync' 如果需要输入密码呢? 撤销这个密码变量 unset RSYNC_PASSWORD 或者重新登录,只要密码变量失效,就必须得输入密码了,或者使用密码文件 rsync -avzP /tmp/200M.log rsync@rsync-41::backup