1、背景

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

2、架构设计

nfs共享存储 java nfs高可用 共享存储_nfs共享存储 java

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

nfs共享存储 java nfs高可用 共享存储_linux_02

 [root@~ /]#  systemctl status rpcbind

 

nfs共享存储 java nfs高可用 共享存储_运维_03

4.3、防火墙和selinux关闭

[root@~ /]# systemctl status firewalld

nfs共享存储 java nfs高可用 共享存储_docker_04

[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端口即可