目录python
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync能够远程同步,支持本地复制,或者与其余SSH、rsync主机同步。mysql
rsync支持不少特性:linux
支持匿名传输,以方便进行网站镜象c++
rsync协议sql
rsync server端不用启动rsync的daemon进程,只要获取remote host的用户名和密码就能够直接rsync同步文件shell
rsync server端由于不用启动daemon进程,因此也不用配置文件/etc/rsyncd.confvim
ssh认证协议跟scp的原理是同样的,若是在同步过程当中不想输入密码就用ssh-keygen -t rsa打统统道centos
//这种方式默认是省略了 -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
//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
rsync与传统的cp、tar备份方式相比,rsync具备安全性高、备份迅速、支持增量备份等优势,经过rsync能够解决对实时性要求不高的数据备份需求,例如按期的备份文件服务器数据到远端服务器,对本地磁盘按期作数据镜像等。安全
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了不少不足,首先,rsync同步数据时,须要扫描全部文件后进行比对,进行差量传输。若是文件数量达到了百万甚至千万量级,扫描全部文件将是很是耗时的。并且正在发生变化的每每是其中不多的一部分,这是很是低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它能够经过linux守护进程的方式进行触发同步,可是两次触发动做必定会有时间差,这样就致使了服务端和客户端数据可能出现不一致,没法在应用故障时彻底的恢复数据。基于以上缘由,rsync+inotify组合出现了!bash
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 |
需求:
在目标服务器上作如下操做:
//关闭防火墙与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