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/`"