Loading... ## 非root账号准备 ### 创建账号并设置为非root用户授权目录 ```php useradd admin passwd admin #输入两次密码 chown -R admin /backup/ ``` ## 服务端(源服务器所同步数据到的目标服务器)准备 ### 关闭防火墙和selinux ```php systemctl disable --now firewalld setenforce 0 sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/sysconfig/selinux getenforce ``` ### 安装 ```php yum -y install rsync rsync-daemon ``` ### 卸载 ```php rpm -qa | grep rsync yum erase rsync -y ``` ### 查看版本号 ```php rsync -version ``` ### 重启 ```php netstat -anput | grep :873 kill -9 1246297(删除进程号) systemctl restart rsyncd.service ``` ### 查看服务是否正常工作 ```php systemctl status rsyncd.service ``` ### 修改或创建两个配置文件 #### vim /etc/rsyncd.conf ```php uid = admin ##进行备份的组,nobody为任意组 gid = admin ##端口 port = 873 ## 如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以root权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true.但是一般不需要,选择no或false use chroot = yes read only = on ##不允许列清单 list = no ##最大连接数 max connections = 4 ##pid文件的存放位置 ##pidfile = /var/run/rsyncd.pid ##锁文件的存放位置 lock file=/var/run/rsyncd.lock ##日志文件的存放位置 log file = /var/log/rsyncd.log ## motd file = /etc/rsyncd.motd ## //此文件定义完成后系统会自动创建 exclude = lost+found/ transfer logging = yes ##覆盖客户指定的IP超时时间,也就是说rsync服务器不会永远等待一个崩溃的客户端。 timeout = 900 ignore nonreadable = yes ## //同步时跳过没有权限的目录 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 ## //传输时不压缩的文件 ##哪些电脑可以访问rsync服务,这里可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、ip和网段之间、网段和网段之间要用空格隔开 ##hosts allow = 172.25.0.110 ##哪些电脑不可以访问rsync服务 ##hosts deny = 172.25.0.0/24 ##这里是认证模块名,即跟samba语法一样,是对外公布的名字 [backup] comment = this is module for backup ##这里是参与同步的目录 path = /backup/ ##可以忽略一些无关的IO错误 ignore errors ##允许可读可写 read only = no ##认证的用户名 auth users = admin ##密码文件存放地址 secrets file = /etc/rsyncd.pass ``` #### vim /etc/rsyncd.pass ```php admin:123456 ``` ### 修改配置文件权限 ```php chmod 600 /etc/rsync* ``` ### 创建同步目录,并设置目录权限 ```php mkdir /backup chmod 600 /backup ``` ### 启动 ```php rsync --daemon ``` ## 客户端(源服务器)准备 ### 关闭防火墙和selinux ```php systemctl disable --now firewalld setenforce 0 getenforce ``` ### 安装(只需要安装,不要启动,不需要配置) ```php yum install -y rsync ``` ### 创建认证密码文件 ```php echo '123456' > /etc/rsync.pass ``` ### 设置认证密码文件权限 ```php chmod 600 /etc/rsync.pass ``` ### 同步 ```php rsync -avz --port 873 --progress --delete /tmp/test admin@服务器ip::backup --password-file=/etc/rsync.pass ``` ## inotify准备 ### 查看服务器内核是否支持inotify ```php ll /proc/sys/fs/inotify/ ``` ### 安装inotify-tools工具 ```php yum -y install make gcc gcc-c++ yum -y install inotify-tools ``` ### 写同步脚本 ```php mkdir /scripts touch /scripts/inotify.sh chmod 755 /scripts/inotify.sh vim /scripts/inotify.sh inotify.sh 脚本如下 host=服务器的ip # 目标服务器的ip(备份服务器) src=/tmp/test # 在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在) des=backup # 自定义的模块名,需要与目标服务器上定义的同步名称一致 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 ``` ### 启动脚本 ```php nohup bash /scripts/inotify.sh & ``` ### 查看启动脚本 ```php ps -ef |grep inotify ``` ### 设置脚本开机自启动 ```php chmod +x /etc/rc.d/rc.local echo 'nohup /bin/bash /scripts/inotify.sh' >> /etc/rc.d/rc.local ``` ## [Rsync服务备份常见报错信息](https://blog.csdn.net/qq_38483583/article/details/123608484) ## 配置项 > -a、--archive参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。 > --append参数指定文件接着上次中断的地方,继续传输。 > --append-verify参数跟--append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。 > -b、--backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix参数指定的文件后缀名,默认是~。 > --backup-dir参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups。 > --bwlimit参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100。 > -c、--checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。 > --delete参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。 > -e参数指定使用 SSH 协议传输数据。 > --exclude参数指定排除不进行同步的文件,比如--exclude="*.iso"。 > --exclude-from参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。 > --existing、--ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。 > -h参数表示以人类可读的格式输出。 > -h、--help参数返回帮助信息。 > -i参数表示输出源目录与目标目录之间文件差异的详细情况。 > --ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。 > --include参数指定同步时要包括的文件,一般与--exclude结合使用。 > --link-dest参数指定增量备份的基准目录。 > -m参数指定不同步空目录。 > --max-size参数设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k')。 > --min-size参数设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k)。 > -n参数或--dry-run参数模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去。 > -P参数是--progress和--partial这两个参数的结合。 > --partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append或--append-verify配合使用。 > --partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append或--append-verify配合使用。 > --progress参数表示显示进展。 > -r参数表示递归,即包含子目录。 > --remove-source-files参数表示传输成功后,删除发送方的文件。 > --size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。 > --suffix参数指定文件名备份时,对文件名添加的后缀,默认是~。 > -u、--update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。 > -v参数表示输出细节。-vv表示输出更详细的信息,-vvv表示输出最详细的信息。 > --version参数返回 rsync 的版本。 > -z参数指定同步时压缩数据。 ## 线上遇到的问题以及解决 对比的文件太多,导致占用太多CPU,一个rsync进程占用服务器CPU的99%、100%,虽然服务器也很垃圾,但彻底废了,解决下这个问题 优化思路如下,用了第二(排除不必要的文件)第三条(增量同步),以及限制同步频率(每小时同步一次)。 要优化这个同步脚本以减少服务器CPU占用,您可以考虑以下几点: 1.限制带宽和连接数:使用--bwlimit参数来限制rsync使用的带宽,以及--max-connections参数来限制rsync使用的最大连接数。这可以帮助减少对服务器资源的占用。 2.排除不必要的文件:使用--exclude参数来排除不必要同步的文件或目录,这可以减少同步的数据量,从而减少服务器CPU占用。 3.增量同步:考虑使用--checksum参数来进行增量同步,这将只传输发生变化的文件,而不是整个文件。 4.调整压缩级别:根据需要调整压缩级别,较低的压缩级别可能会减少CPU占用。 ```bash rsync -avzP --delete --timeout=100 --password-file=${password} --include='*/' --include="$(date +'%Y-%m-%d')*/**" --include="$(date -d 'yesterday' +'%Y-%m-%d')*/**" --include="$(date -d '2 days ago'm-%d')*/**" --exclude="*" --checksum $src $user@$host::$des ``` > --include="/$(date +'%Y-%m-%d')*/" --include="/$(date -d 'yesterday' +'%Y-%m-%d')*/" --include="/$(date -d '2 days ago' +'%Y-%m-%d')*/":包含当天、昨天和前天日期的文件夹。 > --exclude="*":排除其他日期的文件夹。 > --checksum:增量同步,使用文件的校验和进行比较,只传输发生变化的部分。 > --no-g:同步文件时不保留源文件的组(group)属性。 > --ignore-missing-args:当有多个rsync命令行的参数配置文件,并且其中一个文件缺少某些参数(某个文件夹缺少)时,使用--ignore-missing-args选项可以确保rsync继续执行而不中断。 **附完整的代码** ```bash #!/bin/bash 脚本将会在检测到文件变化后同步推送日志文件 每同步一次需等待一段时间再同步。 host=xx.xx.xx.xx # 目标服务器的ip(备份服务器) src=/log/ # 在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在) des=xxxx # 自定义的模块名,需要与目标服务器上定义的同步名称一致 user=admin # 执行数据同步的用户名 inotifywait=/usr/bin/inotifywait # 设定同步时间间隔(秒) interval=3600 # 当前日期 current_date=$(date +'%Y-%m-%d') # 昨天的日期 yesterday_date=$(date -d 'yesterday' +'%Y-%m-%d') # 前天的日期 two_days_ago_date=$(date -d '2 days ago' +'%Y-%m-%d') $inotifywait -mrq --timefmt '[%Y%m%d %H:%M:%S]' --format '%T %w%f%e' -e modify,delete,create,attrib $src \ | while read files;do # 只对比同步当天、昨天和前天日期的文件夹 增量同步 rsync -azvP --port 9879 --timeout=600 --include='*/' --include="$current_date/**" --include="$yesterday_date/**" --include="$two_days_ago_date/**" --exclude='*' --no-g --checksum --ignore-missing-args $src $user@$host::$des echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 # 等待一段时间后再同步 sleep $interval done ``` 上面的代码还有问题,发现当天文件夹推送可以之后就不行了,改成用定时任务吧。 或者脚本改成 ```bash while true do # 只对比同步当天、昨天和前天日期的文件夹 增量同步 rsync -azvP --port 9879 --timeout=600 --include='*/' --include="$current_date/**" --include="$yesterday_date/**" --include="$two_days_ago_date/**" --exclude='*' --no-g --checksum --ignore-missing-args $src $user@$host::$des echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 # 等待一段时间后再同步 sleep $interval done ``` ## 补充 https://blog.51cto.com/welcomeweb/2131116 最后修改:2023 年 12 月 15 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏