写点什么

如何将主机文件自动同步至对象存储

  • 2019-10-16
  • 本文字数:3351 字

    阅读完需:约 11 分钟

如何将主机文件自动同步至对象存储

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


演示示意图:


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

“本文档用的是 CentOS 7,CentOS 6 挂载方式在本步骤结尾”



1. 创建 CentOS 7.4 云主机

首先我们需要打开京东云官网,点击右上角控制台登陆后开始创建一台京东云云主机,方法详见链接


云主机创建完成后如下:


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-s3fschmod 600 ~/.passwd-s3fs
复制代码



Access_Key_ID:Access_Key_Secret 获取方式:https://uc.jdcloud.com/account/accessKey

chmod 600:设置密钥文件只能被当前用户访问。

5. 创建对象存储空间

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


6. 挂载对象存储到本地目录/jdcloud

mkdir /jdclouds3fs bucketname /jdcloud -o passwd_file=~/.passwd-s3fs -o url="https://s3-internal.cn-north-1.
复制代码



mkdir:创建 jdcloud 文件夹作为本地挂载目录

s3fs:手动挂载命令,其中 bucketname 为 bucket 名称、/jdcloud 是本地挂载路径、passwd_file 为密码文件位置、url 为京东云对象存储 Bucket 页面的 Endpoint 地域节点(Endpoint 地址分为外网和内网地址,若使用京东云云主机与对象存储在同一个地域,请填写内网地址,其他情况请填写外网地址,不要忘记前面的https://

7. 查看挂载结果

df -Th
复制代码


8. CentOS 6 操作参考

yum install automake gcc-c++ git libcurl-devel libxml2-devel make openssl-develwget https://github.com/libfuse/libfuse/releases/download/fuse_2_9_4/fuse-2.9.2.tar.gztar -zxvf fuse-2.9.2.tar.gzcd fuse-2.9.2./configure --prefix=/usrmakemake installexport PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/ldconfig
复制代码



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

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


这个命令会在创建的文件夹里生成 5 个大小为 1GB 的小文件。


[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.servicesystemctl enable rsyncd.service#检查是否已经成功启动netstat -lnp|grep 873
复制代码



好了,好了。安装成功。


加入开机自动启动:


echo "/usr/bin/rsync --daemon" >> /etc/rc.local
复制代码

2.测试

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


rsync -vucrt /data/*** **/jdcloud/
复制代码


-v, --verbose 详细模式输出

-u, --update 仅仅进行更新,也就是跳过所有已经存在于 DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)

-c, --checksum 打开校验开关,强制对文件传输进行校验

-r, --recursive 对子目录以递归模式处理


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


-o, --owner 保持文件属主信息

-p, --perms 保持文件权限

-g, --group 保持文件属组信息

-t, --times 保持文件时间信息



同步结果



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



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


cp block_1.file block_6.file.newcp 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/bashsrc=/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})`变量,即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡)        fidone
复制代码


Inotifywait 参数说明:


-m,-monitor:始终保持事件监听状态

-r,-recursive:递归查询目录

-q,-quiet:只打印监控事件的信息

–format:指定时间输出格式

-e,-event:后面指定删、增、改等事件

-z,–compress 对备份的文件在传输时进行压缩处理


Inotifywait events 事件说明:


modify:修改文件或目录内容

create:在监视目录下创建文件或目录

close_write:修改真实文件内容

move:移动文件或目录移动到监视目录

2.测试

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


chmod +x inotify.shsh /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**
复制代码

2.设置定时增量

crontab -e* */2 * * * rsync -vucrt /data/*  /jdcloud
复制代码


2019-10-16 23:021503

评论

发布
暂无评论
发现更多内容

读《Software Engineering at Google》(23)

术子米德

架构师成长笔记

不造芯,不配做互联网巨头

IC男奋斗史

芯片行业思考

SAP 电商云的 Spartacus Storefront 部署到 CCV2 的前提条件

汪子熙

typescript 电商 SAP commerce 5月月更

DevOps系列之 —— DevOps概览(二)新型软件技术及交付模式

若尘

DevOps 5月月更

开源字节系统白皮书

源字节1号

软件开发

Git进阶系列 | 4. 合并冲突

俞凡

git 最佳实践

互联网跨界造芯的“菊与刀”

IC男奋斗史

芯片 芯片行业思考

Git进阶系列 | 5. Rebase vs Merge

俞凡

git 最佳实践

网站开发进阶(九)应用内存检测

No Silver Bullet

内存泄露 变量声明 5月月更

如何登录到你的 WordPress 管理仪表板

海拥(haiyong.site)

5月月更

【愚公系列】2022年05月 二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern)

愚公搬代码

5月月更

读《Software Engineering at Google》(24)

术子米德

架构师成长笔记

C语言总结_字符串全方位练习

DS小龙哥

5月月更

MyBatis 的动态 SQL超详细讲解

顾言

mybatis 动态SQL

《数据中心白皮书 2022》揭秘“东数西算”下数据中心高性能计算的六大趋势八大技术

GPU算力

用户体验思维 7 大陷阱

龙国富

产品设计 UI UX 用户体验 产品设计与思考

Go链表与切片比较

jinjin

List 链表 slice Go 语言 切片

maven构建docker镜像三部曲之三:推送到远程仓库(内网和阿里云)

程序员欣宸

Java Docker 5月月更

SecurityContextHolder之策略模式源码分析

急需上岸的小谢

5月月更

超级原始人系列盲盒即将上线,PlatoFarm赋能超多权益

西柚子

电阻电路的等效变换 (Ⅱ)

謓泽

5月月更

【愚公系列】2022 年 05 月 二十三种设计模式(三)-建造者模式(Builder Pattern)

愚公搬代码

5月月更

Git进阶系列 | 3. 基于Pull Request实现更好的协作

俞凡

git 最佳实践

[Day34]-[二叉树]有序链表转换二叉搜索树

方勇(gopher)

LeetCode 二叉树 数据结构和算法

读《Software Engineering at Google》(20)

术子米德

架构师成长笔记

读《Software Engineering at Google》(21)

术子米德

架构师成长笔记

读《Software Engineering at Google》(18)

术子米德

架构师成长笔记

网站开发进阶(五)网站发布之道

No Silver Bullet

Apache tomcat IIS 5月月更 网站发布

读《Software Engineering at Google》(22)

术子米德

架构师成长笔记

nginx配置系列(五)限制连接数

乌龟哥哥

5月月更

Git进阶系列 | 6. 交互式Rebase

俞凡

git 最佳实践

如何将主机文件自动同步至对象存储_服务革新_韩超超_InfoQ精选文章