文件实时同步nfs+rsync+inotify
时间:2020-04-16 21:43 来源:潇湘夜雨 作者:华嵩阳 点击:次
一、NFS共享服务
1.安装nfs服务器:
yum install nfs-utils -y
2.配置nfs服务器:
vim /etc/exports
/backup 172.18.109.192/26(rw,sync,all_squash)
一般这配置就可以
rw:read-write,可读写; 注意,仅仅这里设置成读写客户端还是不能正常写入,还要正确地设置共享目录的权限,参考问题5
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
[root@hadoop-master ~]# service nfs start
启动 NFS 服务: exportfs: No options for /backup 172.18.109.0.*(rw,sync,all_squash): suggest 172.18.109.0.*(rw,sync,all_squash)(sync) to avoid warning
[确定]
关掉 NFS 配额: [确定]
启动 NFS mountd: [确定]
启动 NFS 守护进程: [确定]
正在启动 RPC idmapd: [确定]
[root@hadoop-master ~]# netstat -tnlp |grep 2049
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 :::2049 :::* LISTEN -
3.查看nfs服务器和客户端配置参数:
cat /var/lib/nfs/etab (服务端)
cat /proc/mounts (客户端查看挂载情况,卡住的情况必须用这个命令查看,不要用df -h)
showmount -e 172.18.109.235 #查看nfs共享目录
Export list for 172.18.109.235:
/backup 172.18.109.192/26
4.客户端挂载测试
mount -t nfs 172.18.109.235:/backup /share/
[root@hadoop2 ~]# mount
172.18.109.235:/backup on /share type nfs (rw,vers=4,addr=172.18.109.235,clientaddr=172.18.109.237)
此时客户端只能读,不能再共享目录中写。
5.客户端的写权限
chown -R nfsnobody.nfsnobody /backup/
二、RSYNC共享服务
1.rsync简介
比其cp、tar备份的方法,rsync的优点是,安全性高、备份迅速、支持增量备份。只能做对实时性要求不高
的数据备份,例如:备份文件服务到远端从服务器、在本地磁盘上做数据镜像等 增量备份:就是rsync同步
数据时,需要扫描所有文件后进行比对,进行差量传输。但是对于大量文件达到千万量级别时,扫描所有文
件是非常耗时的。 如果发生改变的只是其中的一小部分的话,这是非常低效的方式。
rsync 不能实时的去监测,同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,两次触发动作一
定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。
rsync 是通过 crontab 守护进程进行触发,同步数据会有差异
2.工作模式
rsync命令的工作模式有四种:
1、shell模式,也称为本地模式,速度要比cp快
2、远程shell模式,其可以借助于ssh协议承载其数据传输过程
3、列表模式,其工作方式与ls相似,仅列出源的内容:-nv
4、服务器模式,此时,rsync可以工作为守护进程,能够接收客户端的数据传输请求,在使用时可以在客
户端使用rsync命令发送给守护进程,也可以向服务器主获取文件。
3.rsync的服务器模式的配置文件/etc/rsyncd.conf:
查看帮助 man rsyncd.conf
#rsync.conf start###
uid = nfsnobody
gid = nfsnobody
use chroot = no
max connections = 2000
timeout = 600
#strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts deny = 172.18.109.237
hosts allow = 172.18.109.0/24
auth users = rsync_backup #虚拟用户
secrets file = /etc/rsync.password
########################################
[backup]
comment = linux1 backup #欢迎语
path = /backup
echo "rsync_backup:123456" > /etc/rsync.password #创建密码文件
chmod 600 /etc/rsync.password #修改密码文件的权限
mkdir /backup #创建配置文件中的共享目录
chown -R nfsnobody.nfsnobody /backup/ #设置共享目录的用户权限,一定要设置正确,否则传输会报错。
4.启动rsync的服务端:
rsync --daemon
5.rsync客户端的配置:
echo "123456" >/etc/rsync.password #创建客户端密码文件(只要写密码不要用户)
chmod 600 /etc/rsync.password
[root@hadoop1 ~]# rsync -avz --delete /rsync1/ rsync_backup@172.18.109.235::backup --password-file=/etc/rsync.password (将rsync1目录中的文件推送到服务端并删除服务端多余的文件)
sending incremental file list
deleting test.txt
sent 43 bytes received 8 bytes 102.00 bytes/sec
total size is 2691 speedup is 52.76
6.rsync命令用法
rsync命令的选项:
-n:如果担心命令执行不正确,一同步复制,可能这个复制的后果是致命的,那后果可就严重了,这里我们可以加-n先测试一下
-v: --verbose,详细输出模式、显示详细过程的
-q: --quiet,静默模式,尽可能输出少的信息
-c: --checksum,可以对传输的文件进行较验的,强制对文件传输进行校验
-r: --recursive,递归复制
-a: --archives,归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性、如访问控制列表
-p: --perms,保存文件的权限
-t: --times,保留文件的时间戳
-l: --links,保留文件的符号链接
-g: --group,保留文件的属组
-o: --owner,保留文件的属主
-D: --devices,保留设备文件
-e SSH:远程复制时,表示使用ssh协议作承载
-z:基于网络时使用,对文件压缩后传输
--progress:显示压缩进度条的
--stats:显示如何执行压缩和传输的,也就是显示传输状态的
注意:rsync命令使用中,如果源参数的末尾有斜线,就会复制指定目录内容,而不复制目录本身;没有斜线,则会复制目录本身,因此有如下命令:
# rsync -r /mydata/data /backups/:会把目录data直接同步至/backups目录中去
# rsync -r /mydata/data/ /backups/:会把目录中的data/中的内容同步至/backups目录中
7、常见问题 rsync同步缓慢问题:日志报错 name lookup failed for 172.18.89.169: Temporary failure in name resolution 解决方法:添加ip的本地hosts解析 rsync通配符传输特定文件:rsync -avz /web/nginx/logs/$i.access_$(date +%Y%m)* 172.18.80.37::weblog/$i/web1
rsync本地用法:
# cd /etc /tmp/
# rsync /tmp/etc/passwd /tmp/test/passwd -nv
[root@hadoop2 ~]# rsync -r rsync_backup@172.18.109.235::backup/sh rpmbuild/ --password-file=/etc/rsync.password #复制服务端的文件夹
[root@hadoop2 ~]# ls -lh rpmbuild/
drwxr-xr-x 2 root root 4.0K 11月 16 16:27 sh
[root@hadoop2 ~]# rsync -a rsync_backup@172.18.109.235::backup/hadoop1 rpmbuild/ --password-file=/etc/rsync.password #复制时可以保存原有的属主属主等属性信息
[root@hadoop2 ~]# ls -lh rpmbuild/
总用量 20K
drwxr-xr-x 2 502 502 4.0K 11月 16 16:29 hadoop1 #复制后目录的用户和属组id仍然和服务端一样
二、inotify服务
异步的文件系统事件监控机制
Inotify 可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件
就可以监控文件系统下文件的各种变化情况,而 inotify-tools 就是这样的一个第三方软件 ,inotify 可以监
控文件系统的各种变化,当文件有任何变动时,就触发rsync 同步,这样刚好解决了同步数据的实时性问题。
[root@hadoop-master inotify-tools-3.14]# ls -l /proc/sys/fs/inotify/ #查看当前系统是否支持inotify
总用量 0
-rw-r--r-- 1 root root 0 11月 16 15:33 max_queued_events
-rw-r--r-- 1 root root 0 11月 16 15:33 max_user_instances
-rw-r--r-- 1 root root 0 11月 16 15:33 max_user_watches
1.在客户端上安装inotify:
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
./configure
make&&make install
2.监听/tmp/目录的增,删,改操作并按格式打印:
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete,move,close_write /backup/
测试结果:
16/11/16 15:42 /backup/.master.sql.dexlH3
16/11/16 15:42 /backup/.master.sql.dexlH3
3.使用inotify监听目录实时rsync同步脚本:
vim inotify.sh
#!/bin/bash
inotify=/usr/local/bin/inotifywait
$inotify -mrq --format '%w%f' -e create,delete,move,close_write /rsync1/ \
|while read file
do
rsync -az --delete /rsync1/ rsync_backup@172.18.109.235::backup --password-file=/etc/rsync.password
done
[root@hadoop1 ~]# sh inotify.sh & #后台运行脚本
[1] 3292
[root@hadoop1 ~]# jobs
[1]+ Running sh inotify.sh &
4.优化inotify参数:
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
[root@web ~]# ll /proc/sys/fs/inotify/
总用量0
-rw-r--r--1 root root 09月923:36 max_queued_events
-rw-r--r--1 root root 09月923:36 max_user_instances
-rw-r--r--1 root root 09月923:36 max_user_watches
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------
默认值如下:
[root@hadoop1 ~]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@hadoop1 ~]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@hadoop1 ~]# cat /proc/sys/fs/inotify/max_user_watches
8192
可以根据实际情况调整参数:
echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
echo 50000000>/proc/sys/fs/inotify/max_queued_events
|