• NFS双机热备高可用环境


    NFS高可用目的

    部署NFS双机热备高可用环境,用作K8S容器集群的远程存储,实现K8S数据持久化。
     
    NFS高可用思路
    NFS + Keepalived 实现高可用,防止单点故障。
    Rsync+Inotify 实现主备间共享数据进行同步。
     
    环境准备

    技术要求

    • 两个NFS节点机器的配置要一致
    • keepalived监控nfs进程,master的nfs主进程宕掉无法启动时由slave的nfs接管继续工作。
    • k8s数据备份到slave,同时master和slave数据用rsync+inotify实时同步,保证数据完整性。
    • 生产环境下,最好给NFS共享目录单独挂载一块硬盘或单独的磁盘分区。
     
    关闭两台节点机的防火墙和Selinux
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    关闭防火墙
    # systemctl stop firewalld.service
    # systemctl disable firewalld.service
    # firewall-cmd --state
    not running
     
    关闭selinux
    # cat /etc/sysconfig/selinux
    SELINUX=disabled
     
    # setenforce 0
    # getenforce
    Disabled
    # reboot

      

    NFS高可用部署记录
    一、安装部署NFS服务(Master和Slave两机器同样操作)
    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
    40
    41
    42
    43
    44
    45
    1)安装nfs
    # yum -y install nfs-utils
     
    2)创建nfs共享目录
    # mkdir /data/k8s_storage
     
    3)编辑export文件,运行k8s的node节点挂载nfs共享目录
    这里可以使用node节点的ip网段进行挂载配置
    也可以直接使用node节点的具体ip(一个ip配置一行)进行挂载配置
    # vim /etc/exports
    /data/k8s_storage 172.16.60.0/24(rw,sync,no_root_squash)
     
    4)配置生效
    # exportfs -r
     
    5)查看生效
    # exportfs
     
    6)启动rpcbind、nfs服务
    # systemctl restart rpcbind && systemctl enable rpcbind
    # systemctl restart nfs && systemctl enable nfs
     
    7)查看 RPC 服务的注册状况
    # rpcinfo -p localhost
     
    8)showmount测试
    Master节点测试
    # showmount -e 172.16.60.235
    Export list for 172.16.60.235:
    /data/k8s_storage 172.16.60.0/24
     
    Slave节点测试
    # showmount -e 172.16.60.236
    Export list for 172.16.60.236:
    /data/k8s_storage 172.16.60.0/24
     
    #############################################################################
    或者到ks的任意一个node节点上手动尝试挂载NFS,看是否挂载成功:
    [root@k8s-node01 ~]# mkdir /haha
    [root@k8s-node01 ~]# mount -t nfs 172.16.60.235:/data/k8s_storage /haha
    [root@k8s-node01 ~]# umount /haha
    [root@k8s-node01 ~]# mount -t nfs 172.16.60.236:/data/k8s_storage /haha
    [root@k8s-node01 ~]# umount /haha
    [root@k8s-node01 ~]# rm -rf /haha
    #############################################################################

      

    二、安装部署keepalived(Master和Slave两机器同样操作)
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    1)安装keepalived
    # yum -y install keepalived
     
    2)Master节点的keepalived.conf配置
    这里特别需要注意:
    一定要设置keepalived为非抢占模式,如果设置成抢占模式会在不断的切换主备时容易造成NFS数据丢失。
     
    # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
    # >/etc/keepalived/keepalived.conf
    # vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
        router_id master   #id可以随便设
    }
    vrrp_script chk_nfs {
        script "/etc/keepalived/nfs_check.sh"    #监控脚本
        interval 2
        weight -20   #keepalived部署了两台,所以设为20,如果三台就设为30
    }
    vrrp_instance VI_1 {
        state BACKUP    #两台主机都设为backup非抢占模式
        interface eth0  #网卡名写自己的,不要照抄
        virtual_router_id 51
        priority 100    #master设为100,backup设为80,反正要比100小
        advert_int 1
        nopreempt       #设置为非抢占模式必须要该参数
        authentication {
            auth_type PASS
            auth_pass 1111
        }  
        track_script {
            chk_nfs
        }
        virtual_ipaddress {
            172.16.60.244      #虚拟ip
        }
    }
     
    3)Slave节点的keepalived.conf配置
    只需将priority参数项修改为80,其他配置的和master节点一样,脚本也一样。
     
    # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
    # >/etc/keepalived/keepalived.conf
    # vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
        router_id master  
    }
    vrrp_script chk_nfs {
        script "/etc/keepalived/nfs_check.sh"   
        interval 2
        weight -20  
    }
    vrrp_instance VI_1 {
        state BACKUP   
        interface eth0 
        virtual_router_id 51
        priority 80  
        advert_int 1
        nopreempt      
        authentication {
            auth_type PASS
            auth_pass 1111
        }  
        track_script {
            chk_nfs
        }
        virtual_ipaddress {
            172.16.60.244     
        }
    }
     
     
    4)编辑nfs_check.sh监控脚本
    # vim /etc/keepalived/nfs_check.sh
    #!/bin/bash
    A=`ps -C nfsd --no-header | wc -l`
    if [ $A -eq 0 ];then
            systemctl restart nfs-server.service
            sleep 2
            if [ `ps -C nfsd --no-header| wc -l` -eq 0 ];then
                pkill keepalived
            fi
    fi
     
    设置脚本执行权限
    # chmod 755 /etc/keepalived/nfs_check.sh
     
    5)启动keepalived服务
    # systemctl restart keepalived.service && systemctl enable keepalived.service
     
    查看服务进程是否启动
    # ps -ef|grep keepalived
     
    6)检查vip是否存在
    在两台节点机器上执行"ip addr"命令查看vip,其中会在一台机器上产生vip地址。
    # ip addr|grep 172.16.60.244
        inet 172.16.60.244/32 scope global eth0
         
    测试vip地址要能被ping通 
    # ping 172.16.60.244
    PING 172.16.60.244 (172.16.60.244) 56(84) bytes of data.
    64 bytes from 172.16.60.244: icmp_seq=1 ttl=64 time=0.063 ms
    64 bytes from 172.16.60.244: icmp_seq=2 ttl=64 time=0.042 ms
    64 bytes from 172.16.60.244: icmp_seq=3 ttl=64 time=0.077 ms
     
    7)keepalived故障测试
    停掉vip所在的Master节点机器上的keepalived服务后,发现vip会自动飘移到另一台Backup机器上才算测试成功。
    当该Master节点的keepalived服务重新启动后,vip不会重新飘移回来。因为keepalived采用了非抢占模式。
     
    如果keepalived设置为抢占模式,vip会在Master节点的keepalived重启恢复后自动飘回去,
    但是这样一直来回切换可能会造成NFS数据不完整,因为这里必须设置成非抢占模式。
     
    由于配置了nfs的nfs_check.sh监控脚本,所以当其中一台节点机器上的NFS服务宕停后会自动重启NFS。
    如果NFS服务重启失败,则会自动关闭该节点机器上的keepalived服务,如果该节点有vip则会自动飘移到另外一台节点上。

      

    三、安装部署Rsync+Inofity(Master和Slave两机器都要操作)
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    1)安装rsync和inotify
    # yum -y install rsync inotify-tools
     
    2)Master节点机器配置rsyncd.conf
    # cp /etc/rsyncd.conf /etc/rsyncd.conf_bak
    # >/etc/rsyncd.conf
    # vim /etc/rsyncd.conf
    uid = root
    gid = root
    use chroot = 0
    port = 873
    hosts allow = 172.16.60.0/24  #允许ip访问设置,可以指定ip或ip段
    max connections = 0
    timeout = 300
    pid file /var/run/rsyncd.pid
    lock file /var/run/rsyncd.lock
    log file /var/log/rsyncd.log
    log format = %t %a %m %f %b
    transfer logging = yes
    syslog facility = local3
     
    [master_web]
    path = /data/k8s_storage
    comment = master_web
    ignore errors
    read only = no   #是否允许客户端上传文件
    list = no
    auth users rsync  #指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块
    secrets file /etc/rsyncd.passwd  #保存密码和用户名文件,需要自己生成
     
    编辑密码和用户文件(格式为"用户名:密码"
    # vim /etc/rsyncd.passwd
    rsync:123456
     
    编辑同步密码(注意这个文件和上面的密码和用户文件路径不一样)
    该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是rsync:123456,则主服务器则写123456一个就可以了
    # vim /opt/rsyncd.passwd
    123456
     
    设置文件执行权限
    # chmod 600 /etc/rsyncd.passwd
    # chmod 600 /opt/rsyncd.passwd
     
    启动服务
    # systemctl enable rsyncd && systemctl restart rsyncd
     
    检查rsync服务进程是否启动
    # ps -ef|grep rsync
     
    3)Slave节点机器配置rsyncd.conf
    就把master主机/etc/rsyncd.conf配置文件里的[master_web]改成[slave_web]
    其他都一样,密码文件也设为一样
     
    # cp /etc/rsyncd.conf /etc/rsyncd.conf_bak
    # >/etc/rsyncd.conf
    # vim /etc/rsyncd.conf
    uid = root
    gid = root
    use chroot = 0
    port = 873
    hosts allow = 172.16.60.0/24
    max connections = 0
    timeout = 300
    pid file /var/run/rsyncd.pid
    lock file /var/run/rsyncd.lock
    log file /var/log/rsyncd.log
    log format = %t %a %m %f %b
    transfer logging = yes
    syslog facility = local3
     
    [slave_web]
    path = /data/k8s_storage
    comment = master_web
    ignore errors
    read only = no
    list = no
    auth users rsync
    secrets file /etc/rsyncd.passwd
     
    编辑密码和用户文件(格式为"用户名:密码"
    # vim /etc/rsyncd.passwd
    rsync:123456
     
    编辑同步密码
    # vim /opt/rsyncd.passwd
    123456
     
    设置文件执行权限
    # chmod 600 /etc/rsyncd.passwd
    # chmod 600 /opt/rsyncd.passwd
     
    启动服务
    # systemctl enable rsyncd && systemctl restart rsyncd
     
    检查rsync服务进程是否启动
    # ps -ef|grep rsync

      

    4)手动验证下Master节点NFS数据同步到Slave节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    在Master节点的NFS共享目录下创建测试数据
    # ls /data/k8s_storage/
    # mkdir /data/k8s_storage/test
    # touch /data/k8s_storage/{a,b}
    # ls /data/k8s_storage/
    a  b  test
     
    手动同步Master节点的NFS共享目录数据到Slave节点的NFS共享目录下
    # rsync -avzp --delete /data/k8s_storage/ rsync@172.16.60.236::slave_web --password-file=/opt/rsyncd.passwd
     
    到Slave节点查看
    # ls /data/k8s_storage/
    a  b  test

      

    上面rsync同步命令说明:

    • /data/k8s_storage/ 是同步的NFS共享目录
    • rsync@172.16.60.236::slave_web
    • rsync 是Slave节点服务器的/etc/rsyncd.passwd文件中配置的用户名
    • 172.16.60.236为Slave节点服务ip
    • slave_web 为Slave服务器的rsyncd.conf中配置的同步模块名
    • --password-file=/opt/rsyncd.passwd 是Master节点同步到Slave节点使用的密码文件,文件中配置的是Slave节点服务器的/etc/rsyncd.passwd文件中配置的密码
     
    5)设置Rsync+Inotify自动同步
    这里需要注意:不能设置Master和Slave节点同时执行rsync自动同步,即不能同时设置双向同步。因为Master节点将数据同步到Slave节点,如果Slave节点再将数据同步回到Master节点,这个就矛盾了。所以需要确保只有一方在执行自动同步到另一方的操作。方式就是判断当前节点服务器是否存在VIP,如存在VIP则自动同步数据到另一台节点上。如不存在VIP则不执行自动同步操作。
     
    +++++++    Master节点服务器操作    +++++++
    编写自动同步脚本/opt/rsync_inotify.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    host=172.16.60.236
    src=/data/k8s_storage/
    des=slave_web
    password=/opt/rsyncd.passwd
    user=rsync
    inotifywait=/usr/bin/inotifywait
     
    $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src
    while read files ;do
     rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
     echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done

      

    编写VIP监控脚本/opt/vip_monitor.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/bin/bash
    VIP_NUM=`ip addr|grep 244|wc -l`
    RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l`
    if [ ${VIP_NUM} -ne 0 ];then
       echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
       if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
          echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1
       else
          echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1
          nohup sh /opt/rsync_inotify.sh &
      fi
    else
       echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1
       if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
          echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1
          ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
          ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
       else
          echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1
       fi
    fi

      

    编写持续执行脚本/opt/rsync_monit.sh
    1
    2
    3
    4
    5
    #!/bin/bash
    while "1" "1" ]
    do
      /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1
    done

      

    后台运行脚本
    1
    2
    3
    4
    5
    6
    # chmod 755 /opt/rsync_inotify.sh
    # chmod 755 /opt/vip_monitor.sh
    # chmod 755 /opt/rsync_monit.sh
     
    # nohup sh /opt/rsync_inotify.sh &
    # nohup sh /opt/rsync_monit.sh &

      

    设置rsync_monit.sh脚本的开机启动
    1
    2
    # chmod +x /etc/rc.d/rc.local
    # echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local

      

    +++++++    Slave节点服务器操作    +++++++    
    脚本名为/opt/rsync_inotify.sh,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    host=172.16.60.235
    src=/data/k8s_storage/
    des=master_web
    password=/opt/rsyncd.passwd
    user=rsync
    inotifywait=/usr/bin/inotifywait
     
    $inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src
    while read files ;do
     rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
     echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
    done

      

    编写VIP监控脚本/opt/vip_monitor.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/bin/bash
    VIP_NUM=`ip addr|grep 244|wc -l`
    RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l`
    if [ ${VIP_NUM} -ne 0 ];then
       echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
       if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
          echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1
       else
          echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1
          nohup sh /opt/rsync_inotify.sh &
      fi
    else
       echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1
       if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then
          echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1
          ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9
          ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9
       else
          echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1
       fi
    fi

      

    编写持续执行脚本/opt/rsync_monit.sh
    1
    2
    3
    4
    5
    #!/bin/bash
    while "1" "1" ]
    do
      /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1
    done

      

    后台运行脚本 (只执行rsync_monit.sh)
    1
    2
    3
    4
    5
    # chmod 755 /opt/rsync_inotify.sh
    # chmod 755 /opt/vip_monitor.sh
    # chmod 755 /opt/rsync_monit.sh
     
    # nohup sh /opt/rsync_monit.sh &

      

    设置rsync_monit.sh脚本的开机启动
    1
    2
    # chmod +x /etc/rc.d/rc.local
    # echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local

      

    6)最后验证下自动同步
    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
    1)比如当前VIP在Master节点,在Master节点创建测试数据,观察是否自动同步到Slave节点
    # ip addr|grep 172.16.60.244
        inet 172.16.60.244/32 scope global eth0
     
    # rm -rf /data/k8s_storage/*
    # echo "test" > /data/k8s_storage/haha
    # ls /data/k8s_storage/
    haha
     
    到Slave节点上查看,已自动同步过来
    # ls /data/k8s_storage/
    haha
    # cat /data/k8s_storage/haha
    test
     
    2)接着关闭Master节点的keeplived,将VIP飘移到Slave节点
    # systemctl stop keepalived
    # ip addr|grep 172.16.60.244
     
    到Slave节点上查看,发现VIP已经飘移过来了
    # ip addr|grep 172.16.60.244
        inet 172.16.60.244/32 scope global eth0
     
    在Slave节点创建测试数据,观察是否自动同步到Master节点
    # rm -rf /data/k8s_storage/*
    # mkdir /data/k8s_storage/cha
    # echo "heihei" > /data/k8s_storage/you
     
    到Master节点查看,发现数据已经同步过来了
    # ls /data/k8s_storage/
    cha heihei
     
    3)模拟Master节点和Slave节点关机,观察开机后:
    /opt/rsync_monit.sh脚本会实现开机自启动。
    按照上面Master和Slave节点的自动同步验证OK。
    热爱世间万物,无最爱,无例外、
  • 相关阅读:
    输入属性,输出属性
    angular响应式表单
    angular 响应式表单指令
    c++ Primer
    CString 操作函数
    字符串分割strtok_s
    LPSTR LPTSTR
    CString分割切分
    CStringArray
    十进制
  • 原文地址:https://www.cnblogs.com/guarderming/p/15201972.html
Copyright © 2020-2023  润新知