当前位置:   article > 正文

Centos搭建nfs高可用集群(详细教程)_nfs集群

nfs集群

centos搭建NFS高可用集群(NFS+keepalived+Sersync)

一、前言

    NFS(Network File System)高可用集群的实现,是为了确保NFS服务在单点故障时能够持续提供服务,从而提高系统的稳定性和数据的可靠性。以下是一些详细的NFS高可用集群方案:

1. NFS+Keepalived+VIP(虚拟IP)

方案概述:

    该方案通过Keepalived实现NFS服务的高可用性。Keepalived是一个基于VRRP(Virtual Router Redundancy Protocol)协议的高可用软件,它可以监控服务器的状态,并在主服务器故障时自动将虚拟IP(VIP)漂移到备份服务器,从而实现服务的无缝切换。

实施步骤:

  • 安装NFS和Keepalived:

    在所有NFS节点上安装NFS和Keepalived服务。
    确保NFS服务配置正确,共享目录和权限设置满足需求。

  • 配置Keepalived:

    在主节点和备份节点上配置Keepalived,设置VIP和相应的健康检查脚本。
    确保健康检查脚本能够准确监测NFS服务的状态。

  • 优点:

    实现简单,配置灵活。
    无需额外的硬件支持,成本较低。
    支持自动故障转移,恢复时间短。

  • 缺点:

    依赖于网络稳定性,网络故障可能导致VIP漂移失败。
    在极端情况下,可能存在脑裂问题(即两个节点都认为自己是主节点)。

2. NFS+DRBD+Heartbeat

方案概述:

    该方案通过DRBD(Distributed Replicated Block Device)和Heartbeat实现NFS服务的高可用性。DRBD是一种基于块级别的数据复制技术,可以在两台或多台服务器之间实时同步数据。Heartbeat则用于监控服务器状态和实现故障转移。

实施步骤:

  • 安装DRBD和Heartbeat:

    在所有NFS节点上安装DRBD和Heartbeat服务。
    配置DRBD以在节点之间同步数据。

  • 配置NFS服务:

     在DRBD的主节点上配置NFS服务,并设置共享目录。
    确保NFS服务只在主节点上启动,并通过DRBD保持数据同步。

  • 配置Heartbeat:

    设置Heartbeat以监控NFS节点状态,并在主节点故障时自动将NFS服务切换到备份节点。
    配置Heartbeat以启动或停止DRBD服务,确保数据同步的一致性。

  • 优点:

    数据同步级别高,可靠性好。
    支持多种同步模式,可根据需求灵活配置。
    Heartbeat配置灵活,支持多种资源接管策略。

  • 缺点:

    配置相对复杂,需要一定的技术基础。
    对网络带宽和存储性能有一定要求。

3. NFS+Sersync

方案概述:

    该方案通过Sersync实现NFS节点之间的数据实时同步。Sersync是一个基于rsync和inotify的文件同步工具,可以实时监控文件系统的变化,并将变化实时同步到远程服务器。

实施步骤:

  • 安装NFS和Sersync:

    在所有NFS节点上安装NFS服务。
    在主节点上安装Sersync服务,并配置为监控NFS共享目录。

  • 配置Sersync:

    设置Sersync以监控NFS共享目录的变化,并将变化实时同步到备份节点。
    配置Sersync的同步策略和过滤规则,以满足实际需求。

  • 优点:

    实时同步性能好,数据一致性好。
    配置简单,易于维护。

  • 缺点:

    依赖于网络稳定性,网络故障可能导致同步失败。
    在高并发场景下,同步性能可能受到影响。

    以上三种方案各有优缺点,具体选择哪种方案取决于实际需求、系统环境和技术基础。在实际应用中,可以根据具体情况进行选择和调整。同时,为了确保NFS高可用集群的稳定性和可靠性,还需要进行充分的测试和优化。

二、主机清单

IP地址主机名描述
192.168.0.244/虚拟 ip(Vip)
192.168.0.242nfs01nfs实例1 (centos 7.9)
192.168.0.243nfs02nfs实例2 (centos 7.9)
192.168.0.214nfs clientnfs客户端 (centos 7.9)

三、安装nfs

1. 关闭 nfs01、nfs02 服务器上的防火墙j及SELinux

# 关闭防火墙
systemctl stop firewalld
# 关闭开机自启
systemctl disable firewalld

#临时关闭SELinux
sudo setenforce 0
#永久关闭SELinux
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2. 安装 NFS

在 nfs01、nfs02和 nfs client服务器上安装 NFS 服务

yum -y install nfs-utils rpcbind

#创建共享目录
mkdir /data
  • 1
  • 2
  • 3
  • 4

3. 配置 NFS 共享目录

在 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. 启动nfs服务器

在 nfs01、nfs02和 nfs client服务器执行

# 开启服务
systemctl start rpcbind && systemctl start nfs
# 设置开机自启
systemctl enable rpcbind && systemctl enable nfs
  • 1
  • 2
  • 3
  • 4

5. 测试挂载是否成功

# 测试 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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

四、配置文件同步

1. nfs01同步数据到nfs02

a. 在nfs02服务器配置
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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
b. 在 nfs01上测试

在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 即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
c.在 nfs01上配置自动同步
 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
#修改一下配置,看下面截图
vi /usr/local/sersync/confxml.xml
#启动Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
  • 1
  • 2
  • 3
  • 4
  • <delete start="true"/>: 文件/文件夹被删除
  • <createFolder start="true"/>: 创建文件夹
  • <createFile start="true"/>: 创建文件
  • <closeWrite start="true"/>: 文件写入完成
  • <moveFrom start="true"/>: 文件从一个位置移动
  • <moveTo start="true"/>: 文件移动到新的位置
  • <attrib start="false"/>: 文件属性被修改
  • <modify start="false"/>: 文件内容被修改

在这里插入图片描述

2. nfs02同步数据到nfs01

a. 在nfs01服务器配置
# 修改 /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 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
b. 在 nfs02上测试

在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 即可
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
c.在 nfs02上配置自动同步
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
#修改一下配置,看下面截图
vi /usr/local/sersync/confxml.xml
#启动Sersync
/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
  • 1
  • 2
  • 3
  • 4

对于 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"/>: 文件内容被修改

在这里插入图片描述

五、实现高可用

1. 安装keepalived

#在nfs01、nfs02安装
yum -y install keepalived
  • 1
  • 2

2. 配置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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

3. 设置 keepalived 脚本

因为 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在nfs01、nfs02加入定时任务

chmod 777 /usr/local/sbin/check_nfs.sh
crontab -e
# 输入定时任务
* * * * *  /usr/local/sbin/check_nfs.sh &> /dev/null
  • 1
  • 2
  • 3
  • 4

4.编写开机启动rsyncd服务

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

5. 客户端自动挂载

在 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

加入定时任务

chmod 777 /usr/local/sbin/check_mount.sh
crontab -e
# 输入定时任务
* * * * *  /usr/local/sbin/check_mount.sh &> /dev/null
  • 1
  • 2
  • 3
  • 4

6. 编写启动rsync服务的shell文件

为什么需要centos系统加载后再手动启动rsync服务呢?
在这里插入图片描述

  1. 因为sersync2的同步数据进程是必须唯一的,不能启动多个,不然会影响同步数据的一致性,导致同步数据出问题
  2. rsync执行比较耗时,最好在主线程执行。防止多次执行sersync2服务。

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

7. 测试验证

重启nfs01、nfs02、nfs client 3台服务器

reboot
  • 1

在nfs01、nfs02启动rsync服务

#启动rsync服务
/usr/local/start_sersync.sh

#检查服务是否正常
ps -ef|grep rsync
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
如果不想要每次开机到执行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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

检查vip是否能正常

ip a
  • 1

在这里插入图片描述

检查nfs client是否开机启动后能正常自动挂载

df -hT
  • 1

在这里插入图片描述
在nfs clien创建一个文件测试

cd /data
echo "test" > test.txt
  • 1
  • 2

在nfs01、nfs02验证是否同步成功

cd /data
ll
  • 1
  • 2

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1006076
推荐阅读
相关标签
  

闽ICP备14008679号