28-网络文件共享和实时同步

时间:2022-11-20 16:59:48


28-网络文件共享和实时同步

NAS 存储

28-网络文件共享和实时同步

NAS存储就是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。NAS是文件级的存储方法,它的重点在于帮助工作组和部门级机构解决迅速增加存储容量的需求。如今更多的亲们采用NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和亲们等个人用户的使用。NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。但NAS有一个关键性问题,即备份过程中的带宽消耗。与将备份数据流从LAN中转移出去的存储区域网(SAN)不同,NAS仍使用网络进行备份和恢复。NAS 的一个缺点是它将存储事务由并行SCSI连接转移到了网络上。这就是说LAN除了必须处理正常的最终用户传输流外,还必须处理包括备份操作的存储磁盘请求。


写多了比较累,休息下。

NFS

Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure CallProtocol 远程过程调用)实现RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

28-网络文件共享和实时同步


#NFS属于kernel自带的模块
[root@ubuntu2204 ~]#grep -i 'NFS' /boot/config-5.15.0-52-generic
CONFIG_USB_FUNCTIONFS=m
CONFIG_USB_FUNCTIONFS_ETH=y
CONFIG_USB_FUNCTIONFS_RNDIS=y
CONFIG_USB_FUNCTIONFS_GENERIC=y
CONFIG_XENFS=m
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_KERNFS=y
CONFIG_NFS_FS=m --> 可以看到,设定为m(模块)
CONFIG_NFS_V2=m
CONFIG_NFS_V3=m
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=m
CONFIG_NFS_SWAP=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=m
CONFIG_PNFS_BLOCK=m
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
CONFIG_NFS_V4_1_MIGRATION=y
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_NFS_DEBUG=y
CONFIG_NFS_DISABLE_UDP_SUPPORT=y
# CONFIG_NFS_V4_2_READ_PLUS is not set
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_PNFS=y
CONFIG_NFSD_BLOCKLAYOUT=y
CONFIG_NFSD_SCSILAYOUT=y
CONFIG_NFSD_FLEXFILELAYOUT=y
CONFIG_NFSD_V4_2_INTER_SSC=y
CONFIG_NFSD_V4_SECURITY_LABEL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y
CONFIG_NFS_V4_2_SSC_HELPER=y

[root@ubuntu2204 ~]#modinfo nfs
filename: /lib/modules/5.15.0-52-generic/kernel/fs/nfs/nfs.ko
license: GPL
author: Olaf Kirch <okir@monad.swb.de>
alias: nfs4
alias: fs-nfs4
alias: fs-nfs
srcversion: 4550CFC0EE32BB6E873DBC2
depends: fscache,sunrpc,lockd
retpoline: Y
intree: Y
name: nfs
vermagic: 5.15.0-52-generic SMP mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 49:B2:3F:66:E1:3B:8B:67:11:CE:17:63:41:27:D0:B1:28:DF:09:8C
sig_hashalgo: sha512
signature: BB:2E:6A:13:D6:7D:83:19:BB:F1:8D:E7:22:89:FA:EB:34:DF:87:FA:
61:62:F6:5C:E2:62:A1:A5:D4:48:A2:5F:03:B0:9E:26:22:19:D0:45:
BE:80:71:6D:CA:2B:FF:7D:F9:BB:CD:01:EE:B7:BE:0E:78:8E:BB:6B:
93:4F:B1:FF:86:4D:4C:7D:7B:98:F0:71:D8:F3:A3:A1:19:A6:DB:86:
A1:81:35:26:FA:7C:A7:38:41:89:BE:9F:24:EA:D6:3C:8E:EB:9D:CE:
30:10:D3:1B:D7:09:36:37:06:0A:E2:CE:38:1B:7B:68:19:61:A1:5E:
60:15:B2:9E:67:72:C6:94:11:93:36:A0:FD:15:56:D9:5E:AA:EB:D2:
81:64:CC:99:3E:F7:C0:AA:59:F2:D3:63:EE:42:10:F2:AB:CC:E0:EB:
8D:E4:41:E5:25:F5:23:C6:06:A6:09:41:89:81:B5:A4:D3:F4:7C:4D:
1A:37:6E:FB:59:CB:6E:9B:B7:82:CA:3C:B0:19:6C:35:6E:DB:0A:F0:
2B:F9:2C:A5:E9:D8:50:38:54:BB:8F:0B:A7:B6:11:73:E0:4F:A0:3A:
E4:DC:B7:3F:F2:D3:DE:94:CC:5C:57:E0:B7:B3:DE:57:85:8E:0B:E8:
33:65:18:2E:2A:04:64:06:08:C2:C2:11:37:0C:69:89:88:5E:45:C3:
4E:46:9B:AA:88:F2:47:7B:3A:91:BE:45:66:40:6C:BD:D3:69:E0:60:
09:31:64:1E:F6:51:A9:3A:D0:7D:89:88:8D:22:F6:70:67:E4:8E:72:
72:04:65:E3:C5:7E:65:61:6E:2C:AD:85:64:98:34:55:27:A4:87:90:
44:3A:0A:43:40:7B:78:81:37:1E:15:DC:27:E2:77:2B:D1:80:C9:07:
49:85:1F:CB:25:A5:64:F2:1E:77:CB:25:7D:7F:7B:CE:CB:3C:28:AB:
77:62:D4:75:4E:A6:F0:53:D7:33:A9:3F:DA:6C:9A:6E:44:F8:58:7C:
C0:49:D9:49:56:48:2D:F0:96:C7:C3:E1:EB:0B:A4:A3:8B:0B:EB:68:
40:0B:2A:9D:75:CB:7E:7D:47:6E:1E:CD:94:FF:28:02:66:19:5A:E2:
6D:37:CC:9F:74:DD:E5:97:2F:29:7D:08:83:27:5B:4E:FF:4F:FF:3E:
3C:1A:90:4D:67:55:A4:E9:34:4A:14:8E:37:E8:5F:40:97:DE:2D:81:
B8:63:E8:4F:E6:9A:F7:9A:17:50:4C:EF:CC:3C:55:C8:A5:B2:6A:9D:
69:CA:66:C3:F8:45:2D:72:11:78:BC:CC:2D:D5:CB:8A:EF:2D:A3:96:
87:5E:DD:C8:EA:02:9B:88:A3:DB:77:DE
parm: nfs_mountpoint_expiry_timeout:Set the NFS automounted mountpoint timeout value (seconds).Values <= 0 turn expiration off. (nfs_timeout)
parm: callback_tcpport:portnr
parm: callback_nr_threads:Number of threads that will be assigned to the NFSv4 callback channels. (ushort)
parm: nfs_idmap_cache_timeout:int
parm: nfs4_disable_idmapping:Turn off NFSv4 idmapping when using 'sec=sys' (bool)
parm: max_session_slots:Maximum number of outstanding NFSv4.1 requests the client will negotiate (ushort)
parm: max_session_cb_slots:Maximum number of parallel NFSv4.1 callbacks the client will process for a given server (ushort)
parm: send_implementation_id:Send implementation ID with NFSv4.1 exchange_id (ushort)
parm: nfs4_unique_id:nfs_client_id4 uniquifier string (string)
parm: recover_lost_locks:If the server reports that a lock might be lost, try to recover it risking data corruption. (bool)
parm: enable_ino64:bool
parm: nfs_access_max_cachesize:NFS access maximum total cache length (ulong)

[root@ubuntu2204 ~]#ls /lib/modules/5.15.0-52-generic/kernel/fs/nfs/nfs.ko
/lib/modules/5.15.0-52-generic/kernel/fs/nfs/nfs.ko

[root@ubuntu2204 ~]#ls /lib/modules/5.15.0-52-generic/kernel/fs
9p autofs btrfs coda erofs freevxfs hfs jffs2 minix nfsd ntfs3 overlayfs quota smbfs_common ufs
adfs befs cachefiles cramfs exfat fscache hfsplus jfs netfs nilfs2 ocfs2 pstore reiserfs sysv vboxsf
affs bfs ceph dlm f2fs fuse hpfs ksmbd nfs nls omfs qnx4 romfs ubifs xfs
afs binfmt_misc.ko cifs efs fat gfs2 isofs lockd nfs_common ntfs orangefs qnx6 shiftfs.ko udf zonefs

--------------------------------------------------------------------------
#Rocky8
[root@Rocky8 ~]#grep -i 'NFS' /boot/config-4.18.0-372.9.1.el8.x86_64
CONFIG_XENFS=m
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_KERNFS=y
CONFIG_NFS_FS=m
# CONFIG_NFS_V2 is not set
CONFIG_NFS_V3=m
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=m
# CONFIG_NFS_SWAP is not set
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_PNFS_FILE_LAYOUT=m
CONFIG_PNFS_BLOCK=m
CONFIG_PNFS_FLEXFILE_LAYOUT=m
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org"
# CONFIG_NFS_V4_1_MIGRATION is not set
CONFIG_NFS_V4_SECURITY_LABEL=y
CONFIG_NFS_FSCACHE=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_NFS_DEBUG=y
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_PNFS=y
# CONFIG_NFSD_BLOCKLAYOUT is not set
CONFIG_NFSD_SCSILAYOUT=y
# CONFIG_NFSD_FLEXFILELAYOUT is not set
CONFIG_NFSD_V4_SECURITY_LABEL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y

作为一个主服务加微服务集合,nfs多端口,且随机,一个NFS服务对应多个软件应用,提供不同的个性化服务定制。为了解决端口随机的问题,NFS提供有注册中心机制。

图解

28-网络文件共享和实时同步


NFS管理软件包:
红帽系统: nfs-utils: 包括服务器和客户端相关工具,CentOS8 最小化安装时默认没有安装)
Ubuntu: nfs-kernel-server 服各器包名,nfs-common 客户端包名
相关软件包:rpcbind(必须),tcp_wrappers
Kernel支持:nfs.ko
端口:2049(nfsd), 其它端口由portmap(111)分配
NFS服务主要进程:
rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
rpc.lockd 非必要,管理文件锁,避免同时写出错
rpc.statd 非必要,检查文件一致性,可修复文件
说明:CentOS 6 开始portmap进程由rpcbind代替
日志:/var/lib/nfs/
NFS配置文件:
/etc/exports
/etc/exports.d/*.exports
软件安装
[root@centos8 ~]#yum -y install nfs-utils
[root@centos8 ~]#systemctl enable --now nfs-server.service

#服务器
[root@ubuntu2004 ~]#apt install nfs-kernel-server
[root@ubuntu2004 ~]#systemctl status nfs-server
#客户端
[root@ubuntu2004 ~]#apt -y install nfs-common

NFS共享配置文件格式

/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...

#格式说明
1. 以#开始的行为注释
2. 主机格式
anonymous:表示使用*通配所有客户端
单个主机:ipv4,ipv6,FQDN
IP networks:两种掩码格式均支持
172.18.0.0/255.255.0.0
172.18.0.0/16
wildcards:主机名通配,例如:*.moore.org,IP不可以
netgroups:NIS域的主机组,@group_name
3. 每个条目指定目录导出到的哪些主机,及相关的权限和选项
默认选项:(ro,sync,root_squash,no_all_squash)
ro,rw 只读和读写
async 异步,数据变化后不立即写磁盘,先写入到缓冲区中,过一段时间再写入磁盘,性能高,安全性低
sync(1.0.0后为默认)同步,数据在请求时立即写入共享存储磁盘,性能低,安全性高
root_squash (默认)远程root映射为nfsnobody,UID为65534,CentOS8 为nobody,CentOS
7以前的版本为nfsnobody
no_root_squash 远程root映射成NFS服务器的root用户
all_squash 所有远程用户(包括root)都变成nfsnobody,CentOS8 为nobody
no_all_squash (默认)保留共享文件的UID和GID
anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nobody,可配合all_squash使用
注意:目录需要给此用户权限,否则无法访问



#范例:NFS配置示例
vim /etc/exports
/myshare server.example.com
/myshare *.example.com
/myshare server?.example.com
/myshare server[0-20].example.com
/myshare 172.25.11.10
/myshare 172.25.0.0/16
/myshare 2000:472:18:b51:c32:a21
/myshare 2000:472:18:b51::/64
/myshare *.example.com 172.25.0.0/16
/myshare desktop.example.com(ro)
/myshare desktop.example.com(ro) server[0-20].example.com(rw)
/myshare diskless.example.com(rw,no_root_squash)

端口查看:--> 只适合内网使用

[root@nfs-server ~]#ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 25 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",pid=26491,fd=7))
LISTEN 0 64 0.0.0.0:36965 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=27431,fd=4),("systemd",pid=1,fd=41))
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=734,fd=14))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=795,fd=3))
LISTEN 0 4096 0.0.0.0:36185 0.0.0.0:* users:(("rpc.mountd",pid=27999,fd=9))
LISTEN 0 128 127.0.0.1:6010 0.0.0.0:* users:(("sshd",pid=28329,fd=7))
LISTEN 0 4096 0.0.0.0:56443 0.0.0.0:* users:(("rpc.statd",pid=27994,fd=9))
LISTEN 0 4096 0.0.0.0:57341 0.0.0.0:* users:(("rpc.mountd",pid=27999,fd=5))
LISTEN 0 4096 0.0.0.0:57727 0.0.0.0:* users:(("rpc.mountd",pid=27999,fd=13))
LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
LISTEN 0 25 [::]:514 [::]:* users:(("rsyslogd",pid=26491,fd=8))
LISTEN 0 4096 [::]:44935 [::]:* users:(("rpc.mountd",pid=27999,fd=15))
LISTEN 0 4096 [::]:39687 [::]:* users:(("rpc.mountd",pid=27999,fd=7))
LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=27431,fd=6),("systemd",pid=1,fd=45))
LISTEN 0 511 *:80 *:* users:(("apache2",pid=803,fd=4),("apache2",pid=802,fd=4),("apache2",pid=799,fd=4))
LISTEN 0 4096 [::]:48657 [::]:* users:(("rpc.statd",pid=27994,fd=11))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=795,fd=4))
LISTEN 0 128 [::1]:6010 [::]:* users:(("sshd",pid=28329,fd=5))
LISTEN 0 64 [::]:41243 [::]:*
LISTEN 0 4096 [::]:47997 [::]:* users:(("rpc.mountd",pid=27999,fd=11))
LISTEN 0 64 [::]:2049 [::]:*

NFS工具

#rpcinfo --> 工具可以查看RPC相关信息
rpcinfo -p hostname 查看注册在指定主机的RPC程序
rpcinfo -s hostname 查看RPC注册程序

[root@nfs-server ~]#rpcinfo -p 10.0.0.8
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 33054 status
100024 1 tcp 56443 status
100005 1 udp 42676 mountd
100005 1 tcp 57341 mountd
100005 2 udp 46130 mountd
100005 2 tcp 36185 mountd
100005 3 udp 46141 mountd
100005 3 tcp 57727 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100021 1 udp 46823 nlockmgr
100021 3 udp 46823 nlockmgr
100021 4 udp 46823 nlockmgr
100021 1 tcp 36965 nlockmgr
100021 3 tcp 36965 nlockmgr
100021 4 tcp 36965 nlockmgr

#exports --> 用于管理NFS导出的文件系统
-v #查看本机所有NFS共享
-r #重读配置文件,并共享目录* 不会断开旧链接,尽量不用systemctl restart nfs-service
-a #输出本机所有共享
-au #停止本机所有共享

#范例:挂载目录给所有主机
[root@nfs-server ~]#cat /etc/exports
/data/nfsdir/ *
[root@nfs-server ~]#exportfs -r
exportfs: No options for /data/nfsdir/ *: suggest *(sync) to avoid warning
exportfs: /etc/exports [4]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/nfsdir/".
Assuming default behaviour ('no_subtree_check').
NOTE: this default has changed since nfs-utils version 1.0.x

[root@nfs-server ~]#exportfs -v
#默认权限
/data/nfsdir <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

#范例 授予读写权限并且指定文件所属组用户ID --> 自动生成的gid uid 会造成由于gid,uid的不一致共享主机拒绝访问文件
[root@nfs-server ~]#cat /etc/exports
/data/nfsdir/ *(rw,no_root_squash,annotallow=1001,annotallow=1001) -- no_root_squash-> 不压榨root权限

[root@nfs-server ~]#exportfs -r
exportfs: /etc/exports [3]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/data/nfsdir/".
Assuming default behaviour ('no_subtree_check').
NOTE: this default has changed since nfs-utils version 1.0.x

[root@nfs-server ~]#exportfs -v
/data/nfsdir <world>(sync,wdelay,hide,no_subtree_check,annotallow=1001,annotallow=1001,sec=sys,rw,secure,no_root_squash,no_all_squash)
#测试
[root@mysql-master html]#showmount -e 10.0.0.200
Export list for 10.0.0.200:
/data/nfsdir *
[root@mysql-master html]#touch test.txt
[root@mysql-master html]#ll
drwxr-xr-x 2 root root 4096 Nov 19 19:42 dir1
drwxr-xr-x 2 root root 4096 Nov 19 19:27 dir2
-rw-r--r-- 1 root root 0 Nov 19 20:47 test.txt

[root@nfs-server ~]#ll /data/nfsdir/
drwxr-xr-x 2 root root 4096 11月 19 19:42 dir1/
drwxr-xr-x 2 root root 4096 11月 19 19:27 dir2/
-rw-r--r-- 1 root root 0 11月 19 20:47 test.txt


#showmount --> 查看主机共享
#查看远程主机的NFS共享
showmount -e hostname
#范例:
[root@centos7 ~]#showmount -e 10.0.0.8
Export list for 10.0.0.8:
/data/wordpress *

#mount.nfs --> 客户端NFS挂载
fg #(默认)前台挂载
bg #后台挂载
hard #(默认)持续请求
soft #非持续请求
intr #和hard配合,请求可中断
rsize #和wsize 一次读和写数据最大字节数,rsize=32768
_netdev #无网络服务时不挂载NFS资源
vers #指定版本,客户端centos8默认4.2 ,centos7默认4.1 centos6默认4.0
提示:基于安全考虑,建议使用nosuid,_netdev,noexec 挂载选项
_netdev --> 当主机能联网时则执行挂则,否则不挂载(可以防止开机没网络时由于反复挂载无网络设备导致的开机卡顿)

#范例:临时挂载NFS共享
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/

#范例:开机挂载
vim /etc/fstab
172.16.0.1:/public /mnt/nfs nfs defaults,_netdev 0 0

#范例:远程的 root 映射为NFS服务器的nobody用户
[root@centos6 ~]#grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@centos7 ~]#grep nobody /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@centos8 ~]#grep nobody /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

范例:将NFS的共享目录,做为远程主机用户的家目录

#环境准备
共三台主机
一台主机 nfs server
IP:10.0.0.8
另两台当 nfs client
IP:10.0.0.7
IP:10.0.0.6

#步骤
#NFS服务器创建用户和相应的家目录,将用户moore的家目录共享
[root@centos8 ~]#yum -y install nfs-utils
[root@centos8 ~]#systemctl enable --now nfs-server
[root@centos8 ~]#mkdir -pv /data/home
[root@centos8 ~]#useradd -d /data/home/moore -u 2000 moore
[root@centos8 ~]#Vim /etc/exports.d/test.exports
/data/home *(rw)
[root@centos8 ~]#exportfs -r

#在第一台NFS客户端主机10.0.0.7上实现
[root@centos7 ~]#yum -y install nfs-utils
[root@centos7 ~]#useradd -u 2000 moore
[root@centos7 ~]#vim /etc/fstab
10.0.0.8:/data/home/moore /home/moore nfs _netdev 0
[root@centos7 ~]#mount -a
[root@centos7 ~]#su - moore
Last login: Fri Jul 3 16:33:34 CST 2020 on pts/0
[moore@centos7 ~]$pwd
/home/moore
[moore@centos7 ~]$df /home/moore -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
10.0.0.8:/data/home/moore nfs4 52403200 398464 52004736 1% /home/moore

#在第二台NFS客户端主机10.0.0.6上实现
[root@centos6 ~]#yum -y install nfs-utils
[root@centos6 ~]#useradd -u 2000 moore
[root@centos6 ~]#vim /etc/fstab
10.0.0.8:/data/home/moore /home/moore nfs _netdev 0 0
[root@centos6 ~]#su - moore
[moore@centos6 ~]$pwd
/home/moore
[moore@centos6 ~]$df -T /home/moore
Filesystem Type 1K-blocks Used Available Use% Mounted on
10.0.0.8:/data/home/moore nfs 52403200 398464 52004736 1% /home/moore

数据实时同步

在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份服务器特定目录中

#实现实时同步的方法
inotify + rsync 方式实现数据同步,需自行编写脚本组合inotify和 rsync 实现
sersync :前金山公司周洋(花椒直播)在 inotify+rsync 软件基础上进行开发的,功能更加强大
#工作原理:
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
#inotify
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify, 通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
[root@ubuntu2204 ~]#grep -i inotify /boot/config-5.15.0-52-generic
CONFIG_INOTIFY_USER=y
[root@data-centos8 ~]#grep -i inotify /boot/config-4.18.0-80.el8.x86_64
CONFIG_INOTIFY_USER=y
#实现inotify软件
inotify-tools
sersync
lrsyncd
#inotify+rsync使用方式
inotify 对同步数据目录信息的监控
rsync 完成对数据的同步
利用脚本进行结合

inotify-kernel实时监控服务

#列出下面的文件,说明服务器内核支持inotify
[root@centos8 ~]#ls -l /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_queued_events --> 事件队列最大长度
-rw-r--r-- 1 root root 0 Dec 7 10:10 max_user_instances --> 用户创建inotify实例最大值
-rw-r--r-- 1 root root 0 Dec 6 05:54 max_user_watches --> 可以监视的文件的总数量

1. max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679
2. max_user_instances:每个用户创建inotify实例最大值,默认值:128
3. max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大
--------------------------------------------------------------------------------------------
#centos8
[root@centos8 ~]#cat /proc/sys/fs/inotify/max_queued_events
16384
[root@centos8 ~]#cat /proc/sys/fs/inotify/max_user_instances
128
[root@centos8 ~]#cat /proc/sys/fs/inotify/max_user_watches
8192

#ubuntu2204
[root@ubuntu2204 ~]#cat /proc/sys/fs/inotify/max_queued_events
16384
[root@ubuntu2204 ~]#cat /proc/sys/fs/inotify/max_user_instances
128
[root@ubuntu2204 ~]#cat /proc/sys/fs/inotify/max_user_watches
14281

#参数优化
[root@data-centos8 ~]#vim /etc/sysctl.conf
fs.inotify.max_queued_events=66666
fs.inotify.max_user_watches=100000
[root@centos8 ~]#sysctl -p
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000
[root@centos8 ~]#cat /proc/sys/fs/inotify/*
66666
128
100000

inotify-tools工具

inotify-tools参考文档:https://github.com/rvoicilas/inotify-tools/wiki

[root@data-centos8 ~]# yum -y install inotify-tools
[root@data-ubuntu2004]#apt -y install inotify-tools

inotify-tools包主要工具:
inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,
常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

inotifywait 命令
格式: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
常用选项:
-m, --monitor #始终保持事件监听
-d, --daemon #以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive #递归监控目录数据信息变化
-q, --quiet #输出少量事件信息
--exclude <pattern> #指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> #和exclude相似,不区分大小写
-o, --outfile <file> #打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput #发送错误到syslog相当于标准错误输出
--timefmt <fmt> #指定时间输出格式
--format <fmt> #指定的输出格式;即实际监控输出内容
-e #指定监听指定的事件,如果省略,表示所有事件都进行监听
inotifywait 的--timefmt 时间格式 范例:timefmt "%Y-%m-%d %H:%M:%S"
%Y #年份信息,包含世纪信息
%y #年份信息,不包括世纪信息
%m #显示月份,范围 01-12
%d #每月的第几天,范围是 01-31
%H #小时信息,使用 24小时制,范围 00-23
%M #分钟,范围 00-59
%S #秒,范例 0-60
inotifywait 的 --format 格式定义 范例: format "%T %w%f event: %;e"
%T #输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w #事件出现时,监控文件或目录的名称信息,相当于dirname
%f #事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
%e #显示发生的事件信息,不同的事件默认用逗号分隔
%Xe #显示发生的事件信息,不同的事件指定用X进行分隔
inotifywait -e 选项指定的事件类型 范例: -e create,delete,moved_to,close_write,attrib
create #文件或目录创建
delete #文件或目录被删除
modify #文件或目录内容被写入
attrib #文件或目录属性改变
close_write #文件或目录关闭,在写入模式打开之后关闭的
close_nowrite #文件或目录关闭,在只读模式打开之后关闭的
close #文件或目录关闭,不管读或是写模式
open #文件或目录被打开
lsdir #浏览目录内容
moved_to #文件或目录被移动到监控的目录中
moved_from #文件或目录从监控的目录中被移动
move #文件或目录不管移动到或是移出监控目录都触发事件
access #文件或目录内容被读取
delete_self #文件或目录被删除,目录本身被删除
unmount #取消挂载
---------------------------------------------------------------------------------------
范例:使用inotifywait
[root@nfs-server ~]#dpkg -L inotify-tools
/.
/usr
/usr/bin
/usr/bin/fsnotifywait
/usr/bin/fsnotifywatch
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/share
/usr/share/doc
/usr/share/doc/inotify-tools
/usr/share/doc/inotify-tools/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
/usr/share/doc/inotify-tools/changelog.Debian.gz
/usr/share/man/man1/fsnotifywait.1.gz
/usr/share/man/man1/fsnotifywatch.1.gz

#持续前台监控
inotifywait -mrq /data/www --exclude=".*\.swx|\.swp"
/data/www/ OPEN f1.txt
/data/www/ ACCESS f1.txt
/data/www/ CLOSE_NOWRITE,CLOSE f1.txt
#持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e"
#持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:%;e"
-e create,delete,moved_to,close_write,attrib

rsync 服务-linux系统下的数据镜像备份工具

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、 rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或 sersync,可以实现触发式的实时数据同步

##rsync有三种工作方式:
#Local: 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
rsync [OPTION...] SRC... [DEST]
#Access via remote shell:本地主机使用远程shell和远程主机通信
Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST
#Access via rsync daemon:本地主机通过网络套接字连接远程主机上的rsync daemon
Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

对比:前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

#常见选项:
-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:要求删除源端已经成功传输的文件
--bwlimit=RATE 指定限速,单位默为为MB/s

范例:

#配置文件内容
[root@ubuntu2204 ~]#cat /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas

#服务器端准备目录
[root@backup-centos8 ~]#mkdir -pv /data/backup
#服务器端生成验证文件
[root@backup-centos8 ~]#echo "rsyncuser:123456" > /etc/rsync.pas
[root@backup-centos8 ~]#chmod 600 /etc/rsync.pas
#服务器端启动rsync服务
[root@backup-centos8 ~]#rsync --daemon #可加入/etc/rc.d/rc.local实现开机启动
[root@backup-centos8 ~]#systemctl start rsyncd #CentOS 7 以上版本
#客户端配置密码文件
#也可将密码赋值给环境变量RSYNC_PASSWORD变量,但不安全
#export RSYNC_PASSWORD=123456
[root@data-centos8 ~]#echo "123456" > /etc/rsync.pas
[root@data-centos8 ~]#chmod 600 /etc/rsync.pas #此为必要项,权限必须修改
#查看远程rsync服务器的模块信息
[root@data-server ~]#rsync rsync://rsync服务器IP
backup backup dir
#交互式验证查看具体模块内的文件
[root@data-server ~]#rsync rsync://rsyncuser@rsync服务器IP/backup
Password:
#非交互式查看共享目录
[root@data-server ~]#rsync --password-file=/etc/rsync.pas
rsync://rsyncuser@rsync服务器IP/backup
#客户端测试同步数据
[root@data-centos8 ~]#rsync -avz --delete --password-file=/etc/rsync.pas
/data/www/ rsyncuser@rsync服务器IP::backup
[root@data-centos8 ~]#rsync -avz --delete --password-file=/etc/rsync.pas
rsyncuser@rsync服务器IP::backup /data/www/

综合案例:inotify+rsync+shell 脚本实现实时数据同步

##backup服务器文件  --> 提示文件夹不存在时手动创建即可 服务器访问权限不够就适当放大
#提前安装rsync
#配置文件内容
[root@ubuntu2204 ~]#cat /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas

[root@nfs-client ~]#cat /etc/rsync.pas
rsyncuser:123456

##数据端后台同步脚本
#提前安装inotify-tools和rsync
[root@nfs-server ~]#cat /etc/rsync.pas
123456
#运行脚本-推荐nohub运行
SRC='/data/backup/'
DEST='rsyncuser@10.0.0.202::backup'

rpm -q inotify-tools &> /dev/null ||yum -y install inotify-tools
rpm -q rsync &> /dev/null || yum -y install rsync

inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

#测试
whatch -n1 ls -l /data/backup

最后,实现实时数据同步功能,可以使用 sersync 作者是周洋

sersync项目地址: https://code.google.com/archive/p/sersync/
sersync下载地址: https://code.google.com/archive/p/sersync/downloads

我是moore,大家一起加油!