• NFS高可用方案:NFS+keepalived+Sersync


    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###g' confxml.xml

    [root@~ sersync]# sed -ri '25s###g' confxml.xml

    [root@~ sersync]# sed -ri '30s###g' confxml.xml

    [root@~ sersync]# sed -ri '31s###g' confxml.xml

    [root@~ sersync]# sed -ri '33s###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###g' confxml.xml

    [root@~ sersync]# sed -ri '25s###g' confxml.xml

    [root@~ sersync]# sed -ri '30s###g' confxml.xml

    [root@~ sersync]# sed -ri '31s###g' confxml.xml

    [root@~ sersync]# sed -ri '33s###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端口即可

     

  • 相关阅读:
    ClickHouse SQL 查询优化
    ThreadLocal 源码分析
    简易介绍如何使用淘宝商品详情 API(关键词搜索商品列表API)
    爬虫入门基础与Selenium反爬虫策略
    Node+Vue3+mysql+ant design实现前后端分离——表格的添加、修改和删除
    项目经理7大步骤轻松跟进项目,让你带项目不再那么累
    数组和对象的解构
    GitHub暴涨4W下载量!阿里内网的大型分布式技术手册到底有多强
    Nacos作为注册中心和配置中心的使用总结
    springboot+自行车网上商城 毕业设计-附源码130948
  • 原文地址:https://blog.csdn.net/jiang0615csdn/article/details/127553546