nfs共享存储+实时同步(结合rsync+inotify)
目录
RSYNC全集
NFS共享存储介绍
# 共享存储概述
NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS
# 什么时候需要使用到共享存储
如集群当中,用户端的访问和存储需要保存在同一目录当中,但当存储时只会保存在自己本地,用户访问也只能访问自己这台服务器,共享存储可帮助用户资源的一个整合,也可以实现多天服务器之间数据共享,保证服务器之间数据一致性
# 原理介绍
- 本地文件操作方式
1.当用户执行mkdir命令, 该命令会调用shell解释器翻译给内核。
2.内核解析完成后会驱动对应的硬件设备,完成相应的操作。
- NFS原理
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
# 注意:
rpc是一个远程过程调用,那么使用nfs必须有rpc服务
服务端配置文件编写要求:
- 配置文件格式
# 配置语法
共享目录 NFS客户端地址 nfs共享参数(参考下方参数表)
/data 172.16.1.0/24 ........
如:
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
- 参数表
执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:
nfs共享参数 | 参数作用 |
---|---|
rw | 读写权限 |
ro | 只读权限 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 (保证安全性使用) |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用) |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用) |
no_all_squash | 无论NFS客户端使用什么账户访问,都不进行压缩(保证安全性使用) |
sync | 同时将数据写入到内存与硬盘中,保证不丢失数据,同步 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据,异步 |
anonuid | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
anongid | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
个人建议:
# 最安全使用操作:
no_all_squash + root_squash
no_all_squash: 不将所有用户身份转换,客户端访问是什么用户,就以什么用户进行访问,同理,服务端如果给目录权限对于其他人权限不足,那么用户也无法对此操作
root_squash: 将root身份进行转换为匿名用户nfsnobody,那么如果服务端目录权限为www.www那么root用户进行转换也是匿名用户,属于其他人的权限,所以对此也是降低了root的权限,保证了其安全性。
集群实现共享存储
NFS实现原理
NFS扩展
#1.扩展:无需重启NFS服务平滑加载配置文件
[root@nfs01 r]# cat /etc/exports
/data/r 172.16.1.0/24(ro)
/data/p 172.16.1.0/24(ro)
/data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs01 r]# exportfs -rv
exporting 172.16.1.0/24:/data/w
exporting 172.16.1.0/24:/data/p
exporting 172.16.1.0/24:/data/r
#2.扩展:nfs客户端挂载参数
[root@backup-41 ~]# mount.nfs4 -o noatime,nodiratime,noexec,nodev,nosuid 172.16.1.31:/data/r /data/r/
#3.扩展:nfs客户端永久挂载参数
[root@backup-41 ~]# tail -2 /etc/fstab
172.16.1.31:/data/r /data/r nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
172.16.1.31:/data/w /data/w nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
#4.扩展:客户端检查挂载参数是否生效
[root@backup-41 ~]# mount
#等价于
[root@backup-41 ~]# cat /proc/mounts
实验一:
要求:
1. 将服务端/data目录进行共享,只有172.16.1.0/24网段主机可以放问
2. 所有主机对共享目录具备读写权限
3. 保证数据存储时写入双份,一份保存在硬盘一份保存在内存中,最大力度保证数据不丢失
4. 将所有访问用户映射为本地匿名用户www
5. 配合rsync+inotify将/data目录中文件进行备份到backup主机中
6. 一旦nfs的共享目录发生变化,backup立马进行同步,并保持共享目录和备份目录之间的一致性
1.环境准备
主机名 | wanIP | lanIP | 角色 |
---|---|---|---|
web01 | 10.0.0.7 | 172.16.1.7 | nfs的客户端 |
web02 | 10.0.0.8 | 172.16.1.8 | nfs的客户端 |
nfs | 10.0.0.31 | 172.16.1.31 | nfs的服务端 |
backup | 10.0.0.41 | 172.16.1.41 | backup服务端 |
2 nfs客户端前期准备
# 1. 服务安装(web01和web02同时操作)
[root@web01 ~]# yum install apache php
[root@web02 ~]# yum install apache php
[root@web01 ~]# yum install -y nfs-utils
[root@web02 ~]# yum install -y nfs-utils
# 2. 创建www用户(作为匿名访问nfs时的用户 web01和web02同时操作)
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@web02 ~]# groupadd www -g 666
[root@web02 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
# 3. 修改共享目录的属主和属组信息(web01和web02同时操作)
[root@web01 /var/www/html]# chown -R www.www /var/www/html
[root@web01 /var/www/html]# chown -R www.www /var/www/html
# 4. 修改apache配置文件(将apache站点目录属主属组信息进行修改,作为共享目录需要和nfs配置文件中定义用户保持一致)
[root@web01 /var/www/html]# vim /etc/httpd/conf/httpd.conf # 将原本apache改为www
User www
Group www
[root@web01 /var/www/html]# vim /etc/httpd/conf/httpd.conf # 将原本apache改为www
User www
Group www
3 nfs服务端前期准备
# 1. 服务安装(CentOs7)
[root@nfs01 ~]# yum install -y nfs-utils
# CentOS 6,需要安装nfs和rpc
[root@nfs ~]# yum install -y nfs-utils rpcbind
# 2. 编辑nfs的配置文件(这里的内容有影响到nfs客户端的用户创建)
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
# 3. 根据配置文件创建对应用户及文件
[root@nfs01 ~]# groupadd www -g 666
[root@nfs01 ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# chown -R www.www /data
# 4. 启动nfs服务(针对CentOS7)
[root@nfs01 ~]# systemctl start nfs-server
[root@nfs01 ~]# systemctl enable nfs-server
#启动rpc,在启动nfs(针对CentOS6,需要多启动一个服务)
[root@nfs ~]# systemctl start rpcbind nfs-server
4 nfs客户端后续操作
# 1. nfs客户端nfs服务启动(web01和web02同时操作)
[root@web01 /var/www/html]# systemctl start nfs-server
[root@web02 /var/www/html]# systemctl start nfs-server
# 2. 查看共享服务器信息
[root@web01 /var/www/html]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
# 3. 将本地目录挂载至共享存储中(web01和web02同时操作)
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /var/www/html
[root@web02 ~]# mount -t nfs 172.16.1.31:/data /var/www/html
# 4. 查看是否挂载(最后一行的信息显示即为实现挂载)
[root@web02 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.3G 18G 7% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 497M 120M 378M 25% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 19G 1.3G 18G 7% /var/www/html
# 5. nfs客户端上传压缩包(web02不用操作,挂载后站点目录里面文件全部会消失,除非重新卸载)
[root@web01 /var/www/html]# ll # 上传考试压缩包(web01和web02同时操作)
total 28
-rw-r--r-- 1 www www 26927 May 8 12:46 kaoshi.zip
# 6. 解压即可(web02不用操作,web01和web02同时操作)
[root@web01 /var/www/html]# unzip kaoshi.zip
# 7. 重启httpd服务(web01和web02同时操作)
[root@web01 /var/www/html]# systemctl restart httpd
[root@web02 /var/www/html]# systemctl restart httpd
5 rsync服务端操作
# 1. 服务安装
[root@backup ~]# yum install -y rsync
# 2. 修改配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
# 3. 根据配置文件在backup中创建对应目录和应用等其他信息并启动服务
[root@backup ~]# useradd rsync -s /sbin/nologin -M
[root@backup ~]# mkdir /backup
[root@backup ~]# chown -R rsync.rsync /backup/
[root@backup ~]# vim /etc/rsync.passwd
rsync_backup:123
[root@backup ~]# chmod 600 /etc/rsync.passwd
[root@backup ~/.certs]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
6.rsync客户端配置(也就是nfs服务端)
#1. 安装相关服务
[root@nfs01 ~]# yum install rsync
[root@nfs01 /data]# yum -y install inotify-tools
#2. 编写脚本,实现实时监控备份(需要手动执行此脚本)
[root@nfs01 /]# cat rsync_backup.sh
#!/bin/bash
export RSYNC_PASSWORD=123
dir=/data
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.41::backup >/dev/null 2>&1
done &
7.验证操作
#1. web01上传数据,看网页访问web02是否具备
2. 查看web01数据是否同步保存到backup服务端中
- web01数据上传
- web02尝试访问
- 查看backup是否存在/date中的文件