1. rsync 介绍
1.1 rsync 是什么
- rsync 可以用于实现增量的工具, 配合计划任务, rsync 可以实现时间即那个同步, 配合 inotify 或者 sersync 可以实现触发时实时同步.
- rsync可以实现scp 远程拷(rsync 不支持远程到远程的拷贝, scp支持) cp的本地拷贝, rm删除和 ls -l 文件列表等等功能, 但是需要注意, rsync 最终目的是实现两端主机的文件同步, 因此实现 scp/cp/rm 等功能仅仅是同步的辅助手段.
- rsync 的同步算法实现的机制较为复杂.
1.2 rsync 同步基本说明
- rsync 目的是时间本地主机和远侧还给你主机的上的文件同步(包含本地推送到远程, 和远程拉取到本地), 也可以实现本地不同路径下的文件同步, 但不可以实现 远程1 到远程2 之间同步.
- 就同步而言, 涉及到了源文件和目标文件的概念, 涉及了 那边是同步基准,即源端. 以及目的端.
- rsync 文件同步过程有两个模式组成: 1. 决定那些文件需要同步, 2. 文件同步时的同步模式.
- 检查模式是指按照指定规则来检测那些文件需要同步, rsync 默认是采用 quick check 算法快速检查源文件和目标文件的大小, mtime(修改时间) 是否一致. 也可以通过rsync 中指定的某些选项,改变检查模式.
- 同步模式是指文件确定被同步后, 同步过程发生过程之前需要做哪些工作, 如: 是否需要删除源主机上没有但目标主机上的文件, 是否需要先备份目标文件, 是否追踪目标文件等操作.
2. rsync 工作方式
- 下面是rsync 的语法:
Local: rsync [OPTION...] SRC... [DEST]Access via remote shell: pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DESCAccess via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] sync://[USER]@HOST[:PORT]/SRC.. [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
2.2 rsync 的三种工作方式
- 本地文件系统上的同步, 语法使用的是 Local段落内的.
- 本地主机上使用远程Shell 和远程主机通, 语法适用的是 Access via remote shell 段落的格式
- 本地主机通过网络套接字远程主机上的 rsync daemon , 语法使用的是 Access via rsync daemon: 段落.
- 前两者使用的本质上是通过管道通信, 及远程shell , 方式3 是让远程主机上运行 rsync 服务, 监听在一个端口上, 等待客户端的连接
- 存在第四种方式, 通过远程shell 临时启动一个 srync daemon, 不同于方式3 , 不要求远程主机上事前启动rsync, 而是临时派生rsync daemon, 单用途的一次性daemon, 用于临时读取 daemon 配置文件, 当本次rsync 同步完成后, 远程shell 的rsync daemon 进程也会自动消失, 通信方式语法与 Access via rsync daemon 相同, 但是要求 options指定使用 --rsh 选项或者 -e
第一个路径参数为源文件, 可以指定多个源文件, 最后一个为目标文件路径,
-
如果主机和 path 路径之间使用一个冒号(:) 隔开表示使用远程 shell 通信方式
-
如果主机和 path 另使用两个冒号(::) 隔开, 表示使用 rsync daemon 方式.
-
注意: 原路径如果是一个目录的话, 尾部带上斜线
/
和不带上斜线的意义是不一样的, 带上斜线 表示: 备份该目录, 不带上斜线表示: 备份目录内的 文件和目录
2.3 选项和说明
常用选项:
-v: verbose 显示详细信息, 可以使用 -vvvv 显示更加详细信息-P: 显示文件传出的进度信息(-P="=", --partial --progress. 其中 --progress 才是显示进度信息)-n: --diy-run: 仅测试传输, 不实际传输, 常配合 -vvvv 配合使用使用查看 rsync 如何工作-a: --archive: 归档模式, 表示递归传输 并保存文件属性, 等同于 -rtopgDl-r: --recursive: 递归传输目录-t: --times: 保存mtime 信息, 建议任何情况下都保存 -t, 否则会更新 mtime 设置为系统当前时间, 导致下次更新: 检查 mtime 不同, 而增量备份传输无效.-o: --owner: 保持 owner 属主-g: --group: 保持 group 属组-p: --perms 保持 perms 权限-D: --divice --specials 选项组合, 拷贝设备文件和特殊文件-l: --links: 如果 目标文件时软连接, 拷贝时会追溯到链接的对象,-z: 传输时进行压缩提高效率-R: --relative: 使用相对路径, 意味将命令行中执行啊指定全路径非路径尾部的文件发给服务端, 包含属性.--size-only: 默认算法是检查文件大小和mtime 不同的问津, 该选项只检查文件大小.-u: --update: 仅在源 mtime 比目标已存在文件的 mtime新时, 才会进行拷贝-d: --dires: 不进行递归, 仅拷贝目录本身, --max-size: 限制 rsync 传出的最小文件大小, 禁止传输小文件或垃圾文件--exclude: 指定需要传输的文件-b: --backup: 对目标已存在的文件备份, 备份文件会会使用 ~ 作为后缀--backup-dir: 指定给你别分文件保存路径, 不指定默认的带本分文件保存在同一个目录下.-e: 指定使用的远程shell 程序, 默认是 ssh--port: 连接daemon 时 使用的远程端口,默认 873--password-file: daemon 模式的密码文件, 可以读取密码文件非交互模式, 这不是远程 shell 密码文件, 而是 rsync 模块认证的密码.-W --whole-file: rsync 将不再使用 增量传输, 在网路带宽高于 磁盘带宽时, 比增量高效.--existing: 要求 只更新目标端已存在的文件, 和 --existing 结合使用特殊功能, --remove-source-files: 要求删除源端已成功传输的文件.
3. rsync 示例
-
安装 rsync
-
rsync 同步
tmp/rsync_test/a/
目录下的文件备份 到/root/a/
下
- 使用rsync 远程拷贝, 通过账户名密码(秘钥)和主机 拷贝
- 远程拷贝文件并 排除不想拷贝的文件, 删除目标目录下中 在源目录下没有的文件
- 使用
-delete
删除目标目录中 不在源文件的文件
- 增量备份
- a.txt 文件 被更新过, 这里仅备份别修改过的文件 使用
- 备份 和查看
4. rsync daemon 模式
4.1 简介
-
rsync 虽然可以通过远程shell 能实现两端主机上的文件同步, 但是在处理复杂的传输 时较为复杂,
-
rsync daemon 是
rsync --daemon
或者加上其他选项启动, 会读取配置文件, 默认是 /etc/rsyncd.conf 并监听 873 端口, 外部有客户端 对此端口发起请求, 通过这个网络套接字完成连接. -
远程shell 连接时通过管道符完成通信和数据传输, 连接的一端是远程主机, 连接到的目标端, 目标端根据shell 机型 fork 出rsync 进程使其成为 rsync server, 而rsync daemon 事先在 server 端运行好的 rsync 端的连接, 连接建立后所有通信方式都是通过套接字完成.
-
连接命令由两种类型, 一种是rsync 风格是风格使用双冒号的
rsync user@host::src desc
一种是 url 风格rsync://user@host:port/src desc
对于 rsync 风格连接命令, 需要指定端口号, 则使用--port
4.1 daemon 配置文件 rsyncd.conf
默认rsync --daemon
读取的配置文件为 /etc/rsync.conf, 有些版本的可能该文件默认不存在,
### 全局配置参数port = 873 # 指定 rsync 端口uid = rsync # rsync 服务运行的用户, 文件传输成功后属主id为这个uidgid = rsync # rsync 运行的用属组use chrot = no # rsync daemon 传输前是否切换到指定给的 path 目录下max connections = 200 # 指定最大连接数timeout = 300 # rsync 连接的客户端超时时间, 0 表示永远等待motd file = /var/rsyncd/rsync.motc # 客户端连接来显示的消息pid file = /var/run/rsyncd.pid # rsync daemon 的 pid 文件lock file = /var/run/rsync.lock # 指定锁文件log file = /var/run/rsyncd.log # 指定 rsync 的日志文件syslogdont compress = *.gz *.tgz *.zip *.zip *.z *.Z *.rpm *.deb *.bz2 # 指定那些文件不使用压缩#### 指定模块, 并设定模块配置的参数, 可创建多个模块[web] # 模块IDpath = /tmp/web/ # 该模块的路径, 启动 rsync daemon 前该目录必须存在, 该目录就是rsync 访问的路径ignore errors # 忽略某些IO错误read only = false # 指定该目录 是否为只读, false 为读写, true 为只读 不可上传list = false # 客户端请求显示模块是, 该模块是否显示, false 表示影藏hosts allow = 10.0.0.0/24 # 指定允许连接的客户端机器, 可以是网段, 或多个ip,iphost deny = 10.0.0.1/24 # 黑名单, 禁止某个ipauth users = rsync_backup # 指定该模块的用户列表, 只有 列表内指定的用户才能连接到模块, 用户明和密码保存在 serts file 中secrets file = /rsyncd.passwd # 保存 auth user 用户列表的用户和密码, 每行包含一个username:passowd , 由 "secrets modes", 默认 true 需要的文件非 rsync daemon 用户不可读写, 之启用 auth user 该选项有效[date]path = /tmp/data/ read only = falseignors = errorscomment = date directory
- 客户端推送到服务单时, 文件属主, 属组, 是配置文件中指定的uid 和 gid 但是客户端从服务器来去时, 文件属主, 属组都是 客户端操作 rsync 用户身份, 影刺 rsync 程序的用户是当前用户
- auth users 和 secrets 两行不是必要的, 如果没有的话, 默认是使用匿名连接, 如果使用了, 则 secrets file 权限必须是 600 , 客户端密码文件也必须是 600
- secrets file 权限, 实际上除了满足运行你rsync daemon用户可读, 还要检查 strict mode 设置, 如果设置 false 则无需关注文件权限
4.1 daemon 配置和使用
4.1.1 客户端配置
- 添加 rsync 用户,
- 编辑配置文件
[fangfc@node10009 a]$ sudo vim /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: port = 873 uid = rsync gid = rsync use chroot = yes max connections = 200 pid file = /var/run/rsyncd.pid exclude = lost+found/ transfer logging = yes timeout = 900 ignore nonreadable = yes dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 [data] path = /opt/data/ ignore errors list = false read only = false host allow = 192.168.20.0/24 auth users = user1, user2, fangfc secrets file = /etc/rsyncd.passwd
- 创建密码文件
[fangfc@node10009 a]$ sudo vim /etc/rsyncd.passwd user1:123 user2:123 fangfc:123[fangfc@node10009 a]$ sudo chmod 600 /etc/rsyncd.passwd # 设置 密码文件权限
- 创建rsync 模块目录
- 创建目录, 并设置权限
[fangfc@node10009 a]$ sudo mkdir /opt/data[fangfc@node10009 a]$ sudo chown -R rsync:rsync /opt/data/
- 启动rsync daemon
[fangfc@node10009 a]$ sudo rsync --daemon[fangfc@node10009 a]$ ps aux | grep rsyncroot 3732 0.0 0.0 114740 396 ? Ss 14:06 0:00 rsync --daemonfangfc 3734 0.0 0.0 112704 976 pts/0 S+ 14:06 0:00 grep --color=auto rsync[fangfc@node10009 a]$
4.1.2 客户端配置
- 添加rsync用户
[fangfc@node10011 a]$ sudo groupadd -r rsync[fangfc@node10011 a]$ sudo useradd -N -M -G rsync -r -s /sbin/nologin rsync[fangfc@node10011 a]$ id rsyncuid=996(rsync) gid=100(users) groups=100(users),994(rsync)
- 创建密码文件
[fangfc@node10011 a]$ [fangfc@node10011 a]$ sudo vim /etc/rsyncd.passwd 123
- 设置密码文件权限
[fangfc@node10011 a]$ sudo chmod 600 /etc/rsyncd.passwd [fangfc@node10011 a]$
- 设置配置文件
[date]use users = user1
4.2 测试
- 客户端推送到服务端
[fangfc@node10011 a]$ sudo rsync -arv --port=873 --password-file=/etc/rsyncd.passwd /home/fangfc/a/ fangfc@192.168.10.9::data/sending incremental file list./a.txtb.txtnginx/nginx/123.txtnginx/abc.txtnginx/fastcgi.confnginx/fastcgi_paramsnginx/koi-utfnginx/koi-winnginx/mime.typesnginx/nginx.confnginx/scgi_paramsnginx/uwsgi_paramsnginx/win-utfnginx/conf.d/nginx/conf.d/nginx.confnginx/default.d/sent 20,691 bytes received 313 bytes 42,008.00 bytes/sectotal size is 19,608 speedup is 0.93[fangfc@node10011 a]$
- 服务端修改了文件, 客户端拉取更新
[fangfc@node10009 a]$ lsa.txt b.txt nginx[fangfc@node10009 a]$ touch c.txt[fangfc@node10009 a]$ echo "abc" > b.txt [fangfc@node10009 a]$ lsa.txt b.txt c.txt nginx[fangfc@node10009 a]$
- 客户端拉取
[fangfc@node10011 a]$ sudo rsync -avz --delete --password-file=/etc/rsyncd.passwd user1@192.168.10.9::data/ /home/fangfc/a/receiving incremental file list./b.txtc.txtsent 72 bytes received 580 bytes 1,304.00 bytes/sectotal size is 19,612 speedup is 30.08[fangfc@node10011 a]$
END