NFS+RSYNC+INOTIFY完整实时双向同步测试

来源:本站原创 Linux 超过69 views围观 0条评论

 

———-安装NFS服务————-

[root@OAtest02 ~]# yum install -y nfs-utils rpcbind
Downloading Packages:
(1/4): libtirpc-0.2.1-13.el6_9.x86_64.rpm                                                              
(2/4): nfs-utils-1.2.3-75.0.3.el6.x86_64.rpm                                                           
(3/4): python-argparse-1.2.1-2.1.el6.noarch.rpm                                                        
(4/4): rpcbind-0.2.0-13.el6_9.1.x86_64.rpm                                                             
——————————————————————————————————–

mkdir -p /home/rsyncuser/weavertest
cd /home/rsyncuser/weavertest
chown 3333:3333 1

[root@OAtest02 nfs]# vim /etc/exports

/home/rsyncuser/weavertest 192.0.0.0/8(rw,no_root_squash,all_squash,sync,anonuid=3333,anongid=3333)

注:配置文件说明:
/home/rsyncuser/weavertest 为共享目录
172.0.0.0/16  可以为一个网段,一个IP,也可以是域名,域名支持通配符 如: *.qq.com
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
测试如下 匿名无写权限 touch: cannot touch ‘1’: Permission denied
anonuid:匿名用户的UID值,可以在此处自行设定。
anongid:匿名用户的GID值。
————权限完整测试————–
测试配置
/root/weavertest/nfs 192.0.0.0/8(rw,no_root_squash,all_squash,sync,anonuid=3333,anongid=3333)

[root@OAtest02 nfs]# id 3333 ———3333定义为匿名用户
id: 3333: No such user
[root@OAtest02 nfs]# mkdir 1 ——创建1目录
[root@OAtest02 nfs]# chown 3333:3333 1  ——权限负给3333用户
[root@OAtest02 nfs]# ll
total 103668
drwxr-xr-x. 2 3333 3333      4096 Sep 28 15:32 1    —确认
-rw-r–r–. 1 root root 106070960 Sep 28 15:26 locale-archive
[root@OAtest02 nfs]# ll
total 103668
drwxr-xr-x. 2 3333 3333      4096 Sep 28 15:33 1   
-rw-r–r–. 1 root root 106070960 Sep 28 15:26 locale-archive —–ROOT权限才能写
[root@OAtest02 nfs]#
[root@OAtest02 1]# ll
total 103664
-rw-r–r–. 1 3333 3333         0 Sep 28 15:33 1   —从客户端写过来的数据,用户ID 全为3333
-rw-r–r–. 1 3333 3333 106070960 Sep 28 15:33 locale-archive   ——同上

————–开启NFS服务—————————–
systemctl start rpcbind
systemctl start nfs
systemctl enable rpcbind
systemctl enable  nfs
showmount -e 127.0.0.1

 

[root@OAtest02 nfs]# exportfs -r  —–使生效,修改配置后都需要刷新

[root@OAtest02 nfs]# showmount -e 127.0.0.1
clnt_create: RPC: Program not registered   —–服务没开
[root@OAtest02 nfs]# service rpcbind start  —开服务
[root@OAtest02 nfs]# service nfs start  —开服务
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
[root@OAtest02 nfs]# chkconfig rpcbind on  —开机启动
[root@OAtest02 nfs]# chkconfig nfs on  —开机启动
[root@OAtest02 nfs]# showmount -e 127.0.0.1  查看能挂载的目录
Export list for 127.0.0.1:
/weaver/nfs 172.0.0.0/16

LINUX客户端挂载
[root@shtselk01 ~]# showmount -e 172.16.1.29    —-默认无命令
-bash: showmount: command not found
[root@shtselk01 ~]# yum install -y nfs-utils    ——安装客户端
mount -t nfs  172.16.1.29:/weaver/nfs /mountnfs/   —挂载

[root@shtselk01 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
172.16.1.29:/weaver/nfs  246G  390M  233G   1% /mountnfs  —-挂载成功

vi /etc/fstab
172.16.1.29:/weaver/nfs /mountnfs/ nfs defaults 0 0

 

————-安装同步工具rsyncp————————–

[root@mysql02 nfs]# yum install rsync -y

创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为“username:password”,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600,这在前面的模块参数做了详细介绍。

测试
服务端配置
1.配置rsync
[root@mysql01 1]# vim /etc/rsyncd.conf
uid = 3333
gid = 3333
max connections = 400
pid file = /var/run/rsyncd.pid
log file=/var/log/rsyncd.log

[nfsrsynctest]
        path = /root/weavertest/nfs/1/
         # 有错误时忽略
         ignore errors
         # 可读可写(true或false)
         read only = false
         # 阻止远程列表(不让通过远程方式看服务端有啥)
         list = false
         # 允许IP
         hosts allow = 192.0.0.0/8
         # 禁止IP
         hosts deny = 0.0.0.0/32
         # 虚拟用户,需与password文件一致
         auth users = cao
         # 存放用户和密码的文件
         secrets file = /etc/rsync.password
2.服务端配置RSYNC帐号密码
只有服务端需要这格式 username:password
[root@mysql01 1]# vim /etc/rsync.password
cao:caocaocao
修改文件权限。
chmod 600 /etc/rsync.password
重启服务
systemctl restart rsyncd

注:客户端的密码文件只需要写密码
[root@mysql02 2]# !vim
vim 1.pas
123456

 
客户端测试
[root@mysql02 2]# rsync -avz –progress cao@192.168.142.138::nfsrsynctest .
Password:
receiving incremental file list
./
1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=6/8)
2
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=5/8)
3
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=4/8)
4
           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=3/8)
5
           0 100%    0.00kB/s    0:00:00 (xfer#5, to-check=2/8)
6
           0 100%    0.00kB/s    0:00:00 (xfer#6, to-check=1/8)
222/

sent 182 bytes  received 384 bytes  226.40 bytes/sec
total size is 0  speedup is 0.00
[root@mysql02 2]#

免密码登陆

注:客户端的密码文件只需要写密码
[root@mysql02 2]# !vim
vim 1.pas
123456

[root@mysql02 2]# rsync -avz –password-file=/root/weavertest/nfs/2/1.pas . cao@192.168.142.138::nfsrsynctest sending incremental file list
./

sent 111 bytes  received 12 bytes  246.00 bytes/sec
total size is 7  speedup is 0.06
[root@mysql02 2]#

 

—————————RSYNC客户端尝试自己登陆报错
[root@mysql02 2]#  rsync -avz –progress cao@192.168.142.138::nfsrsynctest –password-file=/etc/rsync.password .
ERROR: password file must not be other-accessible  ————–
rsync error: syntax or usage error (code 1) at authenticate.c(175) [Receiver=3.0.9]
[root@mysql02 2]#

password file must not be other-accessible
continuing without password file
Password:
说明:这是因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为600。如:chmod 600 rsyncd.pwd

修改后仍然有错
[root@mysql02 2]# chmod 600 /etc/rsync.password
[root@mysql02 2]# ll !$
ll /etc/rsync.password
-rw——-. 1 root root 14 Nov  8 07:14 /etc/rsync.password
[root@mysql02 2]#  rsync -avz –progress cao@192.168.142.138::nfsrsynctest –password-file=/etc/rsync.password .
@ERROR: auth failed on module nfsrsynctest    ———————
rsync error: error starting client-server protocol (code 5) at main.c(1516) [Receiver=3.0.9]
[root@mysql02 2]#
[root@mysql02 2]#
[root@mysql02 2]#

查看服务端日志
2017/11/08 08:20:36 [5945] name lookup failed for 192.168.142.139: Name or service not known  ———没有写hosts
2017/11/08 08:20:36 [5945] connect from UNKNOWN (192.168.142.139)
2017/11/08 08:20:36 [5945] auth failed on module nfsrsynctest from unknown (192.168.142.139): password mismatch

解决方法:
注:客户端的密码文件只需要写密码——————
[root@mysql02 2]# !vim
vim 1.pas
123456

rsyncs故障汇总
http://www.jb51.net/article/31920.htm

—————-安装inotify-tools

inotifywait -mrq –format ‘%w%f’ -e delete,close_write,create /root/weavertest/nfs/1/
输入后,shell处于阻塞状态(时时监控)

在另一个窗口的/data目录进行创建,修改,删除测试:
此时我们可以发现当前处于阻塞状态的shell窗口会记录所有目录发生改变的情况

命令说明:
inotifywait:监控命令
-m:持续不断的进行监控(处于阻塞状态)
-r:递归监控,监控目录及目录的所有子目录
-q:只输出简单的监控信息
–format:指定监控数据输出的格式
-e:指定监控的事件类型
delete:删除事件
close_write:文件写入的关闭事件(其实就是监控修改文件)
create:创建事件

yum -y install inotify-tools
#开启监控模式
[root@mysql02 1]# inotifywait -mrq –format ‘%w%f’ -e delete,close_write,create /root/weavertest/nfs/1/
#以下为监控结果。
/root/weavertest/nfs/1/1
/root/weavertest/nfs/1/1
/root/weavertest/nfs/1/2
/root/weavertest/nfs/1/2
/root/weavertest/nfs/1/3
/root/weavertest/nfs/1/3

#对111进行修改
/root/weavertest/nfs/1/111
/root/weavertest/nfs/1/111
/root/weavertest/nfs/1/.111.swp
/root/weavertest/nfs/1/.111.swpx
/root/weavertest/nfs/1/.111.swpx
/root/weavertest/nfs/1/.111.swpx
/root/weavertest/nfs/1/.111.swp
/root/weavertest/nfs/1/.111.swp
/root/weavertest/nfs/1/.111.swp
/root/weavertest/nfs/1/4913
/root/weavertest/nfs/1/4913
/root/weavertest/nfs/1/4913
/root/weavertest/nfs/1/111
/root/weavertest/nfs/1/111
/root/weavertest/nfs/1/111~
/root/weavertest/nfs/1/.111.swp
/root/weavertest/nfs/1/.111.swp

#现在在远端进行写测试
[root@mysql01 1]# touch {1..100}

———-NFS挂载无反应————–
mount -t nfs  172.16.1.29:/weaver/nfs /mountnfs/

检查selinux iptables 无解
抓包  
showmount -e 172.16.1.29 有包,但挂载没包.
15:16:41.010335 IP 172.16.9.64.983 > 172.16.1.29.111: UDP, length 56
15:16:41.012167 IP 172.16.1.29.111 > 172.16.9.64.983: UDP, length 28
15:16:41.930565 IP 172.16.9.64.984 > 172.16.1.29.111: UDP, length 56
15:16:41.931187 IP 172.16.1.29.111 > 172.16.9.64.984: UDP, length 28

检查nfs服务器配置  配置错误
                     —这里是8不是16—-
/home/rsyncuser/weavertest 172.0.0.0/16(rw,no_root_squash,no_all_squash,sync,anonuid=11111,anongid=11111)

最新配置
/home/rsyncuser/weavertest 172.0.0.0/8(rw,no_root_squash,all_squash,sync,anonuid=3333,anongid=3333)

——–NFS+RSYNC+INOTIFY完整实时双向同步测试————————
两边安装NFS并开启服务   配置参考楼上
两边安装Rsync           配置参考楼上
两边安装inotifywait     配置参考楼上

两边配置专用户,这个是为了配合NFS
groupadd rsyngG -g 3333
useradd rsyncuser -G 3333 -g 3333 -u 3333

两边rsync配置

vim /etc/rsync.password
#格式 用户:密码
cao:123456
chmod 600 /etc/rsync.password

vim  /etc/rsyncd.conf
max connections = 400
pid file = /var/run/rsyncd.pid
log file=/var/log/rsyncd.log

[nfsrsynctest]
         uid = 3333
         gid = 3333
        path = /home/rsyncuser/weavertest
         # 有错误时忽略
         ignore errors
         # 可读可写(true或false)
         read only = false
         # 阻止远程列表(不让通过远程方式看服务端有啥)
         list = false
         # 允许IP
         hosts allow = 192.0.0.0/8
         # 禁止IP
         hosts deny = 0.0.0.0/32
         # 虚拟用户不是系统帐户
         auth users = cao
         # 存放本地用户及密码的文件
         secrets file = /etc/rsync.password

两边服务器配置检测目录
mkdir -p /home/rsyncuser/weavertest
chown 3333:3333 -R /home/rsyncuser/

最终测试脚本
#!/bin/bash

Path=/home/rsyncuser/weavertest   
#—-检测目录
backup_Server=192.168.142.139     
#—-远程服务器

#检测并执行脚本
/usr/bin/inotifywait -mrq –format ‘%w%f’ -e create,close_write,delete /home/rsyncuser/weavertest | while read line
do
        if [ -f $line ];then
                rsync -az $line  cao2@$backup_Server::nfsrsynctest –password-file=/etc/rsync.passwordcao2
        else
                cd $Path &&\
                rsync -az ./  cao2@$backup_Server::nfsrsynctest –password-file=/etc/rsync.passwordcao2
        fi
done
#完

进入任一台进行测试
su – rsyncuser
cd /home/rsyncuser/weavertest
touch {1..100}

进入另一台。
su – rsyncuser
cd /home/rsyncuser/weavertest
ll 进行查看。

[root@mysql02 weavertest]# ll
total 0
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 2
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 200
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 201
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 202
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 203
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 204
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 205
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 206
-rw-r–r–. 1 rsyncuser rsyngG 0 Nov  9 09:16 207

出现即为正常。

[rsyncuser@mysql01 weavertest]$ ls -lR|grep "^-"|wc -l
统计当前文件及子目录中的文件个数

1027

——–rsync属性————–
-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, –links 保留软链结
-L, –copy-links 想对待常规文件一样处理软链结
–copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
–safe-links 忽略指向SRC路径目录树以外的链结
-H, –hard-links 保留硬链结
-p, –perms 保持文件权限
-o, –owner 保持文件属主信息
-g, –group 保持文件属组信息
-D, –devices 保持设备文件信息
-t, –times 保持文件时间信息
-S, –sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, –dry-run现实哪些文件将被传输
-W, –whole-file 拷贝文件,不进行增量检测
-x, –one-file-system 不要跨越文件系统边界
-B, –block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, –rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
–rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, –cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
–existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
–delete 删除那些DST中SRC没有的文件
–delete-excluded 同样删除接收端那些被该选项指定排除的文件
–delete-after 传输结束以后再删除
–ignore-errors 及时出现IO错误也进行删除
–max-delete=NUM 最多删除NUM个文件
–partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
–force 强制删除目录,即使不为空
–numeric-ids 不将数字的用户和组ID匹配为用户名和组名
–timeout=TIME IP超时时间,单位为秒
-I, –ignore-times 不跳过那些有同样的时间和长度的文件
–size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
–modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T –temp-dir=DIR 在DIR中创建临时文件
–compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 –partial
–progress 显示备份过程
-z, –compress 对备份的文件在传输时进行压缩处理
–exclude=PATTERN 指定排除不需要传输的文件模式
–include=PATTERN 指定不排除而需要传输的文件模式
–exclude-from=FILE 排除FILE中指定模式的文件
–include-from=FILE 不排除FILE指定模式匹配的文件
–version 打印版本信息
–address 绑定到特定的地址
–config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
–port=PORT 指定其他的rsync服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=3605转载请注明转自CCIE那点事
如果喜欢:点此订阅本站