rsync 同步文件
rsync是一个文件同步工具,只传输文件不同的部分所以速度较快,用法大致分为三种,以本地复制文件的方式、使用ssh来同步远程文件,以服务的形式来同步文件。
同步远程日志到本地
需要在远程开启rsync服务,然后用本地的rsync去同步远程的文件。
服务端配置:/etc/rsyncd.conf
# 运行rsync的用户,是linux的用户,这个用户需要有被同步文件的读权限,否者会报 Permission denied (13) # 如果要用普通用户来运行可以将普通用户加入到被同步文件的组中usermod -G nginx qiyang uid = root gid = root use chroot = no max connections = 4 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 [log] # 模块名称,后面同步文件时以模块名来指定同步源 read only = yes # 是否只读 path = /var/log/nginx/ # 要同步文件的目录位置 comment = nginx_log # 随便写 auth users = qiyang # 非linux用户,允许的用户,和下面的secrets file里面的用户对应 secrets file = /etc/rsync.pas # 用来同步文件的用户,非linux用户,格式为 user:pass 权限为 600 hosts allow = 192.168.1.0/24,192.168.2.10 # 允许的IP,可以是网段,或单个IP
开启服务端的rsync服务:
systemctl start rsyncd.service
在客户端使用如下命令:可以加入定时任务
rsync -aP --delete qiyang@192.168.1.161::log /var/log/nginx/ --password-file=/etc/rsync.pas
参数:
--delete 删除远程端没有的本地还存在的文件
-a 递归复制
-P 详细显示
qiyang@192.168.1.161::log 这个log就是模块名称,前面有两个冒号,以这个模块的配置作为数据源
/var/log/nginx/ 同步到本地的目录
--password-file=/etc/rsync.pas 指定密码文件的位置,密码文件只要写密码即可,不写用户名,权限为600
通过ssh用法
以ssh形式来传输文件:会提示输入密码,做免秘钥即可,将本地的秘钥 ssh-copy-i 到远程即可。
rsync -av -e ssh user@hostname:/tmp/text.txt /tmp
-e 使用ssh协议
示例:
复制本地文件到远程:
rsync -av -e "ssh -i usa.pem" mysql.tar.gz root@192.168.1.10:/home/user/
复制远程文件到本地:
rsync -av -e "ssh -i usa.pem" root@192.168.1.10:/home/user/mysql.tar.gz ./
复制命令
作为复制命令:
rsync -av src/ dest/ rsync -av src dest/
rsync -av IP:/data/test/src/ dest/ --远程同步至本地
rsync -av src/ IP:/data/test/dest/ --本地文件同步至远程
-a 递归方式传输文件
-v 显示
备份应用文件的示例:
#!/bin/bash export TODAY=`date +%Y-%m-%d` export YESTERDAY=`date "+%Y-%m-%d" -d '1 day ago'` export BASEDIR=/root/confluence/files export DEST=${BASEDIR}/confluence-$TODAY export LINKDEST=${BASEDIR}/confluence-$YESTERDAY if [ ! -d $LINKDEST ]; then mkdir $LINKDEST fi rsync -av --delete --exclude="backups/*" --link-dest $LINKDEST 192.168.199.67:/var/atlassian/application-data/confluence $DEST > ${BASEDIR}/${TODAY}.log
参考文章:
ruanyifeng.com/blog/2020/08/rsync.html
定时同步
简单同步数据:
rsync -av 192.168.199.35:/root /data
源目录删备份目录也删:
rsync -av --delete 192.168.199.35:/root /data
实时同步
inotify是内核的一个功能。
查看是否有inotify功能:
]# grep -i inotify /boot/config-3.10.0-1062.4.1.el7.x86_64 CONFIG_INOTIFY_USER=y
相关参数:
]# ls -l /proc/sys/fs/inotify 总用量 0 -rw-r--r-- 1 root root 0 10月 29 21:48 max_queued_events -rw-r--r-- 1 root root 0 10月 29 21:48 max_user_instances -rw-r--r-- 1 root root 0 10月 29 21:48 max_user_watches
max_queued_events 事件列表的最大长度
max_user_instances 每个用户创建inotify实例的最大值
max_user_watches 可监视文件的总数量
修改参数:
vim /etc/sysctl.conf fs.inotify.max_queued_events=60000 fs.inotify.max_user_watches=100000
应用参数:
]# sysctl -p fs.inotify.max_queued_events = 60000 fs.inotify.max_user_watches = 100000
查看参数:
]# cat /proc/sys/fs/inotify/max_queued_events 60000 ]# cat /proc/sys/fs/inotify/max_user_watches 100000
安装工具包:
]# yum install inotify-tools -y
inotifywait:监控内容变化
-m 持续监控
-d 以守护进程运行
-r 递归监控
-o 输出日志到目录
-e 指定监听的事件
-q 不输出某些日志
--exclude 排除监控的文件或目录
--timefmt 输出时间
--format 输出指定格式
监控某个文件夹:当文件夹里面的内容发生变化就会输出如下内容。
]# inotifywait -m /root/temp1/ Setting up watches. Watches established. /root/temp1/ OPEN,ISDIR
以特定的格式输出监控信息:
]# inotifywait -mr --timefmt "%Y-%m-%d %H:%M:%S" --format "%T%w%f event: %;e" /root/temp1/
只监控某些特定的事件:
]# inotifywait -mrq --timefmt "%Y-%m-%d %H:%M:%S" --format "%T%w%f event: %;e" -e create,delete,moved_to,close_write,attrib /root/temp1/
inotifywatch:文件发生变化次数的统计
rsync守护进程:
systemctl start rsyncd.service
配置文件:默认监听在873端口
vim /etc/rsyncd.conf [backup] path = /root/temp1 read only = no # 指定目录可写可读
设置目录权限:
]# setfacl -m u:nobody:rwx /root/temp1/ # 穿过来的文件属主数组都是nobody
客户端运行:查看配置
]# rsync rsync://192.168.199.183 # 格式一 backup ]# rsync 192.168.199.183:: # 格式二 backup
将本地文件传送到服务端:
]# rsync /etc/hosts root@192.168.199.183::backup # 这里用root用户来传送 ]# rsync /etc/hosts 192.168.199.183::backup # 用户名写不写都一样
将服务端的文件拉取到本地:
rsync 192.168.199.183::backup/hosts ./
自动同步脚本:
#!/bin/bash export BACKUPDIR=/root/temp1/ inotifywait -mrq --timefmt "%Y-%m-%d-%H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib $BACKUPDIR | while read DATE FILE EVENT ACTION do echo ${DATE} - $FILE - $EVENT:$ACTION # rsync 操作 done
参考:
segmentfault.com/a/1190000039190702 cloud.tencent.com/developer/article/1373541
ssh秘钥登录同步:
使用秘钥登录到远程,将远程数据同步到本地:
#!/bin/bash /usr/bin/rsync -avz --delete -e "ssh -i /root/.ssh/z-vietnam.pem" ec2-user@12.23.13.23:/var/log/nginx/ /data/nginx01/ /usr/bin/rsync -avz --delete -e "ssh -i /root/.ssh/z-vietnam.pem" ec2-user@21.21.21.21:/var/log/nginx/ /data/nginx02/ function snedmsg { CONTENT=$1 curl "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxx" \ -H 'Content-Type: application/json' \ -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"${CONTENT}\" }}" echo -e } snedmsg "nginx01:\n`ls /data/nginx01/;`\n-----\nnginx02:\n`ls /data/nginx02/`"