Rsync 数据同步软件

1. Rsync 概述

1.1 Rsync 软件介绍及原理

      Rsync (Remote synchronization)是一款开源的、快速的、多功能的、可实现全量和增量的本地或远程数据同步备份的优秀工具,Rsync 软件适用于 UNIX/LINUX/WINDOWS 等多种操作系统平台。

      Rsync 具有可使本地和远端两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于 ssh 带的 scp( 加密的拷贝 ) 命令。scp 每次都是全量拷贝,而 rsync 可以增量拷贝。

      Rsync 还可以在本地主机的不同分区或目录之间全量及增量的复制数据,类似于 cp 命令。

      Rsync 还可以实现删除文件和目录的功能,类似于 rm 命令。

      Rsync 相当于 scp 、cp 、rm 三个命令,但是还优于它们每一个命令。

      在同步备份数据时,默认情况下,rsync 通过其独特的 "quick check" 算法,仅同步大小或者最后修改时间发生变化的文件或目录,当然也可以根据权限,属主等属性的变化同步,但需要指定相应的参数,甚至可以实现只同步一个文件里有变化的内容部分,所以可以实现快速的同步备份数据。

       传统的 cp 、scp 工具拷贝,每次均为完整的拷贝,而 rsync 除了可以完整拷贝外,还具备增量拷贝的功能。因此,从同步数据的性能及效率上,rsync 工具更胜一筹。        

1.2 Rsync 的特性

 支持拷贝特殊文件,如链接文件、设备等。

 可以有排除指定文件或目录同步的功能,相当于打包命令 tar 的排除功能。

 可以做到保持原文件或目录的权限、时间、软硬链接、属主、属组、等所有属性均不改变(-p)。

 可以实现增量同步,即只同步发生变化的数据,因此数据传输效率很高。

 可以使用 rcp 、rsh 、ssh 等方式来配合传输文件(rsync 本身不对文件加密)。

⑥ 可以通过 socket (进程方式)传输文件和数据(服务端和客户端)。

  支持匿名的或认证(无需系统用户)的进程模式传输,可实现方便安全的进行数据备份及镜像。

1.3 Rsync企业工作典型应用场景说明

① 两台服务器之间数据同步。

② 定时备份【cron + rsync】,例如:Web 服务器上的 /etc/rc.local 、MySQL 数据库等的数据需要借助定时任务定时备份到备份服务器。

③  rsync 结合 inotify 的功能做实时的数据同步 【rsync + inotify 或 sersync】。例如:nfs_server 热备数据需要通过 rsync 实时同步到备份服务器。 实时同步需要有一个监控 nfs 服务目录的变化,目录发生变化就调用 rsync 软件把变化的数据实时同步备份。

1.4 企业案例:全网服务器数据备份解决方案提出及负责实施

① 针对公司重要数据备份混乱状况提出及负责实施。

② 通过本地打包备份,然后 rsync 结合 inotify 应用把全网数据统一备份到一个固定存储服务器上。存储服务器上通过脚本检查并报警管理员备份结果。

③ 定期将 IDC 机房的数据备份到公司内部服务器,防止机房地震及火灾问题导致数据丢失。

1.5 Rsync 的工作方式

1.5.1 常用的工作方式介绍

 单个主机本地之间的数据传输(类似于 cp 命令的功能)。

 借助 rcp 、 ssh 等通道来传输数据(类似于 scp 命令的功能)。

③ 以守护进程(socket)的方式传输数据(这个是 rsync 自身的重要功能)。

1.5.2 通过 man rsync 获取帮助信息

SYNOPSIS

       Local:  rsync [OPTION...] SRC... [DEST]

       Access via remote shell:

         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

       Access via rsync daemon:

         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

2. Rsync 简单运用实战

2.1 Rsync的第一种工作模式:在本地同步备份或删除

2.1.1 语法

Local:  rsync [OPTION...]  SRC...   [DEST]              

  本地:  命令    参数            内容        路径

2.1.2 实践操作

[root@nfs-server ~]# rsync -avz /etc/hosts /tmp/  #  保持属性的把 hosts 拷贝到 /tmp 。

sending incremental file list

hosts

sent 155 bytes  received 31 bytes  372.00 bytes/sec

total size is 199  speedup is 1.07

[root@nfs-server ~]# cp -a /etc/hosts /tmp/

cp: overwrite `/tmp/hosts'? y

# rsync -avz /etc/hosts /tmp/   cp -a /etc/hosts /tmp/  效果是一样的。

[root@nfs-server ]# mkdir /null   #  创建空目录。  

[root@nfs-server ]# rsync -avz --delete /null/ /tmp/    #  把 /tmp 目录变成空。

sending incremental file list

./

deleting oldboy/    

deleting .ICE-unix/

deleting web_check.log

deleting hosts

sent 29 bytes  received 15 bytes  88.00 bytes/sec

total size is 0  speedup is 0.00

[root@nfs-server ]# ll /tmp     #  查看目录,/tmp 为空。

total 0

#  rsync -avz --delete /null/ /tmp/  相当于 rm 删除 /tmp 下内容。

2.1.3 第一种模式小结(local)

rsync 命令本身是客户端命令

rsync -avz /etc/hosts /tmp/       ===    c p

rsync -avz --delete /null/ /tmp/  ===    r m

2.2 Rsync的第二种工作模式:通过隧道远程同步备份

2.2.1 语法

 Access via remote shell:

         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 

2.2.2 实践操作

① 把 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上:

[root@nfs-server ~]# ll /tmp    #  可以看到原来只有下面一个文件。

total 128

-rw-r--r--. 1 root root 127304 Sep 22 16:00 service_2017-09-22-16.tar.gz

[root@nfs-server ~]# cd /tmp

[root@nfs-server tmp]# touch {1..5}   #  创建文件1 .. 5 。

[root@nfs-server tmp]# rsync -avzP  -e 'ssh -p 22' /tmp/ [email protected]:/tmp/

#  把 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上。

#  目录后面是否加  / 的问题:/tmp/ 只复制目录下的内容,/tmp 会把目录也复制过去。

[email protected]'s password:  #  提示输入远端 root 密码。

切换到IP为192.168.136.132的服务器:

[root@lamp01 ~]# ls /tmp   #  可以看到数据被同步(推)到了这里。

1  2  3  4  5  oldboy  service_2017-09-22-16.tar.gz  web_check.log

②  把远端IP为192.168.136.132的服务器上 /tmp 目录下内容拉到本地/opt目录:    .

[root@nfs-server tmp]# rsync -avzP  -e 'ssh -p 22'  [email protected]:/tmp/  /opt/

[email protected]'s password:

[root@nfs-server ~]# ls /opt  #  查看本地 /opt 目录。可以看到远端 /tmp 目录下内容被同步到了(拉)本地的 /opt 目录下。

1  2  3  4  5  oldboy  rh  service_2017-09-22-16.tar.gz  web_check.log

2.2.3 第二种模式小结

push (推):把本地 /tmp 目录下内容推到远端IP为192.168.136.132的服务器上/tmp目录:

rsync -avzP  -e 'ssh -p 22' /tmp/ [email protected]:/tmp/

pu l l (拉): 把远端IP为192.168.136.132的服务器上 /tmp 目录下内容拉到本地/opt目录:

rsync -avzP  -e 'ssh -p 22'  [email protected]:/tmp/  /opt/ 

2.2.4 上面命令关键语法的说明

① /tmp/  只复制目录下的内容,/tmp  会把目录也复制过去。(目录后面是否加  / 的问题)

② -avz 表示同步时文件和目录属性不变。

③ -p 显示同步的过程,可用 -progress 替换。

④ -e ‘ssh -p 22’  表示通过 ssh 的通道传输数据 ( -p 22 可省略 ) 。

⑤ [email protected]:/opt  远程的主机系统用户、地址、路径。

⑥ /tmp 本地的路径。

2.3 Rsync的第三种工作模式:通过 Rsync 进程(服务)访问同步备份

2.3.1 语法

 Access via rsync daemon:

         Pu l l: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

                   rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

                   rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

2.3.2 Rsync 客户端命令常用参数选项         

-v  详细模式输出传输时的进度等信息。

-z  传输时进行压缩以提高传输效率。

-a  归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rtopgDl 。

-e  指定使用的通道协议,指定代替 rsh 的 shell 程序,例如: ssh 。

--exclude=PATTERN  指定排除不需要传输的文件模式。   

3. 配置 Rsync 服务端

3.1 查看 Rsync 版本

[root@backup ~]# rsync --version

rsync  version 3.0.6  protocol version 30

3.2 查看 Rsync 安装包

[root@backup ~]# rpm -qa rsync

rsync-3.0.6-12.el6.x86_64

3.3 创建并编辑配置文件

[root@backup ~]# ll /etc/exports

-rw-r--r--. 1 root root 0 Jan 12  2010 /etc/exports

#  上面是 NFS 服务的配置文件,Rsync 的配置文件默认是不存在的,需要自己创建。

[root@backup ~]# touch /etc/rsyncd.conf     #  创建 Rsync 服务端配置文件。

[root@backup ~]# vi /etc/rsyncd.conf    #  编辑配置文件,加入如下内容(去掉汉字注释)。

3.4 Rsync 配置文件详解

# Rsync server

# created by ZhangLei 17:32 2017-12-01

# rsyncd.conf start #

uid = rsync                                 # 客户端连接时具备该用户的权限。

gid = rsync                                 # 客户端连接时具备该用户的权限。

use chroot = yes                        # 和安全相关。

max connections = 2000           # 同时连接的服务器数。

timeout = 600                            # 服务端超时时间,超过则踢掉。

pid file = /var/run/rsyncd.pid      # 进程号的文件。

lock file = /var/run/rsync.lock     # 锁文件。

log file = /var/log/rsyncd.log       # rsync日志文件,一般出问题找这个文件。

ignore errors                              # 忽略错误。

read only = no                         # 可读写。

list = false                                  # 不让列表,也就是不能看服务端有什么。

hosts allow = 10.0.0.0/24          # 允许的ip 。

hosts deny = 0.0.0.0/0

auth users = rsync_backup      # 远程连接的用户。

secrets file = /etc/rsync.password  # rsync用户的账号和密码的文件。

######################################################

[backup]                                   #  模块 。               

comment = backup server  by ZhangLei 17:32 2017-12-01

path = /backup

3.5 Rsync 服务的启动        

[root@backup ~]# rsync --daemon    #  启动 rsync 服务。

[root@backup ~]# ps -ef|grep rsync|grep -v grep    #  查看 rsync 服务进程。   

root       4537      1  0 09:35 ?        00:00:00 rsync --daemon

[root@backup ~]# netstat -lntup|grep rsync   #  查看 rsync 服务,端口为873。

tcp        0      0 0.0.0.0:873      0.0.0.0:*            LISTEN      4537/rsync

tcp        0      0 :::873                 :::*                   LISTEN      4537/rsync

[root@backup ~]# ss -lntup|grep rsync   #  已知端口为873查看该服务(CentOS 7 的 ss 命令)。

tcp    LISTEN     0      5      :::873             :::*      users:(("rsync",4537,5))

tcp    LISTEN     0      5       *:873            *:*      users:(("rsync",4537,3))

[root@backup ~]# lsof -i :873   #  已知端口为873,查看 rsync 服务。

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rsync   4537 root    3u  IPv4  23789      0t0  TCP *:rsync (LISTEN)

rsync   4537 root    5u  IPv6  23790      0t0  TCP *:rsync (LISTEN)

3.6 Rsync 服务端深度配置

[root@backup ~]# cat /etc/rsyncd.conf    #  以下是未配置的摘选信息。

uid = rsync         # 客户端连接时具备该用户的权限。

gid = rsync         # 客户端连接时具备该用户的权限。

read only = yes  # 可读写。    

auth users = rsync_backup      # 远程连接的用户。

secrets file = /etc/rsync.password    # rsync用户的账号和密码的文件。

path = /backup    

3.7 其他详细配置步骤

[root@backup ~]# useradd rsync -s /sbin/nologin -M    # 创建 rsync 不需要登录的虚拟用户(不创建家目录)

[root@backup ~]# id rsync

uid=510(rsync) gid=511(rsync) groups=511(rsync)

[root@backup ~]# mkdir /backup    #  创建共享的目录:path = /backup。  

[root@backup ~]# chown -R rsync /backup/   #  允许客户端推送文件需要把该目录属主改成 rsync 。

[root@backup ~]# ls -ld  /backup

drwxr-xr-x. 2 rsync root 4096 Sep 19 06:52 /backup  #  客户端有读写权限。

3.8 创建该虚拟用户的账号密码文件并设置密码为 alinuxer 

账号密码文件为 /etc/rsync.password

直接 echo 用户名和密码到 /etc/rsync.password:(echo 可自动创建文件,但不能创建目录)。   

[root@backup ~]# echo "rsync_backup:alinuxer" > /etc/rsync.password

[root@backup ~]# cat /etc/rsync.password

rsync_backup:alinuxer  (非交互式使用账号密码)  

因为是密码,所以要给它设置 600 权限并检查:

[root@backup ~]# chmod 600 /etc/rsync.password

[root@backup ~]# ll /etc/rsync.password

-rw-------. 1 root root 20 Sep 24 10:15 /etc/rsync.password  #  权限成功设置为 600 。

3.9 Rsync 服务端配置步骤小结:  

① 创建并编辑 /etc/rsyncd.conf 配置文件加入配置参数。

② 创建 rsync 用户及共享目录 /backup,并给目录授权属主为 rsync  。

      useradd rsync -s /sbin/nologin -M

      id rsync  

      mkdir /backup  

      chown -R rsync /backup/

③ 创建密码文件。

      echo "rsync_backup:alinuxer" > /etc/rsync.password

      cat /etc/rsync.password      

      chmod 600 /etc/rsync.password

      ll /etc/rsync.password

④ 启动并检查:

      rsync --daemon   #  启动 rsync 服务。

      ps -ef|grep rsync|grep -v grep  #  查看 rsync 服务进程。  

      查看 rsync 服务,端口为873:

      netstat -lntup|grep rsync  或   ss -lntup|grep rsync  或  lsof -i :873

⑤ 加入开机自启动并检查:

      echo "rsync --daemon" >>/etc/rc.local

      cat /etc/rc.local

4. 配置 Rsync 客户端并推送数据到服务端

4.1 创建密码文件

      echo "alinuxer" > /etc/rsync.password

      chmod 600 /etc/rsync.password

      ls -l /etc/rsync.password

      cat /etc/rsync.password

4.2 向 rsync 服务端测试推送文件

rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password

4.3 实践操作: 把客户端本地的 /tmp 目录下文件推到远端服务端 /backup/ 目录

4.3.1 配置客户端

[root@lamp01 ~]# echo "alinuxer" >/etc/rsync.password

[root@lamp01 ~]# chmod 600 /etc/rsync.password  

[root@lamp01 ~]# ls -l /etc/rsync.password

-rw-------. 1 root root 7 Sep 22 21:22 /etc/rsync.password

[root@lamp01 ~]# cat /etc/rsync.password

alinuxer

4.3.2 推送数据

[root@lamp01 ~]# rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password

sending incremental file list

./

1

2

3

4

5

service_2017-09-22-16.tar.gz

service_2017-09-22-18.tar.gz

service_2017-09-22-20.tar.gz

web_check.log

.ICE-unix/

oldboy/

sent 382612 bytes  received 190 bytes  765604.00 bytes/sec

total size is 381931  speedup is 1.00

4.3.3 切换到服务端查看数据备份结果

[root@backup ~]# ls /backup/

1  3  5       service_2017-09-22-16.tar.gz  service_2017-09-22-20.tar.gz

2  4  oldboy  service_2017-09-22-18.tar.gz  web_check.log

4.3.4 在客户端的 /tmp 目录下创建文件重新推送:

[root@lamp01 ~]# cd /tmp

[root@lamp01 tmp]# touch {a..g}

[root@lamp01 tmp]# cd -

/root

[root@lamp01 ~]# rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password

sending incremental file list

./

a

b

c

d

e

f

g

sent 579 bytes  received 146 bytes  1450.00 bytes/sec

total size is 381931  speedup is 526.80

4.3.5 在服务端查看备份结果:(可以看到新创建的文件也同步备份了)

[root@backup ~]# ls /backup/

1  4  b  e  oldboy                        service_2017-09-22-20.tar.gz

2  5  c  f  service_2017-09-22-16.tar.gz  web_check.log

3  a  d  g  service_2017-09-22-18.tar.gz

4.3.6 把服务端 /backup 目录下文件拉到客户端本地的 /tmp 目录。

[root@backup ~]# ls /backup    #  服务端 /backup 下只有一个 oldboy 。

oldboy

[root@lamp01 ~]# rm -fr /tmp

[root@lamp01 ~]# mkdir /tmp

[root@lamp01 ~]# ls /tmp/   #  删除并创建空目录 /tmp 。

[root@lamp01 ~]# rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password   

#  把服务端 /backup 目录下文件拉到客户端本地的 /tmp 目录。

receiving incremental file list

./

.ICE-unix/

oldboy/

sent 75 bytes  received 155 bytes  460.00 bytes/sec

total size is 0  speedup is 0.00

[root@lamp01 ~]# ls /tmp/   #  可以看到客户端本地 /tmp 下同步了 oldboy 。

oldboy

[root@backup backup]# touch {1..4}   #  在服务端 /backup 创建文件 1  2  3  4  。

[root@lamp01 ~]# rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password    

#  再从客户端拉取服务端 /backup 文件到本地 /tmp 目录。

receiving incremental file list

./

1

2

3

4

sent 145 bytes  received 344 bytes  978.00 bytes/sec

total size is 0  speedup is 0.00

[root@lamp01 ~]# ls /tmp/   #  可以看到客户端本地 /tmp 下同步了 1  2  3  4   。

1  2  3  4  oldboy

5. Rsync 服务小结:

5.1 Rsync 服务运用小结

① 推、拉都是客户端操作。

② 注意目录后面斜线的问题。

        服务端配置:

        path=/backup/

        客户端命令:

rsync -avz /tmp/ [email protected]::backup/ --password-file=/etc/rsync.password.

rsync -avz [email protected]::backup/ /tmp/ --password-file=/etc/rsync.password

③ 同步安全优化: 绑定指定 IP 地址提供服务。

[root@backup backup]# netstat -lntup|grep rsync

tcp        0      0 0.0.0.0:873     0.0.0.0:*        LISTEN      1172/rsync

tcp        0      0 :::873              :::*                 LISTEN      1172/rsync

        上面的 0.0.0.0 表示只要访问网卡上的 IP ,服务端都会响应。如果有外网 IP,会产生安全问题,所以要把它绑到内网网卡上。(873端口也可以改,但是工作中不需要改)    

--address=ADDRESS   绑定网卡的参数。

--port=PORT  修改端口的参数。

        如果只允许局域网 IP 传输,就要绑定指定IP地址提供服务:(安全优化的选项)

[root@backup backup]# pkill rsync

[root@backup backup]# netstat -lntup|grep rsync   

[root@backup backup]# rsync --daemon --address=192.168.136.130  

[root@backup backup]# netstat -lntup|grep rsync

tcp        0      0 192.168.136.130:873         0.0.0.0:*        LISTEN    1986/rsync

        即:客户端只有访问服务端 192.168.136.130  这个IP ,服务端才会响应。

        如果跨机房做数据同步:【直接用公网 IP 做数据同步不安全】可以拉专线把两个机房做成同一网路或者用 VPN 做成局域网再进行数据传输。

5.2 Rsync 服务排错思路小结:

前提:熟练服务的操作思路,根据正确步骤分析问题所在。

5.2.1 服务端排错思路:

 查看rsync 服务配置文件路径是否正确,正确的默认路径问为:/etc/rsyncd.conf 。

查看配置文件里host allow,host deny 允许的 IP 网段是否是允许客户端访问的 IP 网段。

 查看配置文件中的 path 路径是否存在,权限是否正确。(属主)

 查看服务是否启动(ps -ef),查看端口是否存在。

 查看防火墙和 selinux 是否开启允许 rsync 服务通过,或关闭防火墙,selinux 。

 查看服务端 rsync 配置的密码文件格式是否正确。权限是否 600 。

 如果推送数据,要查看服务端配置文件 /etc/rsyncd.conf 中用户是否对模块下目录有读写权限。

⑧ 出错查看日志:cat /var/log/rsync.log , 看不清就 >/var/log/rsync.log(清空)再操作并查看。

5.2.2 客户端排错思路:

 查看客户端密码配置文件格式是否正确、权限是否 600 ,注意只有密码,并和服务端一致。

 通过telnet ip port 查看服务是否启动(防火墙是否阻挡服务)。

③ 注意命令格式,ip 和 模块 之间的双冒号(::)等。

提示:可通过模拟错误总结提示信息,排错经验以提高以后工作效率。

5.3 简单了解 rsync 协议的运用

5.3.1 语法格式

Access via rsync daemon:

         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]

拉:  rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST

推:  rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

5.3.2 使用示例

拉取:rsync -avz rsync://[email protected]/backup  /tmp/ --password-file=/etc/rsync.password

推送: rsync -avz /tmp/ rsync://[email protected]/backup --password-file=/etc/rsync.password

5.4 Rsync 服务的优缺点

优点:增量同步备份、支持 socket(daemon)、集中备份。

缺点:① 大量小文件同步时比对时间较长,有时 rsync 进程会停止。

          解决思路:a.打包同步。  b.drbd (文件系统同步) 复制 block 数据块。

          ② 同步类似 10 G 这样的大文件时有时会中断。未完整同步前是隐藏文件,同步完成后自动改为正常文件。 (可以限速)

无差异同步的风险:(--delete)

① 需要同步的两个目录一模一样的时候,用 --delete 参数,谨慎使用!

② 如果用该参数拉取时,远端有什么本地就有什么(本地比远端多的会自动删除),所以要先备份本地数据或确定本地数据无用。;用该参数推送时,本地有什么远端有什么(远端比本地多的会自动删除),所以要先备份远端数据或确定远端数据无用。

③ 放在脚本中先备份后操作。

猜你喜欢

转载自www.cnblogs.com/alinuxer/p/9877192.html