1. nfs存储的单点问题

如果nfs服务器宕机了,则所有的nfs客户机都会受到影响。一旦宕机,会丢失部分用户的数据。为了解决单点问题,需要实现共享存储的实时备份,即:将nfs服务端共享目录下的数据实时备份到备份服务器(或其它存储设备),以保证数据的完整性。

2. NFS共享数据的实时同步推送备份

公司有两台web服务器一直在对外提供服务,但随着业务的发展用户越来越多,网站的功能也越来越强大,各种图片,视频等占用硬盘空间越来越大。

于是,领导将web服务器的数据直接存储到NFS服务器上作为存储使用;并且为了防止NFS服务器发生单点故障,领导希望将web服务器存储的内容实时同步到Rsync备份服务器上。现在由你来计划完成领导的需求。

具体要求如下:

  • NFS服务器的要求如下:

    • 服务器的共享目录名为/data目录;
    • 权限要求只能内网网段访问且可读可写,时时同步;
    • 为了方便管理人员管理,需要指定NFS虚拟账户为zuma,uid=888,gid=888
    • 所有访问者的身份都压缩为最低身份
    • 将/data目录里的内容同步时时推送到备份服务器的/data目录里(inotify+rsync)
  • web服务器将NFS共享目录统一挂载到/var/html/www目录下

思路:

1. NFS存储服务器和Rsync备份服务器,Rsync服务器部署运行rsync --daemon服务,NFS服务器作为Rsync的客户端,可以通过rsync -avz /data rsync_backup@192.168.0.41::nfsbackup/ --password-file=/etc/rsync.password命令,将/data目录的文件备份到Rsync备份服务器。

2. NFS存储服务器部署完成,正常运行情况下。

3. NFS存储服务器和Rsync备份服务器之间,通过crond+rsync服务,通过定时任务的备份服务,将数据备份到Rsync备份服务器

4. 想要实现实时备份,则在NFS存储服务器上通过inotify,sersync或irsync服务,监控NFS存储服务器共享目录的磁盘的block的变化,触发推动执行同步。

2.1 环境准备

操作系统和内核版本

  1. [root@web01-8 ~]# cat /etc/redhat-release
  2. CentOS release 6.7 (Final)
  3. [root@web01-8 ~]# uname -r
  4. 2.6.32-573.el6.x86_64

角色-ip

角色 主机名 eth0(外网) eth1(内网)
C1-NFS服务器 nfs01 10.0.0.31 192.168.0.31
C2-Rsync存储服务器 backup 10.0.0.41 192.168.0.41

2.2 NFS服务的部署

部署过程详情见:https://www.cnblogs.com/zoe233/p/11973710.html

【NFS服务端】

  1. # 系统环境
  2. [root@nfs-31 mnt]# cat /etc/redhat-release
  3. CentOS release 6.10 (Final)
  4. [root@nfs-31 mnt]# uname -r
  5. 2.6.32-573.el6.x86_64
  6. [root@nfs-31 mnt]# uname -m
  7. x86_64
  8.  
  9. # 查看rpcbind和nfs服务,并设置开机自启动
  10. [root@nfs-31 mnt]# rpm -qa nfs-utils rpcbind
  11. rpcbind-0.2.0-16.el6.x86_64
  12. nfs-utils-1.2.3-78.el6_10.1.x86_64
  13.  
  14. [root@nfs-31 mnt]# /etc/init.d/rpcbind status
  15. rpcbind 已停
  16. [root@nfs-31 mnt]# /etc/init.d/rpcbind start
  17. 正在启动 rpcbind [确定]
  18.  
  19. [root@nfs-31 mnt]# /etc/init.d/nfs status
  20. rpc.svcgssd 已停
  21. rpc.mountd 已停
  22. nfsd 已停
  23. rpc.rquotad 已停
  24. [root@nfs-31 mnt]# /etc/init.d/nfs start
  25. 启动 NFS 服务: [确定]
  26. 关掉 NFS 配额: [确定]
  27. 启动 NFS mountd [确定]
  28. 启动 NFS 守护进程: [确定]
  29. 正在启动 RPC idmapd [确定]
  30.  
  31. [root@nfs-31 mnt]# chkconfig --list rpcbind
  32. rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
  33. [root@nfs-31 mnt]# chkconfig --list nfs
  34. nfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
  35.  
  36. [root@nfs-31 mnt]# tail -3 /etc/rc.local # chkconfig和/etc/rc.local的配置二选一即可。
  37. # start up nfs service
  38. /etc/init.d/rpcbind start
  39. /etc/init.d/nfs start
  40.  
  41. # 创建需要共享的目录并授权
  42. mkdir /data -p
  43. grep nfsnobody /etc/passwd
  44. chown -R nfsnobody.nfsnobody /data
  45. ls -ld /data
  46.  
  47. # 配置NFS服务配置文件,并且在本地查看挂载信息
  48. [root@nfs-31 mnt]# cat /etc/exports
  49. # shared /data by zoe for test at 20191205
  50. /data 192.168.0.0/24(rw,sync)
  51.  
  52. [root@nfs-31 mnt]# exportfs -rv # 加载配置,可以用来检查配置文件是否合法
  53. exporting 192.168.0.0/24:/data
  54.  
  55. # 在NFS服务器本地查看挂载情况
  56. showmount -e 192.168.0.31
  57. showmount -e localhost
  58.  
  59. # 通过查看nfs服务器配置文件的参数(包括默认加载的参数)
  60. [root@nfs-31 mnt]# cat /var/lib/nfs/etab
  61. /data 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

在本地服务器端,同时又作为客户端进行挂载测试:

  1. [root@nfs-31 mnt]# mount -t nfs 192.168.0.31:/data /mnt
  2. [root@nfs-31 mnt]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/sda3 6.9G 1.9G 4.7G 28% /
  5. tmpfs 499M 0 499M 0% /dev/shm
  6. /dev/sda1 190M 67M 114M 37% /boot
  7. 192.168.0.31:/data 6.9G 1.9G 4.7G 28% /mnt

成功将nfs的共享目录挂载在/mnt目录下。

【NFS客户端】

在所有的NFS客户端上执行的操作都是相同的。

  1. # 系统环境
  2. [root@backup-41 ~]# cat /etc/redhat-release
  3. CentOS release 6.10 (Final)
  4. [root@backup-41 ~]# uname -r
  5. 2.6.32-573.el6.x86_64
  6. [root@backup-41 ~]# uname -m
  7. x86_64
  8.  
  9. # 检查安装包
  10. [root@backup-41 ~]# rpm -qa rpcbind
  11. rpcbind-0.2.0-16.el6.x86_64
  12. # 为了使用showmount等功能,所有客户端最好也安装NFS软件,但不启动NFS服务
  13. rpm -qa nfs-utils
  14.  
  15. # 启动rpc服务(不需要启动NFS服务)
  16. [root@backup-41 ~]# /etc/init.d/rpcbind status
  17. rpcbind is stopped
  18. [root@backup-41 ~]# /etc/init.d/rpcbind start
  19. Starting rpcbind: [ OK ]
  20.  
  21. [root@backup-41 ~]# showmount -e 192.168.0.31
  22. Export list for 192.168.0.31:
  23. /data 192.168.0.0/24
  24.  
  25. # 挂载NFS共享目录/data
  26. [root@backup-41 ~]# mount -t nfs 192.168.0.31:/data /mnt
  27. [root@backup-41 ~]# df -h
  28. Filesystem Size Used Avail Use% Mounted on
  29. /dev/sda3 6.9G 1.9G 4.7G 28% /
  30. tmpfs 499M 0 499M 0% /dev/shm
  31. /dev/sda1 190M 67M 114M 37% /boot
  32. 192.168.0.31:/data 6.9G 1.9G 4.7G 28% /mnt
  33.  
  34. # 测试
  35. [root@backup-41 mnt]# cd /mnt
  36. [root@backup-41 mnt]# ls
  37. [root@backup-41 mnt]# mkdir /mnt/backup/rpcbind/test -p
  38. [root@backup-41 mnt]# ls
  39. backup file
  40.  
  41. # 在nfs服务端查看共享目录/data
  42. [root@nfs-31 mnt]# ls /data
  43. backup file

将rpcbind服务和挂载加入开机自启动:

  1. [root@backup-41 mnt]# tail -3 /etc/rc.local
  2. # rpcbind start and mount shared directory ip:/data
  3. /etc/init.d/rpcbind start
  4. /bin/mount -t nfs 192.168.0.31:/data /mnt

2.3 Rsync服务的部署

部署过程详情参见:https://www.cnblogs.com/zoe233/p/11962110.html

本节可以将nfs的备份数据统一放在某个模块下,所以可以通过修改配置文件/etc/rsyncd.conf添加模块

  1. [root@backup-41 192.168.0.8]# tail -20 /etc/rsyncd.conf
  2.  
  3. ignore errors
  4. read only = false
  5. list = false
  6. hosts allow = 192.168.0.31/24
  7. hosts deny = 0.0.0.0/32
  8. auth users = rsync_backup
  9. secrets file = /etc/rsync.password
  10.  
  11. ######
  12. [backup]
  13. path = /backup/
  14.  
  15. [multi_module_1]
  16. path = /multi_module_1/
  17.  
  18. [nfsbackup]
  19. path = /nfsbackup/
  20.  
  21. ## rsync_config____end ##

在配置文件里添加模块[nfsbackup]。

注意:多个模块的信息相同的,可以统一放在模块上方,如ignore errors等参数。

重启rsync --daemon服务。

  1. [root@backup-41 192.168.0.8]# pkill rsync
  2. [root@backup-41 192.168.0.8]# lsof -i tcp:873
  3. [root@backup-41 192.168.0.8]# rsync --daemon
  4. [root@backup-41 192.168.0.8]# lsof -i tcp:873
  5. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  6. rsync 16317 root 3u IPv4 211440 0t0 TCP *:rsync (LISTEN)
  7. rsync 16317 root 5u IPv6 211441 0t0 TCP *:rsync (LISTEN)

根据新模块nfsbackup的配置要求,创建/nfsbackup目录,以及设置目录的属主和属组。

  1. [root@backup-41 192.168.0.8]# mkdir /nfsbackup -p
  2. [root@backup-41 192.168.0.8]# chown -R rsync.rsync /nfsbackup
  3. [root@backup-41 192.168.0.8]# ll -d /nfsbackup/
  4. drwxr-xr-x 2 rsync rsync 4096 Dec 12 13:00 /nfsbackup/

2.4 inotify

inotify的具体内容查看:https://www.cnblogs.com/zoe233/p/12035383.html

2.4.1 inotify安装

查看当前系统是否支持inotify

  1. [root@nfs-31 data]# uname -r
  2. 2.6.32-573.el6.x86_64
  3. [root@nfs-31 data]# ls -l /proc/sys/fs/inotify/
  4. total 0
  5. -rw-r--r-- 1 root root 0 Dec 12 18:59 max_queued_events
  6. -rw-r--r-- 1 root root 0 Dec 12 18:59 max_user_instances
  7. -rw-r--r-- 1 root root 0 Dec 12 18:59 max_user_watches # 显示这三个文件则证明支持inotify

安装inotify软件:

  1. [root@nfs-31 inotify]# rpm -qa inotify-tools
  2. [root@nfs-31 inotify]# yum install inotify-tools -y # Error: Nothing to do

安装失败,用wget获取源,再用yum安装:

  1. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
  2. yum -y install inotify-tools

 [root@nfs-31 inotify]# rpm -qa inotify-tools
  inotify-tools-3.14-2.el6.x86_64

一共安装了2个工具,即inotifywait和inotifywatch。

    • inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。
    • inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。

2.4.2 inotifywatch命令

比较重要的参数的含义:

inotifywait参数 含义说明
-r --recursive 递归查询目录
-q --quiet 打印很少的信息,仅仅打印监控事件的信息
-m,--monitor 始终保持事件监听状态
--exclude 排除文件或目录时,不区分大小写。
--timefmt 指定时间输出的格式
--format 打印使用指定的输出类似格式字符串
-e,--event 通过此参数可以指定需要监控的事件,如下一个列表所示

-e,--event 事件的各种事件含义:

Events 含义
access 文件或目录被读取
modify 文件或目录内容被修改
attrib 文件或目录属性被改变
close 文件或目录封闭,无论读/写模式
open 文件或目录被打开
moved_to 文件或目录被移动至另外一个目录
move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create 文件或目录被创建在当前目录
delete 文件或目录被删除
umount 文件系统被卸载

--format 的格式意义:

  • %w 发生事件的监视文件的名称 

    • This will be replaced with the name of the Watched file on which an event occurred.
  • %f  当一个事件发生在一个目录中时,它将被替换为导致该事件发生的文件名。否则,将替换为空字符串。
    • When an event occurs within a directory, this will be replaced with the name of the File which caused the event to occur. Otherwise, this will be replaced with an empty string.
  • %e  发生的事件,以逗号分隔。
    • Replaced with the Event(s) which occurred, comma-separated.
  • %Xe 发生的事件,用“X”中的任何字符分隔。
    • Replaced with the Event(s) which occurred, separated by whichever character is in the place of ‘X’.
  • %T   替换为--timefmt选项指定格式的当前时间,该格式字符串应适合传递给strftime(3)。
    • Replaced with the current Time in the format specified by the --timefmt option, which should be a format string suitable for passing to strftime(3).

2.4.3 人工测试同步

开启两个窗口

测试create事件

在第一个窗口开启inotifywait,监听/backup目录:

  1. [root@nfs-31 inotify]# inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w%f' -e create /backup
    # 命令说明:
    # -mrq:-m 实时监听,-r递归监控整个目录,包括子目录,-q 只输出简短信息
    # --timefmt:指定输出的时间格式
    # --format:输出输出的格式
    # -e create:指定监控的事件类型,监控创建create事件

第二个窗口,进入/backup目录,创建两个文件,触发create事件

  1. [root@nfs-31 backup]# cd /backup
  2. [root@nfs-31 backup]# touch inotifywait_create_event_1
  3. [root@nfs-31 backup]# touch inotifywait_create_event_2

触发事件后,查看第一个窗口会发现,屏幕输出了创建事件的内容(时间和创建的文件路径加名称)

  1. [root@nfs-31 inotify]# inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w%f' -e create /backup
  2. 19/12/12 19:26 /backup/inotifywait_create_event_1
  3. 19/12/12 19:41 /backup/inotifywait_create_event_2

2.4.4 编写inotify实时监控脚本

  1. [root@nfs-31 /]# cd /server/scripts
  2. [root@nfs-31 scripts]# ls
  3. backup.sh
  4. [root@nfs-31 scripts]# vi inotifywait_nfs_to_backup.sh
  5. [root@nfs-31 scripts]# cat inotifywait_nfs_to_backup.sh
  6. #!/bin/bash
  7.  
  8. Path=/data
  9. backup_Server=192.168.0.41
  10.  
  11. /usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete $Path|while read line
  12. do
  13. if [ -f $line ];then
  14. rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
  15. else
  16. cd $Path &&\
  17. rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password
  18. fi
  19. done

脚本可以加入开机启动:

  1. echo "/bin/sh /server/scripts/inotifywait_nfs_to_backup.sh &" >> /etc/rc.local

提示:

  • 一个& 代表从后台开始运行该条命令

【集群实战】共享存储实时备份(解决nfs共享存储的单点问题)的更多相关文章

  1. Openmpi 编译安装+集群配置 + Ubuntu14.04 + SSH无密码连接 + NFS共享文件系统

    来源 http://www.open-mpi.org/ 网络连接 SSH连接,保证各台机器之间可以无密码登陆,此处不展开 hosts文件如下 #/etc/hosts 192.168.0.190 mas ...

  2. 【集群实战】NFS网络文件共享服务

    1. NFS介绍 1.1 什么是NFS? NFS是Network File System的缩写,中文意思是网络文件系统. 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. ...

  3. MySQL/MariaDB数据库的Galera高可用性集群实战

      MySQL/MariaDB数据库的Galera高可用性集群实战 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Galera Cluster概述 1>.什么是Gale ...

  4. 基于Ambari Server部署HDP集群实战案例

    基于Ambari Server部署HDP集群实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署Ambari Server端 博主推荐阅读: https://www.c ...

  5. redis3.0 集群实战1 -- 安装和配置

    本文主要是在centos7上安装和配置redis集群实战 参考: http://hot66hot.iteye.com/blog/2050676 集群教程: http://redisdoc.com/to ...

  6. 《跟老男孩学Linux运维:Web集群实战》读书笔记

    Linux 介绍 Linux 安装 Linux 调优 Web 基础 Nginx 应用 LNMP 应用 PHP 缓存加速 Nginx 调优 MySQL 应用 NFS 网络文件共享 Nginx 反向代理与 ...

  7. Haproxy+keepalived高可用集群实战

    1.1  Haproxy+keepalived高可用集群实战 随着互联网火热的发展,开源负载均衡器的大量的应用,企业主流软件负载均衡如LVS.Haproxy.Nginx等,各方面性能不亚于硬件负载均衡 ...

  8. 【集群实战】NFS服务常见故障排查和解决方法

    NFS,全名叫Network File System,中文叫网络文件系统,是Linux.UNIX系统的分布式文件系统的一个组成部分,可实现在不同网络上共享远程文件系统. NFS由Sun公司开发,目前已 ...

  9. 【集群实战】Rsync数据同步工具

    1. Rsync介绍 1.1 什么是Rsync? Rsync是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows ...

随机推荐

  1. 从 Socket 编程谈谈 IO 模型(三)

    快过年啦,估计很多朋友已在摸鱼的路上.而我为了兄弟们年后的追逐,却在苦苦寻觅.规划,导致文章更新晚了些,各位猿粉谅解. 上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让 BIO.NIO 编程过程 ...

  2. 使用IDEA编写JDBC

    省去下载MySQL的过程,创建数据库demo 首先在下载的Java服务中将此jar包复制到项目中的一个空文件夹中 在当前工程下新建目录lib(名字可自定) 找到MySQL的Java服务的jar包 打开 ...

  3. vue中的js引入图片,使用require相关问题

    vue中的js引入图片,必须require进来 或者引用网络地址 <template> <div class="home"> <img alt=&qu ...

  4. JAVA中基础类型和字串类型之间的相互转换

    转自:https://www.imooc.com/code/2251 仅做个人学习记录之用,侵删. 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法 ...

  5. 原生js实现扇形导航以及动画的坑

    第一次发博客,有点紧张.首先来一张效果图. 主要是实现了点击右下角的风扇按钮实现了: 导航栏的开启与关闭,中间伴随着 transition过渡以及transform的2D动画. 上源码: <!D ...

  6. 【three.js第七课】鼠标点击事件和键盘按键事件的使用

    当我们使用鼠标操作three.js渲染出的对象时,不仅仅只是仅限用鼠标对场景的放大.缩小.旋转而已,还有鼠标左键.右键的点击以及键盘各种按键等等的事件.我们需要捕获这些事件,并在这些事件的方法里进行相 ...

  7. Python 变量详解[学习 Python 必备基础知识][看此一篇就够了]

    您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 目录 ...

  8. 掉了10根头发都无法解决的数学题,python帮你完美解答

    本来这个周末过得开开心心,结果为了解一道数学题薅掉了一把头发...整整10根! 而且还是一道小学数学题!!! 到底是什么题呢?大家看看吧 这不就是一道逻辑题嘛! 先假如丁错,则甲乙丙对,此时最小的ab ...

  9. G - GCD and LCM 杭电

    Given two positive integers G and L, could you tell me how many solutions of (x, y, z) there are, sa ...

  10. 【原创干货】大数据Hadoop/Spark开发环境搭建

    已经自学了好几个月的大数据了,第一个月里自己通过看书.看视频.网上查资料也把hadoop(1.x.2.x).spark单机.伪分布式.集群都部署了一遍,但经历短暂的兴奋后,还是觉得不得门而入. 只有深 ...