第二十九天:网络文件共享服务和数据同步
一、存储类型
存储类型分为三种
直连式存储:Direct-Attached Storage,简称 DAS
存储区域网络:Storage Area Network,简称 SAN
网络附加存储:Network-Attached Storage,简称 NAS
1、 DAS 存储
DAS存储是最常见的一种存储方式,尤其是在中小企业应用中。PC中的硬盘或只有一个外部SCSI接口的JBOD都属于DAS架构。DAS是指存储设备直接连接到服务器总线上,存储设备只与一台独立的主机连
接,其他主机不能使用这个存储设备。DAS存储设备与服务器主机之间的连接通道通常采用SCSI连接,DAS存储设备主要是磁盘阵列(RAID: Redundant Arrays of Independent Disks)、磁盘簇(JBOD:Just a Bunch Of Disks)等。
2、NAS 存储
NAS存储就是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。
NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。NAS是文件级的存储方法,它的重点在于帮助工作组和部门级机构解决迅速增加存储容
量的需求。如今更多的亲们采用NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和亲们等个人用户的使用。
NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。
但NAS有一个关键性问题,即备份过程中的带宽消耗。与将备份数据流从LAN中转移出去的存储区域网(SAN)不同,NAS仍使用网络进行备份和恢复。NAS 的一个缺点是它将存储事务由并行SCSI连接转移
到了网络上。这就是说LAN除了必须处理正常的最终用户传输流外,还必须处理包括备份操作的存储磁盘请求。
3、SAN 存储
存储区域网络,这个是通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成为业界的事实标准(但各个厂商的光纤交换
技术不完全相同,其服务器和SAN存储有兼容性的要求)。
SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSI和IP协议。
SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。SAN的结构允许任何服务器连接到任何存储阵列,这样不管
数据置放在那里,服务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。
如今的SAN解决方案通常会采取以下两种形式:光纤信道以及iSCSI或者基于IP的SAN,也就是FC SAN和IP SAN。光纤信道是SAN解决方案中大家最熟悉的类型,但是,最近一段时间以来,基于iSCSI的SAN解
决方案开始大量出现在市场上,与光纤通道技术相比较而言,这种技术具有良好的性能,而且价格低廉。
一般通过在主机上安装HBA(Host Bus Adapter 主机总线适配器)卡,再通过光纤连接到光纤交换机,再连接至SAN存储上
SAN的优势:
随着存储容量的增长,SAN允许企业独立地增加他们的存储容量。
SAN允许任何服务器连接到任何存储阵列(好处是:不管数据放在哪里,服务器都可以直接存取所需的数据)
由于使用光纤接口,SAN具有更高的带宽。除了FC连接,SAN连接还有ISCSI(SCSI over IP)以及SAS(Serial Attached SCSI)接口。
光纤接口可以提供10公里那么长那么远的连接长度,非常容易实现物理分离的存储
4、三种存储比较
SAN与NAS的主要区别体现在文件系统所在的位置
三种存储架构的应用场景
DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业
NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低
SAN则适用于大型应用或数据库系统,缺点是成本高、较为复杂
二、NFS服务
1、NFS 工作原理
NFS:Network File System 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure CallProtocol 远程过程调用)实现
RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程
参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行
NFS优势:节省本地存储空间,将常用的数据,如:/home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用
2、NFS软件介绍
软件包:
红帽系统: nfs-utils: 包括服务器和客户端相关工具,CentOS8 最小化安装时默认没有安装
Ubuntu: nfs-server(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
3、NFS共享配置文件格式
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
格式说明:
以#开始的行为注释
主机格式:
anonymous:表示使用*通配所有客户端 单个主机:ipv4,ipv6,FQDN IP networks:两种掩码格式均支持 172.18.0.0/255.255.0.0 172.18.0.0/16 wildcards:主机名通配,例如:*.wang.org,IP不可以 netgroups:NIS域的主机组,@group_name
每个条目指定目录导出到的哪些主机,及相关的权限和选项
默认选项:(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使 用,注意:目录需要给此用户权限,否则无法访问
4、NFS工具
(1)rpcinfo
rpcinfo 工具可以查看RPC相关信息
查看注册在指定主机的RPC程序
rpcinfo -p hostname
查看RPC注册程序
rpcinfo -s hostname
(2)exportfs
exportfs:可用于管理NFS导出的文件系统
常见选项:
-v #查看本机所有NFS共享 -r #重读配置文件,并共享目录 -a #输出本机所有共享 -au #停止本机所有共享
(3)showmount
常见用法:
#查看远程主机的NFS共享 showmount -e hostname
(4)mount.nfs
客户端NFS挂载
NFS相关的挂载选项:man 5 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 挂载选项_
5、实战案例
(1)目标和环境
将NFS的共享目录,做为远程主机用户的家目录
共三台主机 一台主机 nfs server IP:10.0.0.8 另两台当 nfs client IP:10.0.0.7 IP:10.0.0.6
(2)步骤
#NFS服务器创建用户和相应的家目录,将用户wang的家目录共享 [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/wang -u 2000 wang [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 wang [root@centos7 ~]#vim /etc/fstab #在第二台NFS客户端主机10.0.0.6上实现 [root@centos6 ~]#yum -y install nfs-utils [root@centos6 ~]#useradd -u 2000 wang [root@centos6 ~]#vim /etc/fstab 10.0.0.8:/data/home/wang /home/wang nfs _netdev 0 0 [root@centos6 ~]#su - wang
三、数据的实时同步
在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份服务器特定目录中
1、实时同步技术介绍
实现实时同步的方法
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@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 完成对数据的同步
利用脚本进行结合
2、实现 inotify
(1)内核支持
内核是否支持inotify
Linux支持inotify的内核最小版本为 2.6.13,参看man 7 inotify
#列出下面的文件,说明服务器内核支持inotify [root@centos8 ~]#ls -l /proc/sys/fs/inotify
inotify 内核参数说明:
max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误
默认值:16384, 生产环境建议调大,比如:327679
max_user_instances:每个用户创建 inotify实例最大值,默认值:128
max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大
(2) inotify-tools工具
inotify-tools参考文档:https://github.com/rvoicilas/inotify-tools/wiki
安装inotify-tools:基于epel源
[root@data-centos8 ~]# yum -y install inotify-tools [root@data-ubuntu2004]#apt -y install inotify-tools
inotify-tools包主要工具:
notifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait 命令
格式:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
常用选项
inotifywait 的--timefmt 时间格式
参考 man 3 strftime
inotifywait 的 --format 格式定义
inotifywait -e 选项指定的事件类型
#持续前台监控特定事件 inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,moved_from,close_write,attrib
3、 rsync 服务
rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或
sersync,可以实现触发式的实时数据同步
官方网站: http://rsync.samba.org/
服务器软件包:rsync(Ubuntu20.04),rsync-daemon(CentOS 8)
服务文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp
(1) rsync命令
Usage: rsync [OPTION]... SRC [SRC]... DEST or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST --本地文件复制,走SH协议 or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST or rsync [OPTION]... [USER@]HOST:SRC [DEST] --走SSH协议 or rsync [OPTION]... [USER@]HOST::SRC [DEST] or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync 有三种工作方式:
1. 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
3. 本地主机通过网络套接字连接远程主机上的 rsync daemon。命令行语法格式为上述"Access viarsync daemon"段的格式。
前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。
常见选项:
[root@backup-centos8 ~]#cat /etc/rsyncd.conf [backup] path = /data/backup/ read only = no #指定可读写,默认只读 #指定目录给nobody权限,默认用户以nobody访问此目录 [root@backup-centos8 ~]#setfacl -m u:nobody:rwx /data/backup/ #查看rsync服务器的模块名称 [root@data-centos8 ~]#rsync rsync://backup-server backup [root@data-centos8 ~]#rsync backup-server:: backup #访问rsync服务器的共享目录 #推 [root@data-centos8 ~]#rsync /etc/networks root@backup-server::backup #默认所有 用户都映射为nobody用户 [root@data-centos8 ~]#rsync /etc/issue wang@backup-server::backup #默认所有 用户都映射为nobody用户 [root@data-centos8 ~]#rsync /etc/passwd backup-server::backup [root@data-centos8 ~]#rsync /etc/shells rsync://root@backup-server/backup #拉 [root@data-server ~]#rsync backup-server::backup/* /opt [root@data-server ~]#rsync rsync://backup-server/backup/* /mnt
(2)以独立服务方式运行rsync并实现验证功能
#服务器端准备目录 [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/
5、 inotify+rsync+shell 脚本实现实时数据同步
按 5.3 搭建好 rsyncd的备份服务器,在数据服务器上创建inotify_rsync.sh脚本
注意: 此脚本执行前先确保两主机初始数据处于同步状态,此脚本实现后续的数据同步
6、sersync 实现实时数据同步
sersync 是前金山公司周洋在 inotify和rsync 软件基础上进行开发的,功能更加强大
sersync类似于inotify,同样用于监控,但它克服了inotify的缺点.
inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件,从而导致重复调用rsync命令。另外比如:vim文件时,inotify会监控到临时文件的事件,但这些事件相对于rsync来说是不应该被监控的
sersync 优点:
sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
sersync配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接使用即可
sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态
sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步
sersync不仅可以实现实时同步,另外还自带crontab功能,只需在xml配置文件中开启,即也可以按要求隔一段时间整体同步一次,而无需再额外配置crontab功能
sersync 可以二次开发
sersync项目地址: https://code.google.com/archive/p/sersync/
sersync下载地址: https://code.google.com/archive/p/sersync/downloads
(2)基于rsync daemon 实现 sersync
(3)基于远程shell 实现 sersync
7、实战案例:实现基于分布式的LAMP架构,并将NFS实时同步到备份服务器