赞
踩
NFS(Network File System)高可用集群的实现,是为了确保NFS服务在单点故障时能够持续提供服务,从而提高系统的稳定性和数据的可靠性。以下是一些详细的NFS高可用集群方案:
方案概述:
该方案通过Keepalived实现NFS服务的高可用性。Keepalived是一个基于VRRP(Virtual Router Redundancy Protocol)协议的高可用软件,它可以监控服务器的状态,并在主服务器故障时自动将虚拟IP(VIP)漂移到备份服务器,从而实现服务的无缝切换。
实施步骤:
在所有NFS节点上安装NFS和Keepalived服务。
确保NFS服务配置正确,共享目录和权限设置满足需求。
在主节点和备份节点上配置Keepalived,设置VIP和相应的健康检查脚本。
确保健康检查脚本能够准确监测NFS服务的状态。
实现简单,配置灵活。
无需额外的硬件支持,成本较低。
支持自动故障转移,恢复时间短。
依赖于网络稳定性,网络故障可能导致VIP漂移失败。
在极端情况下,可能存在脑裂问题(即两个节点都认为自己是主节点)。
方案概述:
该方案通过DRBD(Distributed Replicated Block Device)和Heartbeat实现NFS服务的高可用性。DRBD是一种基于块级别的数据复制技术,可以在两台或多台服务器之间实时同步数据。Heartbeat则用于监控服务器状态和实现故障转移。
实施步骤:
在所有NFS节点上安装DRBD和Heartbeat服务。
配置DRBD以在节点之间同步数据。
在DRBD的主节点上配置NFS服务,并设置共享目录。
确保NFS服务只在主节点上启动,并通过DRBD保持数据同步。
设置Heartbeat以监控NFS节点状态,并在主节点故障时自动将NFS服务切换到备份节点。
配置Heartbeat以启动或停止DRBD服务,确保数据同步的一致性。
数据同步级别高,可靠性好。
支持多种同步模式,可根据需求灵活配置。
Heartbeat配置灵活,支持多种资源接管策略。
配置相对复杂,需要一定的技术基础。
对网络带宽和存储性能有一定要求。
方案概述:
该方案通过Sersync实现NFS节点之间的数据实时同步。Sersync是一个基于rsync和inotify的文件同步工具,可以实时监控文件系统的变化,并将变化实时同步到远程服务器。
实施步骤:
在所有NFS节点上安装NFS服务。
在主节点上安装Sersync服务,并配置为监控NFS共享目录。
设置Sersync以监控NFS共享目录的变化,并将变化实时同步到备份节点。
配置Sersync的同步策略和过滤规则,以满足实际需求。
实时同步性能好,数据一致性好。
配置简单,易于维护。
依赖于网络稳定性,网络故障可能导致同步失败。
在高并发场景下,同步性能可能受到影响。
以上三种方案各有优缺点,具体选择哪种方案取决于实际需求、系统环境和技术基础。在实际应用中,可以根据具体情况进行选择和调整。同时,为了确保NFS高可用集群的稳定性和可靠性,还需要进行充分的测试和优化。
IP地址 | 主机名 | 描述 |
---|---|---|
192.168.0.244 | / | 虚拟 ip(Vip) |
192.168.0.242 | nfs01 | nfs实例1 (centos 7.9) |
192.168.0.243 | nfs02 | nfs实例2 (centos 7.9) |
192.168.0.214 | nfs client | nfs客户端 (centos 7.9) |
# 关闭防火墙
systemctl stop firewalld
# 关闭开机自启
systemctl disable firewalld
#临时关闭SELinux
sudo setenforce 0
#永久关闭SELinux
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
在 nfs01、nfs02和 nfs client服务器上安装 NFS 服务
yum -y install nfs-utils rpcbind
#创建共享目录
mkdir /data
在 nfs01、nfs02里配置
cat >> /etc/hosts << EOF
192.168.0.242 nfs01
192.168.2.243 nfs02
EOF
# 其中/data 为共享的目录,192.168.0.0/24 为可以访问nfs服务器的子网端,如要指定ip可以填写ip地址(192.168.0.214)
echo '/data 192.168.0.0/24(rw,sync,all_squash)' >> /etc/exports
在 nfs01、nfs02和 nfs client服务器执行
# 开启服务
systemctl start rpcbind && systemctl start nfs
# 设置开机自启
systemctl enable rpcbind && systemctl enable nfs
# 测试 nfs01 mount -t nfs 192.168.0.242:/data /data # 检查 df -Th #出现192.168.0.242:/data nfs4 50G 2.6G 48G 6% /data 即为成功 # 去除挂载 umount /data # 测试 nfs03 mount -t nfs 192.168.0.243:/data /data # 检查 df -Th #出现192.168.0.243:/data nfs4 50G 2.6G 48G 6% /data 即为成功 # 去除挂载 umount /data
nfs02服务器配置 # 安装 rsync yum -y install rsync.x86_64 # 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 master ip uid = nfsnobody gid = nfsnobody port = 873 pid file = /var/rsyncd.pid log file = /var/log/rsyncd.log use chroot = no max connections = 200 read only = false list = false fake super = yes ignore errors [data] path = /data auth users = qiyuesuo secrets file = /etc/rsync_salve.pass hosts allow = 192.168.0.242 # 生成认证文件 echo 'qiyuesuo:nfstest123' > /etc/rsync_salve.pass chmod 600 /etc/rsync_salve.pass # 修改 文件夹权限 chown -R nfsnobody:nfsnobody /data/ # 启动服务 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
在nfs01创建文件,测试是否可以同步到nfs02
yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /data/
echo "nfstest123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
#创建测试文件,测试推送
cd /data/
echo "This is test file" > file.txt
rsync -arv /data/ qiyuesuo@192.168.0.243::data --password-file=/etc/rsync.pass
#在 nfs02 上测试
ls /data
# 出现 file.txt 即可
cd /usr/local/
wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ sersync
cd sersync/
# 修改配置文件
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xml
sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/data">#g' confxml.xml
sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.0.243" name="data"/>#g' confxml.xml
sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="qiyuesuo" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#修改一下配置,看下面截图
vi /usr/local/sersync/confxml.xml
#启动Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
<delete start="true"/>
: 文件/文件夹被删除<createFolder start="true"/>
: 创建文件夹<createFile start="true"/>
: 创建文件<closeWrite start="true"/>
: 文件写入完成<moveFrom start="true"/>
: 文件从一个位置移动<moveTo start="true"/>
: 文件移动到新的位置<attrib start="false"/>
: 文件属性被修改<modify start="false"/>
: 文件内容被修改# 修改 /etc/rsyncd.conf 如下,其中 hosts allow 填写 slave ip uid = nfsnobody gid = nfsnobody port = 873 pid file = /var/rsyncd.pid log file = /var/log/rsyncd.log use chroot = no max connections = 200 read only = false list = false fake super = yes ignore errors [data] path = /data auth users = qiyuesuo secrets file = /etc/rsync_master.pass hosts allow = 192.168.0.243 # 生成认证文件 echo 'qiyuesuo:nfstest123' > /etc/rsync_master.pass chmod 600 /etc/rsync_master.pass # 修改 文件夹权限 chown -R nfsnobody:nfsnobody /data/ # 启动服务 /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
在nfs02创建文件,测试是否可以同步到nfs01
yum -y install rsync.x86_64
chown -R nfsnobody:nfsnobody /data/
echo "nfstest123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
#创建测试文件,测试推送
cd /data/
echo "This is test file2" > file2.txt
rsync -arv /data/ qiyuesuo@192.168.0.242::data --password-file=/etc/rsync.pass
#在 nfs01 上测试
ls /data
# 出现 file2.txt 即可
cd /usr/local/
wget https://dl.qiyuesuo.com/private/nfs/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86/ sersync
cd sersync/
# 修改配置文件
sed -ri 's#<delete start="true"/>#<delete start="false"/>#g' confxml.xml
sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/data">#g' confxml.xml
sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="192.168.0.242" name="data"/>#g' confxml.xml
sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml
sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="qiyuesuo" passwordfile="/etc/rsync.pass"/>#g' confxml.xml
sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml
#修改一下配置,看下面截图
vi /usr/local/sersync/confxml.xml
#启动Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
对于 iNotify 事件的默认配置,通常会包含以下内容:
<delete start="true"/>
: 文件/文件夹被删除<createFolder start="true"/>
: 创建文件夹<createFile start="true"/>
: 创建文件<closeWrite start="true"/>
: 文件写入完成<moveFrom start="true"/>
: 文件从一个位置移动<moveTo start="true"/>
: 文件移动到新的位置<attrib start="false"/>
: 文件属性被修改<modify start="false"/>
: 文件内容被修改#在nfs01、nfs02安装
yum -y install keepalived
分别在nfs01、nfs02编写sersync2健康检查脚本
wi /usr/local/check_rsync.sh
#!/bin/sh
if [ `ps -C sersync2 --no-header |wc -l` -eq 0 ];then
exit 1
else
exit 0
fi
在nfs01编写keepalived配置文件
vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id NFS-Master } vrrp_script check_rsync { script "/usr/local/check_rsync.sh" interval 2 # 每10秒检查一次 weight 2 } vrrp_instance VI_1 { state MASTER interface ens3 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass qiyuesuo123 } unicast_src_ip 192.168.0.242 unicast_peer { 192.168.0.243 } virtual_ipaddress { 192.168.0.244 } track_script { check_rsync } } # 启动服务 systemctl start keepalived.service && systemctl enable keepalived.service
在nfs02编写keepalived配置文件
vi /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id NFS-Slave } vrrp_script check_rsync { script "/usr/local/check_rsync.sh" interval 2 # 每10秒检查一次 weight 2 } vrrp_instance VI_1 { state MASTER interface ens3 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass qiyuesuo123 } unicast_src_ip 192.168.0.243 unicast_peer { 192.168.0.242 } virtual_ipaddress { 192.168.0.244 } track_script { check_rsync } } # 启动服务 systemctl start keepalived.service && systemctl enable keepalived.service
因为 ip 的漂移是根据 keepalived 的存活来判断的,所以在 nfs 宕机之后需要手动停止 keepalived 服务来进行ip 的切换,这里在 Master 上编写一个定时任务来检测 nfs 服务是否宕机
在nfs01、nfs02编写
cd /usr/local/sbin # 生成文件check_nfs.sh vim check_nfs.sh #!/bin/sh # 每秒执行一次 step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do ###检查nfs可用性:进程和是否能够挂载 /sbin/service nfs status &>/dev/null if [ $? -ne 0 ];then ###如果服务状态不正常,先尝试重启服务 /sbin/service nfs restart /sbin/service nfs status &>/dev/null if [ $? -ne 0 ];then # 如服务仍不正常,停止 keepalived systemctl stop keepalived.service fi fi sleep $step done exit 0
在nfs01、nfs02加入定时任务
chmod 777 /usr/local/sbin/check_nfs.sh
crontab -e
# 输入定时任务
* * * * * /usr/local/sbin/check_nfs.sh &> /dev/null
在nfs01、nfs02编写
vi /lib/systemd/system/rsyncd.service [Unit] Description=rysnc service After=network.target [Service] Type=forking User=root Group=root Restart=on-failure ExecStart=/usr/bin/rsync --daemon --config=/etc/rsyncd.conf #ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target sudo systemctl daemon-reload sudo systemctl enable rsyncd.service sudo systemctl start rsyncd.service
在 nfs client 添加定时任务,当 nfs的vip 宕机时进行重新挂载
cd /usr/local/ vi check_mount.sh #!/bin/sh # 每秒执行一次 step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do mount=$(df -Th | grep /data) if [ -z "$mount" ] || [ "$mount" = "" ]; then echo "fail" umount /nfs/dockerfile mount -t nfs 192.168.0.244:/data /data fi sleep $step done exit 0
加入定时任务
chmod 777 /usr/local/sbin/check_mount.sh
crontab -e
# 输入定时任务
* * * * * /usr/local/sbin/check_mount.sh &> /dev/null
为什么需要centos系统加载后再手动启动rsync服务呢?
在nfs01配置
cd /usr/local vi start_sersync.sh #!/bin/bash # 检查 rsync 是否在运行 if pgrep -x "rsync" > /dev/null; then # 检查 sersync2 是否在运行 if pgrep -x "sersync2" > /dev/null ; then echo "sersync2 is running, skipping the following commands." else /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml fi else echo "rsync is not running." fi chmod 777 /usr/local/start_sersync.sh
在nfs02配置
cd /usr/local vi start_sersync.sh #!/bin/bash # 检查 rsync 是否在运行 if pgrep -x "rsync" > /dev/null; then # 检查 sersync2 是否在运行 if pgrep -x "sersync2" > /dev/null ; then echo "sersync2 is running, skipping the following commands." else /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml fi else echo "rsync is not running." fi chmod 777 /usr/local/start_sersync.sh
重启nfs01、nfs02、nfs client 3台服务器
reboot
在nfs01、nfs02启动rsync服务
#启动rsync服务
/usr/local/start_sersync.sh
#检查服务是否正常
ps -ef|grep rsync
如果不想要每次开机到执行start_sersync.sh,也可以设置开机自动启动rsync服务(在nfs01、nfs02编写)
#编写开机启动rsync服务脚本 vi /usr/local/auto_start.sh #!/bin/sh # 每5秒执行一次 step=5 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do /usr/local/start_sersync.sh > /usr/local/sersync_log.txt 2>&1 & sleep $step done exit 0 #初始化日志文件 echo "" > /usr/local/sersync_log.txt #加入定时任务 crontab -e * * * * * /usr/local/auto_start.sh
检查vip是否能正常
ip a
检查nfs client是否开机启动后能正常自动挂载
df -hT
在nfs clien创建一个文件测试
cd /data
echo "test" > test.txt
在nfs01、nfs02验证是否同步成功
cd /data
ll
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。