NFS搭建
单节点安装配置
服务器
操作系统 | IP地址 | 子网掩码 | 角色 |
---|---|---|---|
alma linux9.3 | 10.168.31.180 | 16 | server |
alma linux9.3 | 10.168.31.181 | 16 | client |
alma linux9.3 | 10.168.31.182 | 16 | client |
alma linux9.3 | 10.168.31.183 | 16 | client |
安装
在每台机器上执行下列的命令
dnf install -y nfs-utils rpcbind
配置
NFS配置文件 /etc/exports
- 挂载目录
一般来说,会挂载一块高性能磁盘,作为NFS的目录使用。本文未挂载额外磁盘,磁盘挂载请参考此文章,其余相同。
这里使用数据目录为/nfs,如果没有需要自行创建。
mkdir /nfs
- 访问的主机
IP | 允许范围 |
---|---|
10.168.31.180 | 单个主机 |
10.168.0.0/16 | 10.168.31.181 |
10.168.0.* | 10.168.31.182 |
主机名 | DNS A解析 轮询 |
- 权限
权限 | 作用 |
---|---|
rw | 可读可写 |
ro | 只读 |
sync | 写到磁盘才算完成,安全,慢 |
async | 异步写到远程缓冲区,快,不安全 |
no_root_squash | 允许NFS客户端上的root用户对NFS共享目录拥有至高权限 |
no_all_squash | 客户端所有用户拥有服务端匿名用户权限 |
echo '/nfs 10.168.0.0/16(rw,sync,no_root_squash,no_all_squash)' >> /etc/exports
启动并使NFS服务开机自启
systemctl start nfs-server.service
systemctl enable nfs-server.service
客户端挂载
查看是否能发现服务器的共享文件夹
showmount -e IP
创建挂载目录
mkdir /nfs
临时挂载
NFS客户端挂载的命令格式
# 挂载命令 挂载的格式类型 NFS服务器提供的共享目录 NFS客户端要挂载的目录(必须存在)
# mount -t nfs <server-ip>:/<shared-directory> /nfs
# 示例:
mount -t nfs 10.168.31.180:/nfs /nfs
自动挂载
# NFS服务器提供的共享目录 NFS客户端要挂载的目录(必须存在) 挂载的格式类型 挂载时使用的参数 是否进行备份 fsck检查文件系统的优先级
# <server-ip>:/<shared-directory> /nfs nfs defaults 0 0
# 示例:
echo '10.168.31.180:/nfs /nfs nfs defaults 0 0' >> /etc/fstab
双节点安装配置
服务器
操作系统 | IP地址 | 子网掩码 | 角色 |
---|---|---|---|
alma linux9.3 | 10.168.31.180 | 16 | server |
alma linux9.3 | 10.168.31.181 | 16 | server |
alma linux9.3 | 10.168.31.182 | 16 | client |
alma linux9.3 | 10.168.31.183 | 16 | client |
alma linux9.3 | 10.168.31.171 | 16 | vip |
安装
在每台机器上执行下列的命令
dnf install -y nfs-utils rpcbind
同时,对10.168.31.180和10.168.31.181两个服务端做Keepalived负载均衡。具体配置参考Keepalived部署。
配置
服务端
配置NFS服务端
参考单节点服务端配置
配置Keepalived
配置文件需要在参考文章基础上做修改
mkdir -p /etc/keepalived
cat <<EOF | tee /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
# 增加脚本
vrrp_script chk_nfs {
script "/etc/keepalived/nfs_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER #主节点
interface ens160
virtual_router_id 51 #相同id管理同一个虚拟路由
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
# 引用脚本
track_script {
chk_nfs
}
virtual_ipaddress {
10.168.31.171/16 dev ens160 label ens160:1
}
}
EOF
编辑nfs_check.sh监控脚本
mkdir -p /etc/keepalived
cat <<EOF | tee /etc/keepalived/nfs_check.sh
#!/bin/bash
A=\`ps -C nfsd --no-header | wc -l\`
if [ \$A -eq 0 ];then
systemctl restart nfs-server.service
sleep 2
if [ \`ps -C nfsd --no-header| wc -l\` -eq 0 ];then
pkill keepalived
fi
fi
EOF
chmod +x /etc/keepalived/nfs_check.sh
安装部署Rsync+Inofity
两台master节点都要操作
- 安装软件
dnf install -y rsync inotify-tools
inotify-tools无法安装可以先换成阿里源
dnf install -y https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
dnf install -y inotify-tools
- 配置
在第一个主节点
cat <<EOF | tee /etc/rsyncd.conf
uid = root
gid = root
# 如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。
# 这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。
# 默认情况下chroot值为true。
use chroot = yes
port = 873
#允许ip访问设置,可以指定ip或ip段
hosts allow = 10.168.0.0/16
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3
# 模块名称,和comment对应
[master]
# 要同步的目录
path = /nfs
# 当前节点模块名称
comment = master
# 是否允许客户端上传文件
ignore errors
read only = no
list = no
# 指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块
auth users = rsync
# 保存密码和用户名文件,需要自己生成
secrets file = /etc/rsync/rsyncd.passwd
EOF
# 创建自定义配置文件目录
mkdir /etc/rsync
# 密码和用户文件(格式为"用户名:密码")
cat <<EOF | tee /etc/rsync/rsyncd.passwd
rsync:123456
EOF
# 编辑同步密码(注意这个文件和上面的密码和用户文件路径不一样)
# 该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是rsync:123456,则主服务器则写123456一个就可以了
cat <<EOF | tee /etc/rsync/slave.passwd
123456
EOF
# 设置文件执行权限
chmod 600 /etc/rsync/rsyncd.passwd
chmod 600 /etc/rsync/slave.passwd
# 设置开机启动
echo "/usr/bin/rsync --daemon" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
另外一个节点的配置需要修改rsyncd.conf文件内模块的名称为slave,其余相同。
测试
rsync -avzP --progress --delete --timeout=100 /nfs/ rsync@10.168.31.181::slave --password-file=/etc/rsync/slave.passwd
rsync常用命令
# -v,--verbose 详细模式输出,传输是的进度信息
# -z,--compress 传输是进行压缩以提高传输效率,--comperess -level = NUM可以按级别压缩
# -a,--archive 归档模式,表示以递归方式传输文件,并保持所有文件属性(等于-rtopgDl)
# --port 指定端口
# -e 'ssh -p 2222' 指定使用ssh及其端口
# --timeout 超时时间
# --partial-dir 临时目录,传输完毕,移动到正式目录
# --password-file 指定存密码的文件
# --progress 打印进度
# --delete 删除目标目录中源目录没有的文件
# -P 支持断点,综合了--partial --progress两个参数
- 配置自动同步
在主节点
# 自动同步脚本
cat <<EOF | tee /etc/rsync/rsync_inotify.sh
#!/bin/bash
#配置另外一个节点的IP
host=10.168.31.181
#配置另外一个节点的名称
des=slave
src=/nfs/
password=/etc/rsync/slave.passwd
user=rsync
inotifywait=/usr/bin/inotifywait
\$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /nfs/ \\
| while read files ;do
rsync -avzP --progress --delete --timeout=100 /nfs/ rsync@10.168.31.181::slave --password-file=/etc/rsync/slave.passwd
done
EOF
# VIP监控脚本
cat <<EOF | tee /etc/rsync/vip_monitor.sh
#!/bin/bash
VIP_NUM=\`ip addr|grep 31.171|wc -l\`
RSYNC_INOTIRY_NUM=\`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l\`
if [ \${VIP_NUM} -ne 0 ];then
echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
if [ \${RSYNC_INOTIRY_NUM} -ne 0 ];then
echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1
else
echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1
/bin/bash -x /etc/rsync/rsync_inotify.sh >/dev/null 2>&1
fi
else
echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1
if [ \${RSYNC_INOTIRY_NUM} -ne 0 ];then
echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1
ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print \$2}'|xargs kill -9
ps -ef|grep /usr/bin/inotifywait|grep -v grep|awk '{print \$2}'|xargs kill -9
else
echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1
fi
fi
EOF
# 持续执行脚本
cat <<EOF | tee /etc/rsync/rsync_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
/bin/bash -x /etc/rsync/vip_monitor.sh >/dev/null 2>&1
done
EOF
# 设置rsync_monit.sh脚本的开机启动
chmod 755 /etc/rsync/rsync_inotify.sh
chmod 755 /etc/rsync/vip_monitor.sh
chmod 755 /etc/rsync/rsync_monit.sh
echo "nohup sh /etc/rsync/rsync_monit.sh > /tmp/rsync_monit.log 2>&1 & " >> /etc/rc.d/rc.local
在从节点
# 自动同步脚本
cat <<EOF | tee /etc/rsync/rsync_inotify.sh
#!/bin/bash
#配置另外一个节点的IP
host=10.168.31.180
#配置另外一个节点的名称
des=master
src=/nfs/
password=/etc/rsync/slave.passwd
user=rsync
inotifywait=/usr/bin/inotifywait
\$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib /nfs/ \\
| while read files ;do
rsync -avzP --progress --delete --timeout=100 /nfs/ rsync@10.168.31.180::master --password-file=/etc/rsync/slave.passwd
done
EOF
# VIP监控脚本
cat <<EOF | tee /etc/rsync/vip_monitor.sh
#!/bin/bash
VIP_NUM=\`ip addr|grep 31.171|wc -l\`
RSYNC_INOTIRY_NUM=\`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l\`
if [ \${VIP_NUM} -ne 0 ];then
echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
if [ \${RSYNC_INOTIRY_NUM} -ne 0 ];then
echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1
else
echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1
/bin/bash -x /etc/rsync/rsync_inotify.sh >/dev/null 2>&1
fi
else
echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1
if [ \${RSYNC_INOTIRY_NUM} -ne 0 ];then
echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1
ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print \$2}'|xargs kill -9
ps -ef|grep /usr/bin/inotifywait|grep -v grep|awk '{print \$2}'|xargs kill -9
else
echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1
fi
fi
EOF
# 持续执行脚本
cat <<EOF | tee /etc/rsync/rsync_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
/bin/bash -x /etc/rsync/vip_monitor.sh >/dev/null 2>&1
done
EOF
# 设置rsync_monit.sh脚本的开机启动
chmod 755 /etc/rsync/rsync_inotify.sh
chmod 755 /etc/rsync/vip_monitor.sh
chmod 755 /etc/rsync/rsync_monit.sh
echo "nohup sh /etc/rsync/rsync_monit.sh > /tmp/rsync_monit.log 2>&1 & " >> /etc/rc.d/rc.local
客户端
挂载同单节点挂在,但是挂载IP为配置的VIP