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

阅读数:206 2019 年 10 月 16 日 23:02

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

今天我们来利用 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-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.

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

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-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 命令在在此文件夹里生成文件

这个命令会在创建的文件夹里生成 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.service
systemctl 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.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 参数说明:

-m,-monitor:始终保持事件监听状态
-r,-recursive:递归查询目录
-q,-quiet:只打印监控事件的信息
–format:指定时间输出格式
-e,-event:后面指定删、增、改等事件
-z,–compress 对备份的文件在传输时进行压缩处理

Inotifywait events 事件说明:

modify:修改文件或目录内容
create:在监视目录下创建文件或目录
close_write:修改真实文件内容
move:移动文件或目录移动到监视目录

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**

2. 设置定时增量

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

评论

发布