服务管理之rsync

rsync

1. rsync简介

rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。

2. rsync特性

rsync支持很多特性:

  • 可以镜像保存整个目录树和文件系统
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等等
  • 无须特殊权限即可安装
  • 快速:第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件。rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽
  • 安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接
  • 支持匿名传输,以方便进行网站镜象

3.rsync的ssh认证协议

rsync命令来同步系统文件之前要先登录remote主机认证,认证过程中用到的协议有2种:

  • ssh协议
  • rsync协议

rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就可以直接rsync同步文件

rsync server端因为不用启动daemon进程,所以也不用配置文件/etc/rsyncd.conf

ssh认证协议跟scp的原理是一样的,如果在同步过程中不想输入密码就用ssh-keygen -t rsa打通通道

//这种方式默认是省略了 -e ssh 的,与下面等价:
rsync -avz /SRC -e ssh root@172.16.12.129:/DEST 
    -a  //文件宿主变化,时间戳不变
    -z  //压缩数据传输
 
//当遇到要修改端口的时候,我们可以:
rsync -avz /SRC -e "ssh -p2222" root@192.168.153.153:/DEST  
//修改了ssh 协议的端口,默认是22

4. rsync命令

//Rsync的命令格式常用的有以下三种:
    rsync [OPTION]... SRC DEST
    rsync [OPTION]... SRC [USER@]HOST:DEST
    rsync [OPTION]... [USER@]HOST:SRC DEST
  
//对应于以上三种命令格式,rsync有三种不同的工作模式:
1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:
[root@localhost ~]# ls
anaconda-ks.cfg  azhttpd.sh  test  tphttpd.sh
[root@localhost ~]# rsync -a anaconda-ks.cfg ba
[root@localhost ~]# ls
anaconda-ks.cfg  azhttpd.sh  ba  test  tphttpd.sh
[root@localhost ~]# ll
总用量 16
-rw-------. 1 root root 1585 3月  20 03:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1773 4月  25 04:10 azhttpd.sh
-rw-------. 1 root root 1585 3月  20 03:06 ba
drwxr-xr-x. 2 root root   29 4月  25 21:35 test
-rw-r--r--. 1 root root 1248 4月  25 16:39 tphttpd.sh
2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包 
含单个冒号":"分隔符时启动该模式。如:
[root@localhost ~]# rsync -avz ba root@192.168.153.152:/root/aa
root@192.168.153.152's password: 
sending incremental file list
ba

sent 867 bytes  received 35 bytes  200.44 bytes/sec
total size is 1,585  speedup is 1.76
客户端验证:
[root@liuyi ~]# ls
aa                      CentOS7-Base-163.repo
anaconda-ks.cfg         httpd-2.4.39.tar.bz2
apr-1.6.5.tar.bz2       mysql57-community-release-el7-10.noarch.rpm
apr-util-1.6.1.tar.bz2  test
[root@liuyi ~]# 
3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径 
包含单个冒号":"分隔符时启动该模式。如:
[root@localhost ~]# rsync -aqz ba 'ssh' root@192.168.153.152:/root
root@192.168.153.152's password: 
rsync: link_stat "/root/ssh" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
客户端验证:
[root@liuyi ~]# ls
aa  anaconda-ks.cfg  ba  test
//rsync常用选项:
    -a, --archive       //归档
    -v, --verbose       //啰嗦模式
    -q, --quiet         //静默模式
    -r, --recursive     //递归
    -p, --perms         //保持原有的权限属性
    -z, --compress      //在传输时压缩,节省带宽,加快传输速度
    --delete            //在源服务器上做的删除操作也会在目标服务器上同步
delete的用法
[root@localhost ~]# rsync -aqz --delete test 'ssh' root@192.168.153.152:/root
root@192.168.153.152's password: 
rsync: link_stat "/root/ssh" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
客户端验证:
[root@liuyi ~]# ls test/
aa  anaconda-ks.cfg

5. rsync+inotify

rsync与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。

随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。
在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

环境说明:

服务器类型 IP地址 应用 操作系统
源服务器 192.168.153.153 rsync
inotify-tools
脚本
centos7/redhat7
目标服务器 192.168.153.152 rsync centos7/redhat7
需求:
  • 把源服务器上/etc目录实时同步到目标服务器的/lcr/下

在目标服务器上做以下操作:

//关闭防火墙与SELINUX
[root@liuyi ~]# systemctl stop firewalld.service 
[root@liuyi ~]# systemctl disable firewalld.service 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@liuyi ~]# getenforce 
Enforcing
[root@liuyi ~]# setenforce 0
[root@liuyi ~]# getenforce 
Permissive
//安装rsync服务端软件
[root@liuyi ~]# yum -y install rsync
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
myrepo                                          | 4.1 kB     00:00
(1/2): myrepo/group_gz                            | 137 kB   00:00
(2/2): myrepo/primary_db                          | 4.0 MB   00:00
Resolving Dependencies
--> Running transaction check
---> Package rsync.x86_64 0:3.0.9-18.el7 will be installed
......
myrepo/productid                                | 1.6 kB     00:00
  Verifying  : rsync-3.0.9-18.el7.x86_64                           1/1

Installed:
  rsync.x86_64 0:3.0.9-18.el7

Complete!
//设置rsyncd.conf配置文件
[root@localhost ~]# cat >> /etc/rsyncd.conf <<EOF
log file = /var/log/rsyncd.log    //日志文件位置,启动rsync后自动产生这个文件,无需提前创建
pidfile = /var/run/rsyncd.pid     //pid文件的存放位置
lock file = /var/run/rsync.lock   //支持max connections参数的锁文件
secrets file = /etc/rsync.pass    //用户认证配置文件,里面保存用户名称和密码,必须手动创建这个文件

[etc_from_client]     //自定义同步名称
path = /lcr/          //rsync服务端数据存放路径,客户端的数据将同步至此目录
comment = sync test from client
uid = root        //设置rsync运行权限为root
gid = root        //设置rsync运行权限为root
port = 873        //默认端口
ignore errors     //表示出现错误忽略错误
use chroot = no       //默认为true,修改为no,增加对目录文件软连接的备份
read only = no    //设置rsync服务端为读写权限
list = no     //不显示rsync服务端资源列表
max connections = 200     //最大连接数
timeout = 600     //设置超时时间
auth users = admin        //执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开
hosts allow = 172.16.12.128   //允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
hosts deny = 192.168.1.1      //禁止数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开
> EOF
[root@liuyi ~]# echo 'admin:123456' > /etc/rsync.pass
[root@liuyi ~]# cat /etc/rsync.pass
admin:123456
[root@liuyi ~]# chmod 600 /etc/rsync.pass
[root@liuyi ~]# systemctl restart rsyncd
[root@liuyi ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
[root@liuyi ~]# ss -antl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128        *:22                     *:*                  
LISTEN     0      100    127.0.0.1:25                     *:*                  
LISTEN     0      5          *:873                    *:*                  
LISTEN     0      128       :::22                    :::*                  
LISTEN     0      100      ::1:25                    :::*                  
LISTEN     0      5         :::873                   :::*                  
[root@liuyi ~]# 

在源服务器上做以下操作:

/关闭防火墙与SELINUX
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
//配置yum源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
--2018-08-10 12:07:17--  http://mirrors.163.com/.help/CentOS7-Base-163.repo
Resolving mirrors.163.com (mirrors.163.com)... 59.111.0.251
Connecting to mirrors.163.com (mirrors.163.com)|59.111.0.251|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1572 (1.5K) [application/octet-stream]
Saving to: ‘CentOS7-Base-163.repo’

100%[=================================>] 1,572       --.-K/s   in 0s

2018-08-10 12:07:17 (191 MB/s) - ‘CentOS7-Base-163.repo’ saved [1572/1572]
[root@localhost ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@localhost ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@localhost ~]# yum -y install epel-release
安装过程略。。。。
//安装rsync服务端软件,只需要安装,不要启动,不需要配置
[root@localhost ~]# yum -y install rsync
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
myrepo                                          | 4.1 kB     00:00
(1/2): myrepo/group_gz                            | 137 kB   00:00
(2/2): myrepo/primary_db                          | 4.0 MB   00:00
Resolving Dependencies
--> Running transaction check
---> Package rsync.x86_64 0:3.0.9-18.el7 will be installed
......
myrepo/productid                                | 1.6 kB     00:00
  Verifying  : rsync-3.0.9-18.el7.x86_64                           1/1

Installed:
  rsync.x86_64 0:3.0.9-18.el7

Complete!
//创建认证密码文件
[root@localhost ~]#  echo '123456' > /etc/rsync.pass
//设置文件权限,只设置文件所有者具有读取、写入权限即可
[root@localhost ~]# chmod 600 /etc/rsync.pass
[root@localhost ~]# ll /etc/rsync.pass
-rw-------. 1 root root 7 4月  26 03:33 /etc/rsync.pass
//在源服务器上创建测试目录,然后在源服务器运行以下命令
[root@localhost ~]#  mkdir -pv /root/etc/test
mkdir: 已创建目录 "/root/etc"
mkdir: 已创建目录 "/root/etc/test"
[root@localhost ~]# rsync -avH --port 873 --progress --delete /root/etc/ admin@192.168.153.152::test_from_153 --password-file=/etc/rsync.pass
sending incremental file list
./
test/

sent 81 bytes  received 23 bytes  208.00 bytes/sec
total size is 0  speedup is 0.00
[root@localhost ~]# 
//运行完成后,在目标服务器上查看,在/lcr目录下有test目录,说明数据同步成功
验证:
[root@liuyi ~]# cd /lcr/
[root@liuyi lcr]# ls
test
[root@liuyi lcr]# 
//安装inotify-tools工具,实时触发rsync进行同步
//查看服务器内核是否支持inotify
[root@localhost ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0 4月  26 03:49 max_queued_events
-rw-r--r--. 1 root root 0 4月  26 03:49 max_user_instances
-rw-r--r--. 1 root root 0 4月  26 03:49 max_user_watches
//如果有这三个max开头的文件则表示服务器内核支持inotify

//安装inotify-tools
[root@localhost ~]# yum -y install make gcc gcc-c++
安装过程略....
[root@localhost ~]# yum -y install inotify-tools
安装过程略....
//写同步脚本,此步乃最最重要的一步,请慎之又慎。让脚本自动去检测我们制定的目录下 
//文件发生的变化,然后再执行rsync的命令把它同步到我们的服务器端去
[root@localhost ~]# mkdir /scripts
[root@localhost ~]# touch /scripts/inotify.sh
[root@localhost ~]# chmod 755 /scripts/inotify.sh
[root@localhost ~]# ll /scripts/inotify.sh
-rwxr-xr-x. 1 root root 0 4月  26 03:52 /scripts/inotify.sh
root@localhost ~]# vim /scripts/inotify.sh
host=192.168.153.152      //目标服务器的ip(备份服务器)
src=/etc        //在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)
des=test_from_153     //自定义的模块名,需要与目标服务器上定义的同步名称一致
password=/etc/rsync.pass        //执行数据同步的密码文件
user=admin          //执行数据同步的用户名
inotifywait=/usr/bin/inotifywait

$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src 
| while read files;do
    rsync -avzP --delete  --timeout=100 --password-file=${password} $src $user@$host::$des
    echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
//启动脚本
[root@localhost ~]# nohup bash /scripts/inotify.sh &
[1] 12221
[root@localhost ~]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@localhost ~]# ps -ef|grep inotify
root      12221   1380  0 04:01 pts/0    00:00:00 bash /scripts/inotify.sh
root      12222  12221  0 04:01 pts/0    00:00:00 /usr/bin/inotifywait -mrq --timefmt %Y%m%d %H:%M --format %T %w%f%e -e modify,delete,create,attrib /etc
root      12223  12221  0 04:01 pts/0    00:00:00 bash /scripts/inotify.sh
root      12225   1380  0 04:01 pts/0    00:00:00 grep --color=auto inotify
//在源服务器上生成一个新文件
[root@localhost ~]# touch /etc/abc
验证:
[root@liuyi ~]# ls /lcr
test
[root@liuyi ~]# ls /lcr
etc  test
//查看inotify生成的日志
[root@localhost ~]# tail /tmp/rsync.log
20190426 04:02 /etc/abcCREATE was rsynced
20190426 04:02 /etc/abcATTRIB was rsynced

设置脚本开机自动启动:

[root@localhost ~]# chmod +x /etc/rc.d/rc.local
[root@localhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 473 Aug 10 23:23 /etc/rc.d/rc.local
[root@localhost ~]# echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local
[root@localhost ~]# tail /etc/rc.d/rc.local
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
nohup /bin/bash /scripts/inotify.sh

到目标服务器上去查看是否把新生成的文件自动传上去了:

etc  test
[root@liuyi ~]# ls /lcr/etc/
abc                      httpd                     rc2.d
adjtime                  init.d                    rc3.d
aliases                  inittab                   rc4.d
aliases.db               inputrc                   rc5.d
alternatives             iproute2                  rc6.d
anacrontab               issue                     rc.d
asound.conf              issue.net                 rc.local
audisp                   kdump.conf                redhat-release
audit                    kernel                    resolv.conf
bash_completion.d        krb5.conf                 rhsm
bashrc                   krb5.conf.d               rpc
bbb                      ld.so.cache               rpm
binfmt.d                 ld.so.conf                rsyncd.conf
chkconfig.d              ld.so.conf.d              rsync.pass
cron.d                   libaudit.conf             rsyslog.conf
cron.daily               libnl                     rsyslog.d
cron.deny                libuser.conf              rwtab
cron.hourly              locale.conf               rwtab.d
cron.monthly             localtime                 sasl2
crontab                  login.defs                securetty
cron.weekly              logrotate.conf            security
crypttab                 logrotate.d               selinux
csh.cshrc                lvm                       services
csh.login                machine-id                sestatus.conf
dbus-1                   magic                     shadow
default                  mailcap                   shadow-
depmod.d                 makedumpfile.conf.sample  shells
dhcp                     man_db.conf               skel
DIR_COLORS               mime.types                ssh
DIR_COLORS.256color      mke2fs.conf               ssl
DIR_COLORS.lightbgcolor  modprobe.d                statetab
dracut.conf              modules-load.d            statetab.d
dracut.conf.d            motd                      subgid
e2fsck.conf              mtab                      subuid
environment              my.cnf                    subversion
ethertypes               my.cnf.d                  sudo.conf
exports                  NetworkManager            sudoers
favicon.png              networks                  sudoers.d
filesystems              nsswitch.conf             sudo-ldap.conf
firewalld                nsswitch.conf.bak         sysconfig
fstab                    openldap                  sysctl.conf
fuse.conf                opt                       sysctl.d
gcrypt                   os-release                systemd
gdbinit                  pam.d                     system-release
gdbinit.d                passwd                    system-release-cpe
GeoIP.conf               passwd-                   tcsd.conf
GeoIP.conf.default       pkcs11                    terminfo
gnupg                    pki                       tmpfiles.d
GREP_COLORS              plymouth                  tuned
groff                    pm                        udev
group                    polkit-1                  vconsole.conf
group-                   popt.d                    vimrc
grub2.cfg                postfix                   virc
grub.d                   ppp                       vmware-tools
gshadow                  prelink.conf.d            wgetrc
gshadow-                 printcap                  wpa_supplicant
gss                      profile                   X11
host.conf                profile.d                 xdg
hostname                 protocols                 xinetd.d
hosts                    python                    yum
hosts.allow              rc0.d                     yum.conf
hosts.deny               rc1.d                     yum.rep
原文地址:https://www.cnblogs.com/ly0629/p/10782446.html