zoukankan      html  css  js  c++  java
  • 干货 | 如何将主机文件自动同步至对象存储


    注:最好利用京东云对象存储来存储一些静态文件,不建议用其直接存储数据库之类的数据文件,而且也会受到速度的影响,当然我们可以利用其存储备份文件。


    今天我们来利用s3fs工具将京东云对象存储挂载到京东云云主机,把对象存储Bucket(空间)当成一个文件夹挂载到Linux系统内部,当成一个系统文件夹来使用,之后我们会利用inotify+rsync工具来实现主机文件自动同步到对象存储的挂载目录,以此来实现主机文件自动同步至京东云对象存储。

    演示示意图:

    一、挂载对象存储到云主机

    1. 创建CentOS 7.4云主机

    首先我们需要打开京东云官网:http://www.jdcloud.com,点击右上角控制台登陆后开始创建一台京东云云主机,方法详见:https://docs.jdcloud.com/cn/virtual-machines/create-linux-instance

    云主机创建完成后如下:

    2. 安装依赖包
    yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel -y
    
    3. 安装s3fs
    yum install epel-release s3fs-fuse -y
    
    4. 创建密码文件
      echo Access_Key_ID:Access_Key_Secret > ~/.passwd-s3fs
        chmod 600 ~/.passwd-s3fs
    

    Access_Key_ID:Access_Key_Secret获取方式:https://uc.jdcloud.com/account/accessKey
    chmod 600:设置密钥文件只能被当前用户访问。
    
    5. 创建对象存储空间

    我本次的对象存储空间名称为:jdcloud-oss,位于和云主机一样的地域:华北-北京

    6. 挂载对象存储到本地目录/jdcloud
    mkdir /jdcloud
    s3fs bucketname /jdcloud -o passwd_file=~/.passwd-s3fs -o url="https://s3-internal.cn-north-1.jdcloud-oss.com"
    

    7. 查看挂载结果
    df -Th
    

    8. CentOS 6 操作参考
    yum install automake gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
    wget https://github.com/libfuse/libfuse/releases/download/fuse_2_9_4/fuse-2.9.2.tar.gz
    tar -zxvf fuse-2.9.2.tar.gz
    cd fuse-2.9.2
    ./configure --prefix=/usr
    make
    make install
    export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/
    ldconfig
    

    二、创建云主机本地模拟数据

    创建一个文件夹/data,模拟本地文件数据存放路径,通过dd命令在在此文件夹里生成文件

    [root@s3fs-test ~]# mkdir /data;cd /data
    [root@s3fs-test data]# for ((i=1;i<=5;i++));do dd if=/dev/zero of=block_$i.file bs=1M count=1024;done
    

    文件生成结果:

    三、安装rsync同步工具

    1. 安装及配置

    安装运行:

    yum -y install rsync
    #启动rsync服务
    systemctl start rsyncd.service
    systemctl enable rsyncd.service
    #检查是否已经成功启动
    netstat -lnp|grep 873
    

    好了,好了。安装成功。

    加入开机自动启动:

    echo "/usr/bin/rsync --daemon" >> /etc/rc.local
    
    2.测试

    好了,现在我们开始同步(将主机/data目录文件同步至京东云对象存储挂载目录/jdcloud):

    rsync -vucrt /data/* /jdcloud/
    

    注意:以下参数不要用,对象存储不支持,否则会报错

    同步结果

    到京东云对象存储查看结果

    现在我们在源目录/data中复制新的模拟数据,然后再次执行同步任务,看是否能够增量同步

    cp block_1.file block_6.file.new
    cp block_1.file block_7.file.new
    

    新的模拟数据建立完成后,我们再次执行同步任务

    rsync -vucrt /data/* /jdcloud/
    

    从上图中我们可以看到,由于第一次我们已经将block_1到block_5同步完成,所以本次任务只将新增的2个文件(block_6.file.new和block_7.file.new)进行了同步,我们现在登陆到京东云对象存储控制台看下同步结果

    四、安装Inotify文件监控工具

    同步完成,接下来我们需要将同步机制变的更智能化一点,因为实际生产活动中,我们不可能一直手动来执行同步任务,即便我们设置计划任务,只要两次计划任务之间有时间间隔,就很容易出现数据丢失的情况,接下来我们将操作如何在本地数据只要发生变化就触发rsync来同步数据。

    我们将用到的工具是Inotify,Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。

    1.安装及配置

    首先我们来检查系统是否支持Inotify

    ll /proc/sys/fs/inotify/
    

    开始安装Inotify-tools工具(如果yum安装不了,请安装EPEL源后重试)

    yum install inotify-tools -y
    

    监控脚本

    vim /root/inotify.sh
    
    #!/bin/bash
    src=/data/       # 需要同步的源路径
    cd ${src} 
    # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听./才能rsync同步后目录结构一致
    /usr/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,close_write,move ./ | while read file
    # 把监控到有发生更改的"文件路径列表"循环
    do
            INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
            INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
     echo "-------------------------------$(date)------------------------------------"
     echo $file
     #增加、修改、写入、移动事件放在同一个判断,因为他们都肯定是针对文件的操作
     if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
     then
     echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                    rsync -vucrt $(dirname ${INO_FILE})/* /jdcloud/ &
    # INO_FILE变量代表路径哦  -c校验文件内容
    # 上面的rsync同步命令中源是用了`$(dirname ${INO_FILE})`变量,即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)
     fi
    done
    

    Inotifywait参数说明:

    Inotifywait events事件说明:

    2.测试

    赋予脚本执行权限,并让脚本在后台运行

    chmod +x inotify.sh
    sh /root/inotify.sh &
    

    我们在源目录/data创建虚拟数据(文件)

    touch /data/{1..6}.txt
    

    在/jdcloud查看结果(同步会有延迟,若看不到效果,稍等下即可)

    我们在源目录/data创建虚拟数据(目录/文件夹)

    mkdir -p /data/dirtest/test/1.txt
    

    在/jdcloud查看结果(同步会有延迟,若看不到效果,稍等下即可)

    最后我们更改下1.txt中的内容,看是否只同步1.txt

    echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" >> 1.txt
    

    在/jdcloud查看结果(同步会有延迟,若看不到效果,稍等下即可)

    我们到京东云对象存储控制台查看同步结果

    至此,利用Inotify+Rsync自动同步主机文件到京东云对象存储实操完成。

    五、注意

    由于Inotify只在启动后会监控目录,在Inotify启动前和启动期间的文件发生更改,它是不知道的,所以容易出现漏文件的可能,为防止各种意外遗漏,保证目录一致,有两种方案:

    1.设置定时全量备份;

    crontab -e
    * */2 * * * rsync -vrlgoD /data/*  /jdcloud
    

    1.设置定时增量

    crontab -e
    * */2 * * * rsync -vucrt /data/*  /jdcloud
    


  • 相关阅读:
    记一个SharePoint Workflow一睡永不醒来的问题
    .NET Tracing简介
    !aspxpages(即!dumphttpcontext)命令输出的解释
    MOSS定时爬网无法启动的问题
    Persistent cookies和Session cookies的定义与区别
    跨SharePoint服务器场的Content Deployment的一个知识点
    如何明确指定命令所在的debugger extension?
    理解SharePoint中的备用访问映射(Alternate Access Mapping)
    biztalk中ACK、NACK详测示例【转】
    深入biztalk消息以及消息订阅发布路由机制(一)-消息概述【转】
  • 原文地址:https://www.cnblogs.com/jdclouddeveloper/p/11677777.html
Copyright © 2011-2022 走看看