使用ftp+inotify+rsync实现静态资源的同步共享

使用ftp+inotify+rsync实现静态资源的同步共享

一、业务需求

目前提供web静态资源(图片,js,css等)服务,是nignx(docker)实现的,避免出现单点的情况,所以需要配置两台同样的服务,同事还提高了访问能力,提高了集群的稳定性可用性。静态资源由开发人员通过ftp上传,实现同步的方式由inotify+rsync实现,内网同步延迟较低,对用户来说无感知。

2、服务部署

2.1系统环境

除主机名外,两台机器完全相同

  1. [root@docker1 src]# cat /etc/redhat-release
  2. CentOS Linux release 7.2.1511 (Core)
  3. [root@docker-1 src]# uname -a
  4. Linux docker-1 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

2.2ftpd服务部署

对于ftp,inotify,rsync这样的服务就不介绍其功能和应用了,简而言之:ftp用来上传文件,inotify和rsync配合起来做资源的实时同步,话不多说,开始部署。

  • yum安装ftp服务
  1. [root@docker1 src]#yum install vsftpd
  • 修改配置文件生效
  1. [root@docker-1 ~]# egrep -v "#|^$" /etc/vsftpd/vsftpd.conf
  2. anonymous_enable=NO #关闭匿名登录上传权限,安全管控的必要,默认是允许的,建议一定关闭此项
  3. local_enable=YES #是否允许本地用户登录FTP服务器,默认是允许
  4. write_enable=YES#是否允许用户具有在FTP服务器文件中执行写的权限,默认是允许
  5. local_umask=022#设置本地用户的文件生成掩码为022,默认是077
  6. dirmessage_enable=YES#激活目录信息,当远程用户更改目录时,将出现提示信息
  7. xferlog_enable=YES#启用上传和下载日志功能
  8. connect_from_port_20=YES#启用FTP数据端口的连接请求
  9. xferlog_std_format=YES#是否使用标准的ftpd xferlog日志文件格式
  10. chroot_local_user=YES#如果希望用户登录后不能切换到自己目录以外的其它目录,需要设置该项,如果设置chroot_list_enable=YES,那么只允许/etc/vsftpd.chroot_list中列出的用户具有该功能.如果希望所有的本地用户都执行者chroot,可以增加一行:**chroot_local_user=YES**
  11. allow_writeable_chroot=YES#ftp新版本的原因,新增加的参数,否则chroot下没有写入的权限,这个问题困扰了很久,原来是版本问题导致
  12. listen=NO#使vsftpd 处于非独立启动模式,默认为NO
  13. userlist_enable=YES#用户列表中的用户是否允许登录FTP服务器,默认是不允许
  14. pam_service_name=vsftpd#设置PAM认证服务的配置文件名称,该文件存放在/etc/pam.d/目录下.
  15. tcp_wrappers=YES#使用tcp_wrqppers作为主机访问控制方式
  • 增加ftp用户,修改其工作目录权限
  1. [root@docker1 src]mkdir /usr/src/testdir -p
  2. [root@docker1 src]useradd -g root -M -d /usr/src/testdir -s /sbin/nologin ftpuser
  3. [root@docker1 src]chown ftpuser.root /usr/src/testdir

启动ftpd服务

  1. [root@docker-1 ~]# systemctl start vsftpd

2.3inotify部署

从文件管理器到安全工具,文件系统监控对于的许多程序来说都是必不可少的。从 Linux 2.6.13 内核开始,Linux 就推出了 inotify,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。在后期的内核中有了很多增强,因此在依赖这些特性之前,请先检查您的内核版本。

  • 用于 inotify 的 API
    Inotify 提供一个简单的 API,使用最小的文件描述符,并且允许细粒度监控。与 inotify 的通信是通过系统调用实现。可用的函数如下所示:
    inotify_init
    是用于创建一个 inotify 实例的系统调用,并返回一个指向该实例的文件描述符。
    inotify_init1
    与 inotify_init 相似,并带有附加标志。如果这些附加标志没有指定,将采用与 inotify_init 相同的值。
    inotify_add_watch
    增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中,是否只有路径代表一个目录才进行监控,是否要追踪符号链接,是否进行一次性监控,当首次事件出现后就停止监控。
    inotify_rm_watch
    从监控列表中移出监控项目。
    read
    读取包含一个或者多个事件信息的缓存。
    close
    关闭文件描述符,并且移除所有在该描述符上的所有监控。当关于某实例的所有文件描述符都关闭时,资源和下层对象都将释放,以供内核再次使用。因此,典型的监控程序需要进行如下操作:
    1)使用 inotify_init 打开一个文件描述符
    2)添加一个或者多个监控
    3)等待事件
    4)处理事件,然后返回并等待更多事件
    5)当监控不再活动时,或者接到某个信号之后,关闭文件描述符,清空,然后退出。
  • 开始部署inotify
  1. [root@docker-1 ~]#cd /usr/local/src
  2. [root@docker-1 ~]#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
  3. [root@docker-1 ~]#tar xf inotify-tools-3.14.tar.gz
  4. [root@docker-1 ~]#cd inotify-tools-3.14
  5. [root@docker-1 ~]#./configure --prefix=/usr/local/inotify-tools-3.14
  6. [root@docker-1 ~]#make&&make install
  7. [root@docker-1 ~]#ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify-tools
  • 进入编译好的目录
  1. [root@docker-1 ~]# cd /usr/local/inotify-tools
  2. 2 [root@docker-1 ~]# ll
  3. 3 total 16
  4. 4 drwxr-xr-x. 2 root root 4096 Jan 31 01:55 bin ##inotify执行命令(二进制)
  5. 5 drwxr-xr-x. 3 root root 4096 Jan 31 01:55 include ##inotify程序所需用的头文件
  6. 6 drwxr-xr-x. 2 root root 4096 Jan 31 01:55 lib ##动态链接的库文件
  7. 7 drwxr-xr-x. 4 root root 4096 Jan 31 01:55 share ##帮助文档
  • 工具集合介绍:
    一共安装了2个工具(命令),即inotifywait和inotifywatch
    inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用
    inotifywatch:收集被监视的文件系统使用度统计数据,指定文件系统事件发生的次数统计。

2.4rsync部署

安装rsync

  1. [root@docker-1 ~]#yum -y install rsync

服务端修改配置文件生效

  1. [root@docker-1 ~]# cat /etc/rsyncd.conf
  2. uid = root
  3. gid = root
  4. use chroot = no
  5. list = no
  6. log file = /var/log/rsyncd.log
  7. pid file = /var/run/rsyncd.pid
  8. lock file = /var/run/rsyncd.lock
  9. [web_com]
  10. path = /usr/src/testdir #对应上inotify的路径
  11. hosts allow = 10.0.0.3
  12. read only = no

客户端修改配置文件生效

  1. [root@docker-2 ~]# cat /etc/rsyncd.conf
  2. uid = root
  3. gid = root
  4. use chroot = no
  5. list = no
  6. log file = /var/log/rsyncd.log
  7. pid file = /var/run/rsyncd.pid
  8. lock file = /var/run/rsyncd.lock
  9. [web_com]
  10. path = /usr/src/testdir
  11. hosts allow = 10.0.0.4
  12. read only = no

启动两台rsync服务

  1. [root@docker-1 ~]# systemctl start rsyncd

2.5编写shell脚本实现同步

监控文件变化,包括对文件的创建,写入,删除,move操作,只要发现操作即同步,实现了两台服务之间的实时同步

  1. [root@docker-12156 ~]# cat /usr/local/inotify/bin/sync_to10.0.0.4.sh
  2. #!/bin/bash
  3. inotify=/usr/local/inotify/bin/inotifywait
  4. $inotify -mrq --format '%w%f' -e create,close_write,delete,move /usr/src/testdir \
  5. |while read file
  6. do
  7. cd / &&
  8. rsync -az --delete -H ./usr/src/testdir/ 10.4.12.157::web_com
  9. done

三、执行同步脚本,开机自启动

  1. sh /usr/local/inotify/bin/sync_to10.0.0.4.sh &
  2. echo "sh /usr/local/inotify/bin/sync_to10.0.0.4.sh &" >>/etc/rc.local

四、使用建议

对于此类共享服务,建议使用共享存储服务,fastdfs,moosefs,glusterfs等,再根据具体应用需求选取重要值衡量,gluterfs请移步:glusterfs,后续会有对fastdfs使用的文章详解。

3
未经许可,不得转载,否则将受到作者追究,博主联系方式见首页右上角

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论
取消评论
代码 贴图 加粗 链接 删除线 签到

(3)条精彩评论:
  1. 匿名
    :eek:
    匿名2016-11-04 17:12 回复
  2. 匿名
    export LD_LIBRARY_PATH=/usr/local/inotify-tools/lib:$LD_LIBRARY_PATH 主上命令行中运行这行,否则启动inotify时会出错
    匿名2016-12-15 16:35 回复
    • admin
      是的是的,忘记写了
      admin2017-02-16 09:52 回复