运维同步工具:scp,nfs,sftp,http,samba(windows和linux之间),rsync,csync,drbd(基于文件系统)等
1. Rsync
rsync是一款开源,快速,多功能的可实现增量的本地或远程的数据镜像同步备份的优秀工具。
功能一:
可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步镜像,远程备份等功能。适合linux/windows等系统
功能二:
可以再本地主机的不同分区或目录之间进行全量或者增量的复制数据
注意:
rsync的目的是实现本地主机和远程主机上之间的数据快速复制同步镜像,远程备份的能力(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步。但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。
功能一:类似于scp命令,但是scp每次都是全量拷贝,而rsync可以进行增量拷贝,scp拷贝数据时加密的,但是rsync是不加密的。
功能二:有类似于cp命令,但是cp每次都是全量拷贝,而rsync可以进行增量拷贝
rsync还可以实现文件和目录的删除功能,这又是相当于RM命令,rsync相当于scp,cp,rm命令。并且还由于他们。
在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
2.Rsync特性
1)支持拷贝特殊文件如链接,设备,属组,权限等 2)可以有排除指定文件或目录同步的功能,相当于打包命令tar 3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。 4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高 5)可以使用rcp,rsh,ssh等方式来配合传输文件(rsync本身不对传输数据加密),也可以通过直接的socket链接(有服务端和客户端) 6)支持匿名(不需要超级用户权限)的或认证的进程模式传输,方便进行数据备份及镜像。
3.Rsync工作方式
(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。类似于cp命令的功能
(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。类似于scp命令的功能,基于ssh通道来传输数据
(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。这是rsync自身最重要的功能,socket守护进程
前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。
安装
yum -y install rsync #启动rsync服务 systemctl start rsyncd.service systemctl enable rsyncd.service #检查是否已经成功启动 netstat -lnp|grep 873
3.0 rsync参数
紫色字符表示不固定,根据自己需求调整。红色字符表示警告。
-a 归档模式传输, 等于-tropgDl -v 详细模式输出, 打印速率, 文件数量等 -z 传输时进行压缩以提高效率 -r 递归传输目录及子目录,即目录下得所有目录都同样传输 -t 保持文件时间信息 -o 保持文件属主信息 -p 保持文件权限 -g 保持文件属组信息 -l 保留软连接 -P 显示同步的过程及传输时的进度等信息 -D 保持设备文件信息 -L 保留软连接指向的目标文件 -e 使用的信道协议,指定替代rsh的shell程序 --exclude=PATTERN 指定排除不需要传输的文件模式 tar命令的排除也是--exclude -X==--exclude-from=FILE --exclude-from=file 文件名所在的目录文件 --bwlimit=100 限速传输 --partial 断点续传 --delete 让目标目录和源目录数据保持一致 谨慎使用
--bwlimit 限速
生产环境参数:
-avzP 相当于-vzrtopgDlP,还多了Dl的功能,生产环境里面可以把-v和-P去掉,P可以用--progress代替
-avz 相当于 -vzrtopg,这是生产参数
中文参数介绍 英文参数介绍
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 :检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
--remove-source-files:要求删除源端已经成功传输的文件。
3.1 rsync数据传输模式
本地数据传输模式(lcoal-only mode),单个主机之间传送,类似cp命令
Local: rsync [OPTION...] SRC... [DEST] 复制 [root@node1 /]# rsync /etc/hosts /tmp #将/etc/hosts推送到/tmp目录,相当于cp /etc/hosts /tmp cp -a 相当于 cp -drp #-r目录全都赋值,-p保持文件属性,-d设备 参数介绍: -v 详细模式输出,传输式的进度等信息 -z --compress 传输式进行压缩以提高传输效率,--compress-level=1,可按级别压缩 [root@node1 /]# rsync -avz /etc/hosts /tmp #当此命令在执行一次时,就不在copy了,体现了rsync的增量copy, sending incremental file list host sent 175 bytes received 35 bytes 420.00 bytes/sec total size is 221 speedup is 1.05 删除目录里面的内容 新建空目录 mkdir /null [root@node1 /]# rsync -r --delete /null/ /test/ #相当于rm命令 /null/目录里面有什么/test/目录里面就有什么,/null/为空/test/也为空,实际上是删除复制,这个--delete命令有危险 注意:/null/必须加上最后斜线,不加的话代表/null和目录里面的内容,如果加上的话,只表示目录里面的东西
====================================================================================================================================================================
远程数据传输模式,ssh通道数据传输,类似于scp命令,一般设置免秘钥登录 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 下载(拉) 借助ssh通道从远程主机拉取数据 [root@node1 /]# rsync -avz -e 'ssh -p 22' root@192.168.10.232:/tmp/1.txt /tmp 参数说明: 1)-avz相当于-vzrtopgDl,表示同步时文件和目录的属性不变, 2)-P显示同步过程,可以用--progress替换 3)-e 'ssh -p 22'表示通过ssh的通道传输数据 -p 22 可以省略 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 上传(推) 借助ssh通道向远程主机推送文件 [root@node1 /]# rsync -e 'ssh -p 22' /test/dads.txt root@192.168.10.232:/tmp #相当于scp命令 借助ssh通道向远程主机推送文件夹 [root@node1 /]# rsync -avz -e 'ssh -p 22' /test/ root@192.168.10.232:/tmp/ #通过root用户把本地目录/test/,不包括目录本身推送到192.168.10.231的/tmp
====================================================================================================================================================================
重点
Access via rsync daemon: 守护进程方式传输
Rsync daemon数据传输(通过守护进程的方式),端口为873
服务器端配置
1.配置文件:/etc/rsyncd.conf
##rsyncd.conf start##
uid = rsync # 用户好像也是nodobody,nfs的uid和gid是65534
gid = rsync
use chroot = no # 防止安全问题,假根
max connections = 200 # 同时最大多少客户端连接
fake super = yes #rsync将通过对附加在每个文件上的扩展属性(根据实际需要)的保存/恢复来模拟super user。
timeout = 300 # 超时时间,默认s
pid file = /var/run/rsyncd.pid # rsync系统进程号,就是pid所在的文件
lock file = /var/run/rsync.lock # rsync传输数据的锁
log file = /var/log/rsyncd.log # 日志文件
[backup] # 模块名称
path = /backup/ # 模块路径,相当于客户端上传和下载的目录
ignore errors # 忽略错误信息
read only = false # 对备份数据可读可写
list = false # 不允许查看模块信息
hosts allow = 192.168.10.0/24 # 允许的主机
hosts deny = 0.0.0.0/32 # 拒绝的主机
auth users = rsync_backup # rsync虚拟用户,不是系统用户
secrets file = /etc/rsync.password # 用户对应的密码文件
#rsync_config_______________end
2.创建用户及备份目录
[root@node1 /]# useradd rsync -s -M /sbin/nologin 创建运行rsync服务的用户,不允许登录,不创建家目录
[root@node1 /]# mkdir /oldboy -p 创建备份目录,尽可能的大 [root@node1 /]# chown -R rsync.rsync /oldboy 授权备份目录以rsync为属组
[root@node1 /]# echo "rsync_backup:123456" >/etc/rsync.password 创建虚拟用户密码文件,用户客户端连接使用时的用户,密码为1
[root@node1 /]# chmod 600 /etc/rsync.password 降低权限,保证安全,权限太高可能导致传输失败,权限必须600以下
启动rsync daemon功能
rsync --daemon(表示以守护进程的方式启动) 等价于systemctl start rsyncd
systemctl enable rsyncd
3.检查对应端口
netstat -nltp |grep 873
客户端配置:
1.保证安装了rsync软件
2.将服务器端的虚拟用户的密码发送到客户端,用于以后不输入密码进行推送
[root@node2 ~]# echo "123456" >/etc/rsync.password
[root@node2 ~]# chmod 600 /etc/rsync.password
注意:以后的数据流向一定是客户端流向服务端的,也就是执行命令的地方一定是在客户端,服务端就是一个守护进程,由客户端去推送或拉取
Rsync daemon数据传输实践
从服务端拉取数据
第一种方式
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync -avz rsync_backup@192.168.10.231::oldboy /data
命令 参数 虚拟用户 服务器IP地址 服务端模块名称 将拉取的数据备份到什么地方
rsync -avz rsync_backup@192.168.10.231::oldboy /data --password-file=/etc/rsync.password #shell脚本里面自动输入密码
第二种方式
rsync -avz rsync://rsync_backup@192.168.10.231/oldboy /data --password-file=/etc/rsync.password
向服务端推数据
第一种方式
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync -avz /data/ rsync_backup@192.168.10.231::oldboy #如果只是推/data里面的内容就不加/,如果连目录一起推过去就加/
第二种方式
rsync -avz /data/ rsync://rsync_backup@192.168.10.231/oldboy --password-file=/etc/rsync.password
3.2 rsync常见故障
1.服务未开启 systemctl start rsyncd netstat -nltp 2.防火墙和selinux未关闭,或者未设置 sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config systemctl disable firewalld systemctl stop firewalld 3.密码输入错误 4.命令格式错误,或者命令输入错误 5.密码权限600,服务端和客户端都是 chmod 600 /etc/rsync.password 6.rsync配置文件配置错误,配置文件叫rsyncd.conf,而密码文件是rsync.password,不要多加d vi /etc/rsyncd.conf 7.备份文件属组错误 chown -R rsync.rsync /backup/
8.出错的话要查看/var/log/rsyncd.log
9.添加到/etc/rc.local里面 echo "/usr/bin/rsync --daemon" >>/etc/rc.local
3.3 rsync排除推送
--exclude=排除目录 排除很少的目录 --exclude-from=排除文件 排除很多
客户端排除
向192.168.10.231的oldboy目录推送data目录里面的数据,排除data目录里面的a和b
rsync -avz --exclude={a,b} /data/ rsync_backup@192.168.10.231::oldboy
向192.168.10.231的oldboy目录推送data目录里面的数据,排除data目录里面的a到z
rsync -avz --exclude={a..z} /data/ rsync_backup@192.168.10.231::oldboy
向192.168.10.231的oldboy目录推送data目录里面的数据,排除paichu.log里面的文件(在n多要排除的,把名字追加到里面,加上参数)
rsync -avz --exclude-from=paichu.log /data/ rsync_backup@192.168.10.231::oldboy
服务端排除
exclued = a b tets/1.txt #在配置文件里面写入,并重启服务
在客户端来去和推送时都排除了a和b
杀死进程
kill `cat /var/run/rsyncd.pid`
pkill rsync
3.4无差异同步
--delete
rsync推送企业工作场景
1)备份
客户端有啥,服务器就有啥,客户端没有的,服务器有也要删除,服务器短的目录可能会丢失
rsync拉取企业工作场景
1)代码发布,下载等。
服务器有啥,客户端就有啥,服务器没有的,客户端有也要删除,客户端的目录可能会丢失
3.x 未解决问题
在查看rsync服务时,发现时已root权限启动的,因为配置文件里面已经写了rsync用户,不知道为什么没生效
https://bbs.csdn.net/topics/350027210
在修改了rsync端口之后还是root启动的,网上说是小于1024的端口,只能是root权限启动
[root@node1 data]# lsof -i :873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsync 16319 root 4u IPv4 1345670 0t0 TCP *:rsync (LISTEN)
rsync 16319 root 5u IPv6 1345671 0t0 TCP *:rsync (LISTEN)
[root@node1 data]#
2. Inotify简介
1.inotify起源
如果要实现定时同步数据,可以在客户端将rsync加入定时任务,但是定时任务的同步时间粒度并不能达到实时同步的要求,并且在服务器的文件数量达到了百万到千万量级的话,那么文件的比对是非常耗时的也非常低效
2.inotify实现工具
inotify实现工具有几款:inotify本身、sersync、lsyncd。其中sersync是金山的周洋开发的工具,克服了inotify的缺陷,且提供了几个插件作为可选工具。此处先介绍inotify的用法以及它的缺陷,通过其缺陷引出sersync,并介绍其用法。
3.inotify原理,是一种linux内核的一种文件系统监控机制
inotify是一种强大的细粒度的异步的文件时间监控机制,linux内核在2.6.13起,就增加了对inotify的支持,通过intofity机制,能够对文件系统的变化进行监控,如对文件进行创建、删除、修改等操作,可以及时通知应用程序进行相关事件的处理。
利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样的监控软件。而通过inotify和rsync可以进行实施同步
inotify进程会监控文件系统的变化,如果变化,就设置触发同步,通过rsync同步到远端服务器。在这里我们只是将inotify用到了实时同步,inotify也可以有很多应用场景
inotify安装
1.由于inotify是和rsync一起支持实时同步的,所以先检查是否在安装了rsync,以守护进程方式启动(rsyncd --daemon),能正确的推拉数据。
[root@node2 /data]# rsync -avz /data rsync://rsync_backup@192.168.10.231/oldboy --password-file=/etc/rsync.password
sending incremental file list
data/
data/asdasdas
24 bytes 4,334.00 bytes/sec
total size is 1,619 speedup is 0.7
2.确定内核版本
[root@node2 /data]# uname -r
3.10.0-693.el7.x86_64
3.配置地点
一点要在客户端配置,不要配置错误
4.查看系统是否支持inotify的监控
[root@node2 tmp]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Feb 11 19:57 max_queued_events #调用inotify_init时分配到inotify instance中可排队的event数的最大值,超出值时的事件被丢弃,但会触发队列溢出Q_OVERFLOW事件。
-rw-r--r-- 1 root root 0 Feb 11 19:57 max_user_instances #每一个real user可创建的inotify instances数量的上限。
-rw-r--r-- 1 root root 0 Feb 11 19:57 max_user_watches #每个inotify实例相关联的watches的上限,即每个inotify实例可监控的最大目录、文件数量。如果监控的文件数目巨大,需要根据情况适当增加此值。
5.下载源码包并编译安装
epel源上提供了inotify-tools工具,或者下载源码包格式进行编译。
inotify-tools源码包地址:https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
编译安装
tar -zxvf inotify-tools-3.14.tar.gz && cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify-tools-3.14
make && make install
cd ../ && ln -s /usr/local/inotify-tools-3.14 /usr/local/inotify
6.inotify-tools工具命令
[root@node2 /usr/local/inotify]# ll bin
total 116
-rwxr-xr-x 1 root root 60896 Nov 7 17:06 inotifywait #inotifywait命令用于等待文件发生变化,所以可以可以实现监控(watch)的功能,该命令是inotify的核心命令
-rwxr-xr-x 1 root root 55176 Nov 7 17:06 inotifywatch #inotifywatch用于收集文件系统的统计数据,例如发生了多少次inotify事件,某文件被访问了多少次等等,一般用不上。
7.简单的监控脚本
#!/bin/bash
#2018年11月7日18:31:26
cmd="/usr/local/inotify-tools-3.14/bin/inotifywait"
$cmd -mrq --format '%w%f' -e create,close_write,delete /data |\
while read line
do
rsync -az --delete $line rsync_backup@192.168.10.231::oldboy --password-file=/etc/rsync.password
done
8.inotify的并非每秒钟大概是200-300左右