1、背景

因为某系统需要部署生产,但是云平台的nas存储资源不足需要重新采购,采购周期较长,需要有一个临时的解决方案,这样时候就需要采用nfs服务来提供网络存储服务了,在部署nfs服务的时候需要考虑生产环境需要有一定的高可用性,经过考虑之后设计为采用keepalived作为的高可用性方案,同时两个nfs节点前面购买一个VIP对外提供服务。

2、架构设计

3、环境信息

序号

服务器地址

Vip

1

192.99.27.34(master)

192.99.27.36

2

192.99.27.35(slave)

4、nfs服务实施部署

4.1 nfs共享目录实施

       考虑到前期系统使用到存储空间较小,后期使用的存储空间较大,所以这里先申请500G的空间并且是使用lvm制作挂载目录,这样后期空间扩容的时候比较好处理,并且是支持在线扩容的操作。

注:如下的操作需要在两个节点都是一样的操作,切记。如果是有区分的会进行特殊的说明的。

1. 创建共享目录

[root@~ /]# mkdir /data

2. 制作lvm存储

这里直接是挂载了一个vdb的500G磁盘的,直接整个磁盘制作lvm即可

[root@~ /]# pvcreate /dev/vdb

[root@~ /]# pvs

  PV           VG      Fmt  Attr PSize    PFree   

  /dev/vdb   data  lvm2 a--  <500.00g 1020.00m

[root@~ /]# vgcreate -n data /dev/vdb

  VG      #PV #LV #SN Attr   VSize    VFree   

  data   1   1   0 wz--n- <500.00g 1020.00m

[root@~ /]# lvcreate -n data data-L 499G

[root@~ /]# lvs

  LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

  data data -wi-ao---- 499.00g      

3. 格式化lvm存储并挂载  

[root@~ /]# mkfs.xfs /dev/data/data  

[root@~ /]# vim /etc/fstab

/dev/data/data  /data                xfs     defaults        0 0

[root@~ /]# mount -a

[root@~ /]# df -h

Filesystem                   Size  Used Avail Use% Mounted on

/dev/mapper/data-data  499G   33M  499G   1% /data

4.2、部署nfs服务

[root@~ /]# yum -y install nfs-utils rpcbind

.............

[root@~ /]# rpm -qa | grep nfs

libnfsidmap-0.25-19.el7.x86_64

nfs-utils-1.3.0-0.68.el7.2.x86_64

[root@~ /]# rpm -qa | grep rpcbind

rpcbind-0.2.0-49.el7.x86_64

[root@~ /]# systemctl start rpcbind && systemctl start nfs

[root@~ /]# systemctl enable rpcbind && systemctl enable nfs

[root@~ /]# systemctl status nfs 

 [root@~ /]#  systemctl status rpcbind

 

4.3、防火墙和selinux关闭

[root@~ /]# systemctl status firewalld

[root@~ /]# getenforce

Disabled

4.4、nfs配置实施

[root@~ /]# vim /etc/exports

/data 192.99.207.0/24(rw,sync,all_squash)

[root@~ /]# systemctl restart rpcbind && systemctl restart nfs

4.5、nfs共享文件数据同步配置

1. 在 Master 进行同步 slave 数据

注:如下的操作是在192.99.27.34(master)上操作的

按照同步服务

[root@~ /]# yum -y install rsync.x86_64

......

创建同步用户

[root@~ /]# useradd data

[root@~ /]# echo data123 | passwd --stdin data

配置rsync配置文件

[root@~ /]# cat /etc/rsyncd.conf

# /etc/rsyncd: configuration file for rsync daemon mode

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 = data

secrets file = /etc/rsync_master.pass

hosts allow = 192.99.27.35

配置认证文件

[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass

[root@~ /]# chmod 600 /etc/rsync_master.pass

设置权限

[root@~ /]# chown -R nfsnobody:nfsnobody /data/

启动rsync服务

[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf

[root@~ /]# ps -ef | grep rsync

root     19899     1  0 Oct10 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf

注:如下的操作在192.99.27.35(slave)上操作

[root@~ /]# yum -y install rsync.x86_64

[root@~ /]# chown -R nfsnobody:nfsnobody /kingdee

配置认证文件

[root@~ /]# echo "data123" > /etc/rsync.pass

[root@~ /]# chmod 600 /etc/rsync.pass

[root@~ /]# cd /data

[root@~ /]# echo "This is test file" > file.2.txt

同步文件

[root@~ /]# rsync -arv /data/ data@100.99.207.34::data --password-file=/etc/rsync.pass

注:如下的操作在192.99.27.34(master)上操作验证

[root@~ /]# cd /data && ll

total 8

-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt

[root@~ data]# cat file.2.txt

This is test file

2. 在 Slave 进行同步 Master 数据

注:如下的操作是在192.99.27.35(slave)上操作的

按照同步服务

[root@~ /]# yum -y install rsync.x86_64

......

创建同步用户

[root@~ /]# useradd data

[root@~ /]# echo data123 | passwd --stdin data

配置rsync配置文件

[root@~ /]# cat /etc/rsyncd.conf

# /etc/rsyncd: configuration file for rsync daemon mode

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 = data

secrets file = /etc/rsync_master.pass

hosts allow = 192.99.27.34

配置认证文件

[root@~ /]# echo 'data:data123' > /etc/rsync_master.pass

[root@~ /]# chmod 600 /etc/rsync_master.pass

设置权限

[root@~ /]# chown -R nfsnobody:nfsnobody /data/

启动rsync服务

[root@~ /]# rsync --daemon --config=/etc/rsyncd.conf

[root@~ /]# ps -ef | grep rsync

root     1984     1  0 Oct10 ?        00:00:00 rsync --daemon --config=/etc/rsyncd.conf

注:如下的操作在192.99.27.34(master)上操作

[root@~ /]# yum -y install rsync.x86_64

[root@~ /]# chown -R nfsnobody:nfsnobody /data

配置认证文件

[root@~ /]# echo "data123" > /etc/rsync.pass

[root@~ /]# chmod 600 /etc/rsync.pass

[root@~ /]# cd /kingdee

[root@~ /]# echo "This is test file 1" > file.1.txt

同步文件

[root@~ /]# rsync -arv /data/ data@100.99.207.35::data --password-file=/etc/rsync.pass

注:如下的操作在192.99.27.35(slave)上操作验证

[root@~ /]# cd /data && ll

total 8

-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.1.txt

-rw-r----- 1 nfsnobody nfsnobody 18 Oct 27 14:21 file.2.txt

[root@~ data]# cat file.1.txt

This is test file 1

3. 配置实时自动同步

以上就完成了nfs的双向同步,但是这里有一个缺点就是,无法做到双向的自动同步,只能是手工的执行,这样的话会出现了两边数据不一致而导致,业务阻断,这样是有需要配置一下自动同步的功能。

将附件上的包上传到/usr/local目录下

注:如下的操作在192.99.27.34(master)上操作验证

[root@~ kingdee]# cd /usr/local

[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@~ local]# mv GNU-Linux-x86/ sersync

[root@~ local]# cd sersync/

修改配置文件

[root@~sersync]# sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/kingdee">#g' confxml.xml

[root@~ sersync]# sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="100.99.207.35" name="kingdee"/>#g' confxml.xml

[root@~ sersync]# sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml

[root@~ sersync]# sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="kingdee" passwordfile="/etc/rsync.pass"/>#g' confxml.xml

[root@~ sersync]# sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml

#启动Sersync

[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

注:如下的操作在192.99.27.35(slave)上操作验证

[root@~ kingdee]# cd /usr/local

[root@~ local]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@~ local]# mv GNU-Linux-x86/ sersync

[root@~ local]# cd sersync/

修改配置文件

[root@~ sersync]# sed -ri '24s#<localpath watch="/opt/tongbu">#<localpath watch="/kingdee">#g' confxml.xml

[root@~ sersync]# sed -ri '25s#<remote ip="127.0.0.1" name="tongbu1"/>#<remote ip="100.99.207.34" name="kingdee"/>#g' confxml.xml

[root@~ sersync]# sed -ri '30s#<commonParams params="-artuz"/>#<commonParams params="-az"/>#g' confxml.xml

[root@~ sersync]# sed -ri '31s#<auth start="false" users="root" passwordfile="/etc/rsync.pas"/>#<auth start="true" users="kingdee" passwordfile="/etc/rsync.pass"/>#g' confxml.xml

[root@~ sersync]# sed -ri '33s#<timeout start="false" time="100"/><!-- timeout=100 -->#<timeout start="true" time="100"/><!-- timeout=100 -->#g' confxml.xml

#启动Sersync

[root@~ sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

4. 测试master和slave的自动同步功能

在master节点上/kingdee目录下创建目录、创建文件、修改文件内容、重命名文件、删除文件、删除文件夹、删除文件内容都能自动同步到slave节点的/kingdee目录下。具体操作这里就不能写了,自行进行验证。

4.6、部署keepalived服务

Nfs提供高可用性需要部署一个keepalived来的来提供一个vip,客户端通过这个vip来访问nfs存储。这里需要去申请一个vip地址,这个vip绑定了192.99.27.34,192.99.27.35两个服务器地址。

注:如下的操作在192.99.27.34(master)上操作验证

[root@~ ]# yum install -y keepalived

配置keepalived配置文件

[root@~ ]# cd /etc/keepalived/

先备份keepalived.conf文件

[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026

[root@keepalived ]# vim keepalived.conf

配置内容如下:

! Configuration File for keepalived

vrrp_script chk_process {

        script "/etc/keepalived/check_process.sh"

        interval 10

        weight 2

}

global_defs {

   notification_email {

        sys_ft_mw_adm@cmft.com

   }

   notification_email_from sys_ft_mw_adm@cmft.com

   smtp_server mail.cmft.com

   smtp_connect_timeout 30

   router_id CMFT_WEB

}

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 53                 

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass cmft_web

    }

   track_script {

        #run the script

        chk_process

    }

    virtual_ipaddress {

        192.99.27.36

    }

}

配置keepalived依赖进程的检查脚本

[root@keepalived ]#  vim check_process.sh

#!/bin/bash

#间隔的秒数,不能大于60

step=1

for (( i = 0; i < 60; i=(i+step) ));

do

  ###检查nfs可用性:进程和是否能够挂载

  systemctl status nfs &>/dev/null

  if [ $? -ne 0 ];then

    ###如果服务状态不正常,先尝试重启服务

    systemctl restart nfs

    systemctl status nfs &>/dev/null

    if [ $? -ne 0 ];then

       # 如服务仍不正常,停止 keepalived

       systemctl stop keepalived.service

    fi

  fi

  sleep $step

Done

[root@keepalived ]# systemctl start keepalived

[root@keepalived ]# systemctl enable keepalived

注:如下的操作在192.99.27.35(slave)上操作验证

[root@~ ]# yum install -y keepalived

配置keepalived配置文件

[root@~ ]# cd /etc/keepalived/

先备份keepalived.conf文件

[root@keepalived ]# cp keepalived.conf keepalived.conf_back20221026

[root@keepalived ]# vim keepalived.conf

配置内容如下:

! Configuration File for keepalived

vrrp_script chk_process {

        script "/etc/keepalived/check_process.sh"

        interval 10

        weight 2

}

global_defs {

   notification_email {

        sys_ft_mw_adm@cmft.com

   }

   notification_email_from sys_ft_mw_adm@cmft.com

   smtp_server mail.cmft.com

   smtp_connect_timeout 30

   router_id CMFT_WEB

}

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 53                 

    priority 80

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass cmft_web

    }

   track_script {

        #run the script

        chk_process

    }

    virtual_ipaddress {

        192.99.27.36

    }

}

配置keepalived依赖进程的检查脚本

[root@keepalived ]#  vim check_process.sh

#!/bin/bash

#间隔的秒数,不能大于60

step=1

for (( i = 0; i < 60; i=(i+step) ));

do

  ###检查nfs可用性:进程和是否能够挂载

  systemctl status nfs &>/dev/null

  if [ $? -ne 0 ];then

    ###如果服务状态不正常,先尝试重启服务

    systemctl restart nfs

    systemctl status nfs &>/dev/null

    if [ $? -ne 0 ];then

       # 如服务仍不正常,停止 keepalived

       systemctl stop keepalived.service

    fi

  fi

  sleep $step

Done

[root@keepalived ]# systemctl start keepalived

[root@keepalived ]# systemctl enable keepalived

5.客户端访问nfs服务开墙

[root@ keepalived]# cat /etc/services | grep nfs

nfs             2049/tcp        nfsd shilp      # Network File System

nfs             2049/udp        nfsd shilp      # Network File System

nfs             2049/sctp       nfsd shilp      # Network File System

注:所以客户端访问nfs需要开墙到nfs服务端的2049端口即可

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐