0%

NFS双机热备高可用环境 - 运维笔记 - 散尽浮华 - 博客园

Excerpt

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


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

关闭防火墙

not running

关闭selinux

SELINUX=disabled

Disabled

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

2)创建nfs共享目录

3)编辑export文件,运行k8s的node节点挂载nfs共享目录

这里可以使用node节点的ip网段进行挂载配置

也可以直接使用node节点的具体ip(一个ip配置一行)进行挂载配置

/data/k8s_storage 172.16.60.0/24(rw,sync,no_root_squash)

4)配置生效

5)查看生效

6)启动rpcbind、nfs服务

7)查看 RPC 服务的注册状况

8)showmount测试

Master节点测试

Export list for 172.16.60.235:

/data/k8s_storage 172.16.60.0/24

Slave节点测试

Export list for 172.16.60.236:

/data/k8s_storage 172.16.60.0/24

或者到ks的任意一个node节点上手动尝试挂载NFS,看是否挂载成功:

[root@k8s-node01 ~]

[root@k8s-node01 ~]

[root@k8s-node01 ~]

[root@k8s-node01 ~]

[root@k8s-node01 ~]

[root@k8s-node01 ~]

二、安装部署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

2)Master节点的keepalived.conf配置

这里特别需要注意:

一定要设置keepalived为非抢占模式,如果设置成抢占模式会在不断的切换主备时容易造成NFS数据丢失。

! 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 100   

    advert_int 1

    nopreempt      

    authentication {

        auth_type PASS

        auth_pass 1111

    }  

    track_script {

        chk_nfs

    }

    virtual_ipaddress {

        172.16.60.244     

    }

}

3)Slave节点的keepalived.conf配置

只需将priority参数项修改为80,其他配置的和master节点一样,脚本也一样。

! 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监控脚本

#!/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

设置脚本执行权限

5)启动keepalived服务

查看服务进程是否启动

6)检查vip是否存在

在两台节点机器上执行"ip addr"命令查看vip,其中会在一台机器上产生vip地址。

    inet 172.16.60.244/32 scope global eth0

测试vip地址要能被ping通 

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

2)Master节点机器配置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

[master_web]

path = /data/k8s_storage

comment = master_web

ignore errors

read only = no  

list = no

auth users = rsync 

secrets file = /etc/rsyncd.passwd 

编辑密码和用户文件(格式为"用户名:密码"

rsync:123456

编辑同步密码(注意这个文件和上面的密码和用户文件路径不一样)

该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是rsync:123456,则主服务器则写123456一个就可以了

123456

设置文件执行权限

启动服务

检查rsync服务进程是否启动

3)Slave节点机器配置rsyncd.conf

就把master主机/etc/rsyncd.conf配置文件里的[master_web]改成[slave_web]

其他都一样,密码文件也设为一样

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

编辑密码和用户文件(格式为"用户名:密码"

rsync:123456

编辑同步密码

123456

设置文件执行权限

启动服务

检查rsync服务进程是否启动

4)手动验证下Master节点NFS数据同步到Slave节点

1

2

3

4

5

6

7

8

9

10

11

12

13

在Master节点的NFS共享目录下创建测试数据

a  b  test

手动同步Master节点的NFS共享目录数据到Slave节点的NFS共享目录下

到Slave节点查看

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

后台运行脚本

设置rsync_monit.sh脚本的开机启动

+++++++    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)

设置rsync_monit.sh脚本的开机启动

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节点

    inet 172.16.60.244/32 scope global eth0

haha

到Slave节点上查看,已自动同步过来

haha

test

2)接着关闭Master节点的keeplived,将VIP飘移到Slave节点

到Slave节点上查看,发现VIP已经飘移过来了

    inet 172.16.60.244/32 scope global eth0

在Slave节点创建测试数据,观察是否自动同步到Master节点

到Master节点查看,发现数据已经同步过来了

cha heihei

3)模拟Master节点和Slave节点关机,观察开机后:

/opt/rsync_monit.sh脚本会实现开机自启动。

按照上面Master和Slave节点的自动同步验证OK。