写点什么

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

  • 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:021658

评论

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

头脑风暴:二叉搜索树中的众数

HelloWorld杰少

算法 LeetCode 8月月更

每日一R「16」实践课之 kv-server(二)

Samson

学习笔记 8月月更 ​Rust

Python 教程之数据分析(1)—— 使用 Bokeh 进行数据可视化

海拥(haiyong.site)

Python Bokeh 8月月更

SMTP协议详解

工程师日月

8月月更

索信达控股上半年成绩出炉:核心业务收入大幅增长75.3%

索信达控股

阿里云实时计算 Flink 版 x Hologres: 构建企业级一站式实时数仓

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

开源一夏 |为什么线程池不允许使用Executors去创建?

六月的雨在InfoQ

开源 OOM Executors ThreadPoolExecutor 8月月更

开源一夏 | React对于生命周期的深入研究

恒山其若陋兮

开源 8月月更

如何进行企业数字化转型?数字化转型的3大核心规律

优秀

企业数字化转型

我是咖啡师,在软件公司上班|ONES 人物

万事ONES

实时数仓Workshop · 广州站 9.15 邀您参加!

Apache Flink

大数据 flink 流计算 实时计算 实时数仓

StarRocks 与奥威软件完成产品兼容认证,共同打造数据驱动的智慧企业

StarRocks

数据库

对话HR专家崔晓燕 沃丰科技AI+HRSSC如何提升企业人效

科技怪咖

新定位人工智能+营销服务 沃丰科技入选国家级专精特新“小巨人”

科技怪咖

系统故障工程师居然可以不背锅?看看几家大厂是怎么做到的!(内附复盘模板)

TakinTalks稳定性社区

SRE 故障 定责

客户案例|雅森帮携手观测云,保障海量在线用户服务体验

观测云

页面切换转场动画,英雄救场更有趣!

岛上码农

flutter ios 前端 移动端开发 8月月更

当满世界喧嚣“All in Web3”,但你可以慢慢来

One Block Community

区块链 程序员 开发者 就业 黑客马拉松

如何快速地学习东西(上篇)

宇宙之一粟

学习 成长 8月月更

iOS端如何实现MobLink的场景还原功能

MobTech袤博科技

ios sdk moblink

区块链合约安全系列(四):如何认识及预防公链合约中的算术溢出攻击

BSN研习社

区块链 智能合约

夯实中国智能制造软实力沃丰科技ServiceGo让物流机器人龙头企业售后无忧

科技怪咖

再谈回声消除测评丨Dev for Dev 专栏

声网

音频 Dev for Dev 实时互动

leetcode 205. Isomorphic Strings 同构字符串(简单)

okokabcd

LeetCode 算法与数据结构

制造业专家黄培博士:沃丰科技ServiceGo 智能售后服务成就高绩效企业

科技怪咖

中国掀起数字化浪潮|沃丰科技AI外呼机器人助家电企业潜客筛选自动化

科技怪咖

EMQX + PolarDB-X 一站式 IoT 数据解决方案

阿里云数据库开源

数据库 阿里云 开源 :MySQL 数据库 PolarDB-X

[JS入门到进阶] 哎,被vite小坑了一波,大家记得配置build.cssTarget为'chrome61'

HullQin

CSS JavaScript html 前端 8月月更

J-Tech Talk | 编写Dockerfile的最佳实践

Jina AI

Docker J-Tech Talk

明势资本黄明明:创新与世界,下一代基础软件的中国突围之路

TDengine

数据库 tdengine 时序数据库

TDengine 的存储引擎升级之路

TDengine

数据库 tdengine 时序数据库

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