大量数据迁移到对象存储服务过程中使用联合文件系统的迁移方案

记一次迁移3T静态数据到存储服务的实践过程,跟大家分享一下。
刚毕业,水平有限,重在记录和分享。^ _ ^

1.任务概述

  • 几个T的静态数据迁移,主要是小图,从本地文件系统迁移到新对象存储服务中。
  • 迁移过程时间跨度大,可能要几天甚至一周才能完成,在这过程中要保证业务正常,即图片正常访问。
  • 不对业务层作修改,尝试通过更下层对文件系统封装一套方案,保证迁移过程中文件的正常访问。

如果你的遇到的场景与上述特征相近,那么可以试着读完全文。

附录:
问题记录1-linux内核升级:https://blog.csdn.net/qq_37788558/article/details/84373650
问题记录2-qingcloud对s3兼容的url:https://blog.csdn.net/qq_37788558/article/details/84382102
问题记录3-fuse的手动编译安装:https://blog.csdn.net/qq_37788558/article/details/84373885
问题记录4-aufs安装及替换overlay的可行性分析
https://blog.csdn.net/qq_37788558/article/details/84382545

2.个人分析

如果不考虑最后一条,我们可以通过修改代码,对资源进行双写,即向目前本地磁盘写一份,向新的对象存储服务写一份,读取资源不变,然后开始从本地磁盘向新的位置copy数据了,等全部copy完,新的位置就有全量数据了(迁移过来的数据+新写入的数据),最后切换一下数据读取的位置到新的对象存储服务就行了。

但这次让从linux文件系统层面去尝试一下,主要原因是以下几点:

  1. 这个系统是零几年到代码,那个结构和代码质量。。。都懂的。双写、切换地址,这种操作在这种老旧的代码里不是修改全局配置文件之类的就可以搞定,有无数个地方要改,而且你还要挨个找到它们!
  2. 性能损耗。php逻辑处理、发送http请求、数据传输等都有开销,业务层开销肯定要比更低层大。
  3. just try!领导想换个思路,尝试个新方案。

3.初步方案

如图,我们要从原文件系统(source fs),迁到青云(qingcloud)的对象存储服务中(qingstor),通过s3fs将qingstor挂载到本地,然后和source fs组成联合文件系统(起初计划用overlayFs,后来实际换成了aufs),这样在联合文件系统中,上层和下层的merge用来读写,当读取的资源在上层不存在时,会去找下层;当写入写文件时,会写到上层(即对象存储服务),与此同时进行常规数据迁移。
细节不写了,看图意会^ ^。

大量数据迁移到对象存储服务过程中使用联合文件系统的迁移方案_第1张图片

4.知识介绍

我一开始也都不了解,所以查询调研么,分享下

4.1 OverlayFS:

一种联合文件系统,设计简单,速度更快。overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息。在overlayfs中,底层的目录叫做lowerdir,顶层的目录称之为upperdir,对外提供统一的文件系统为merged。 当需要修改一个文件时,使用CoW将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container。

参考:
https://my.oschina.net/xxbAndy/blog/884019
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/7.2_release_notes/technology-preview-file_systems

4.2 source fs:

指原文件系统,无特殊含义,即 from

(青云对迁移工具qscamel的配置也是这样定义)
source:
# type 是当前端点的类型。
# 可选值: aliyun, fs, filelist, gcs, qingstor, qiniu, s3, upyun.
type: fs
# path 是当前端点的路径。
path: “/path/to/source”

4.3 s3fs:

S3FS(Simple Storage Service File)是一款支持将对象存储中的bucket以文件形式导出的文件系统接口,兼容POSIX语义。S3fs是基于FUSE(用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如ZFS,glusterfs和luster使用FUSE实现。)开发文件系统,允许Linux和Mac Os X挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式。

4.4 qingstor:

QingStor™ 对象存储为用户提供可无限扩展的通用数据存储服务,具有安全可靠、简单易用、高性能、低成本等特点。
即青云的对象存储服务(to

文档地址:https://docs.qingcloud.com/qingstor/

4.5 qscamel:

设计图里写的qcamel,应该是指qscamel(一个用于在不同的端点 (Endpoint) 中高效迁移数据的工具)
文档上说,可以对接青云、阿里、七牛等的多种提供商的对象存储服务,这样就好理解了,就是个迁移工具。

文档地址:https://docs.qingcloud.com/qingstor/developer_tools/qscamel.html

4.6 消化整理:

通过s3fs进行数据镜像挂载,把S3存储桶挂载到Linux的文件系统下,这样操作存储桶里的数据就如同操作本地文件一样方便。
通过overlay这种联合文件系统保证迁移过程中数据(图片)的正常访问,将source fs作为下层,青云对象存储服务作为上层,通过qscamel下层数据向上层的数据迁移。

5. 环境部署

linux:centos 6.6 / 内核 2.24(自己的centos7 /内核版本 3.10)
s3fs:  v1.84
fuse:   2.8.4 
overlay:基于linux 4.19内核

一开始用的我自己的机器,但线上的机器比较老,版本低,所以又用了环境一致的,共两台机器(后来都升级了内核,这里提一下,overlayFs需要linux内核在3.18以上,aufs需要3.10)

6. 实践过程

特别说明:以下内容大多都是过程中的文本记录,暂不整理了,时间不太多

6.1 个人理解的步骤:

1、利用s3实现对qingstor的挂载
2、完成overlay的上(qingstor)、下层(source fs)的配置,实现资源的正常访问
3、利用qscamel对数据进行迁移

6.2 具体步骤
  1. 申请qingstor获取key、secret
    因为是测试过程,所以我先通过个人注册,并进行身份认证后获取免费配额,创建bucket之后获得key、secret等,用自己的东西测试,随便折腾。
  2. 安装s3
    经查,qingcloud有qsfs工具,对该工具等描述如下:

qsfs 是基于 FUSE 的文件系统,允许 Linux 将 QingStor Bucket 挂载在本地文件系统。
qsfs 已在 GitHub 开源,更多详情可参见 https://github.com/yunify/qsfs-fuse。

即,qsfs与s3fs都是基于fuse的,那么fuse是什么?如下:

FUSE(用户空间文件系统)作为类UNIX系统平台上可加载的内核模块,允许非特权用户创建功能完备的文件系统,而不需要重新编译内核。FUSE模块仅仅提供kernel模块的接入口,而本身的主要实现代码位于用户空间中。对于读写虚拟文件系统来说,FUSE是个很好的选择。
FUSE起初是为了研究AVFS(A Virtual Filesystem)而设计的,而现在已经成为SourceForge的一个独立项目,目前适用的平台有Linux, FreeBSD, NetBSD, OpenSolaris和Mac OS X。官方的linux kernel版本到2.6.14才添加了FUSE模块,因此2.4的内核模块下,用户如果要在FUSE中创建一个文件系统,需要先安装一个FUSE内核模块,然后使用FUSE库和API来创建。
详细信息可参考:https://github.com/libfuse/libfuse

  • 那么,我倾向选择直接使用 qsfs 来挂载青云的对象存储,毕竟配套的东西会更加方便。
  • 但了解到目前公司普遍使用s3挂载磁盘,所以最终选择使用 s3 ,熟悉一下对以后帮助会更大。

青云对象存储s3fs示例文档:https://docs.qingcloud.com/qingstor/s3/examples.html#s3fs

过程:

#获取系统版本信息
> uname -a
Linux iZ2ze1ddoyj3i3p3098r20Z 3.10.0-123.9.3.el7.x86_64 #1 SMP Thu Nov 6 15:06:03 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
或
> lsb_release -a
#这台是我自己的机器,周二机器还没给到
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.5.1804 (Core) 
Release:        7.5.1804
Codename:       Core
或
>  cat /etc/redhat-release
CentOS release 6.6 (Final)

#安装S3
#安装依赖
> sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel epel-release s3fs-fuse

##更改yum源(蓝色部分是解决新机器问题时后加的):
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
yum clean all
yum makecache
##编译安装fuse(运维提供的机器是centos6.6,缺好多依赖,yum源也和版本不完全匹配,fuse通过yum一直安装不上)
见 “错误记录-fuse的安装”
手动编译过程记录到了另一篇文章:http://note.youdao.com/noteshare?id=32a86a37653200966515201102f544eb

#下载并安装S3fs-fuse
> git clone https://github.com/s3fs-fuse/s3fs-fuse.git
> cd s3fs-fuse
> ./autogen.sh
> ./configure
> make
> sudo make install
#检查S3是否安装成功
> s3fs
s3fs: missing BUCKET argument.
Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...
#成功 
  1. 修改s3配置,对qingstor进行挂载

配置项中的url如何设置文档交代的不明确,费了点时间,记录到了另一篇文章:
http://note.youdao.com/noteshare?id=3c1d6830b30659be65cfeb937170ce55

过程:

#创建密匙
> mkdir /root/.s3fs
> vim /root/.s3fs/credentials
#PHHXPRD【防止恶意使用】ZAJJIGS:Kt7z8EsvajpLCIXUf3t9C【防止恶意使用】Eh5OEY3QFmuObs
#密匙文件权限给600 (只能给这个值,其他用户不能给任何权限,会报错)
> chmod 600 /root/.s3fs/credentials
#挂载 bucket 到本地目录:
> mkdir -p /mnt/mybucket
> s3fs hqw-wyq /mnt/mybucket -o passwd_file=/root/.s3fs/credentials -o url=http://s3.pek3b.qingstor.com -f -d -o f2
#验证结果
> df -T | grep s3fs
s3fs           fuse.s3fs 274877906944       0 274877906944   0% /mnt/mybucket
> ls /mnt/mybucket
5.png  access_key.csv  demo6-16a47e5d31.jpg
#之前放到对象存储服务中的文件已经有了,新增文件后在对象存储服务中也同步过去了,挂载成功。
  1. 配置s3的开机自动挂载:
#写入密匙
echo PHHXPRD【防止恶意使用】ZAJJIGS:Kt7z8EsvajpLCIXUf3t9C【防止恶意使用】Eh5OEY3QFmuObs > /etc/passwd-s3fs
#修改文件权限
chmod 600 /etc/passwd-s3fs
#修改 /etc/fstab 文件,加入下面内容:
s3fs#hqw-wyq /mnt/mybucket fuse _netdev,url=http://s3.pek3b.qingstor.com,allow_other 0 0
#保存 /etc/fstab 文件,执行 mount -a 命令,如果没有报错,则说明设置正常
#如果您的系统为 centos6.5 ,还需要执行下面的命令:
chkconfig netfs on
#重启测试
reboot
  1. 完成overlay的上(qingstor)、下层(source fs)的配置,实现资源的正常访问

#Linux内核3.18以上才支持overlayFS,我的机器是3.10.0,运维提供的是2.6.32
此步骤中更新linux内核的操作写到了另一篇文档中,避免太乱 :
http://note.youdao.com/noteshare?id=4ea02aeb6d4d7a6319471f55547ee03d

overlay设置:

mkdir /mnt/source
mkdir /mnt/merged
mount -t overlay overlay -olowerdir=/mnt/source,upperdir=/mnt/mybucket,workdir=/mnt/work /mnt/merged

整体结构分为三层:merged dir、upperdir、lowdir。
其中挂载的qingstor(/mnt/mybuket)作为上层,原数据文件(/mnt/source)作为下层,二者的合集(/mnt/merged)供外部访问,这样以来对merged层的新写入会同步到upper层即qingstor对象存储服务中,访问upper层没有的数据时,会到lower层读取旧数据。

!!貌似不可以使用s3挂载的镜像作为upperdir,报错如下:

mount: wrong fs type, bad option, bad superblock on overlay,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

通过dmesg指令查看详细信息主要有下面这条报错:
[ 6094.524644] overlayfs: workdir and upperdir must reside under the same mount

(创建正常文件夹/mnt/upper,将配置参数换为upperdir=/mnt/upper,其他全部不变,则正常运行。)

  • 个人认为,workdir位置要与uppdir同级,但用s3挂载过来的文件位置与一般文件路径还是有区别的,两者某种意义上来说不在一级。
  • 不知道是不是可以这样理解,也没深究,希望能有人能解答我!
  • 后来试过不用workdir和upperdir,只用lowerdir,并放置多层。这样可以正常运行,但是lower层只读不可写,这样一来,也行不通。
  1. 利用qscamel对数据进行迁移

文档:https://docs.qingcloud.com/qingstor/developer_tools/qscamel

过程:

#下载qscamel工具
wget https://github.com/yunify/qscamel/releases/download/v2.0.5/qscamel_v2.0.5_linux_amd64.tar.gz
#解压
tar -zxvf  qscamel_v2.0.5_linux_amd64.tar.gz
#创建配置文件
vim example-tast.yaml
#内容如下
name: example-task
type: copy

source:
  type: fs
  path: /mnt/source

destination:
  type: qingstor
  path: /
  options:
    bucket_name: hqw-wyq
    access_key_id: PHHXPRDMQQSFJZAJJIGS
    secret_access_key: Kt7z8EsvajpLCIXUf3t9C12VlSEh5OEY3QFmuObs
# ignore_existing 控制是否跳过已经存在的文件,这样来跑增量
ignore_existing: last_modified
# 执行(首次执行跑全量)
./qscamel run example-task -t example.yaml
# 再次创建新的任务并执行(配置不变,ignore已存在的,跑增量)
./qscamel run example-task2 -t example.yaml

日志文件:~/.qscamel/qscamel.log

INFO[2018-11-15T11:46:14+08:00] Task example-task2 migrate started.          
INFO[2018-11-15T11:46:15+08:00] Start listing job /.                         
INFO[2018-11-15T11:46:15+08:00] Job / listed.                                
INFO[2018-11-15T11:46:15+08:00] Start checking object /s2.txt.               
INFO[2018-11-15T11:46:15+08:00] Start checking object /s1.txt.               
INFO[2018-11-15T11:46:15+08:00] Start checking object /s3.txt.               
INFO[2018-11-15T11:46:15+08:00] Object /s3.txt is not found at qingstor:hqw-wyq. 
INFO[2018-11-15T11:46:15+08:00] Start copying single object /s3.txt.         
INFO[2018-11-15T11:46:15+08:00] Object /s2.txt check passed, ignore.         
INFO[2018-11-15T11:46:15+08:00] Object /s1.txt check passed, ignore.         
INFO[2018-11-15T11:46:15+08:00] Single object /s3.txt copied.                
INFO[2018-11-15T11:46:15+08:00] Task example-task2 has been finished.     

以上,就是全部过程。

整理

目前风险点:

1、overlayfs需linux内核在3.18版本以上,目前机器版本较低centos6.6 / 2.6.32 ,需升级内核,这样会影响到服务。
2、overlayfs的upper层使用通过s3挂载到文件系统的qingstor镜像未能成功运行,有报错,使用正常文件路径则正常,初步怀疑这种方法不可行,二者不能这样应用,具体有待进一步查阅和调试。

可行性方案:
  1. 可以利用qingstor提供的外部镜像源,它的介绍如下:
    大量数据迁移到对象存储服务过程中使用联合文件系统的迁移方案_第2张图片

个人认为步骤设计如下:

  • a、使用qscamel迁移全量数据
  • b、配置qingstor的外部镜像到源空间
  • c、修改访问地址转到对象存储服务的url
  • d、使用qscamel迁移增量数据
  • e、最终增量数据迁移完成,且外部镜像使用量为0后,则表明全部成功
  1. 通过尝试aufs,发现可以在overlay的使用过程中设置多个下层,将qingstor放在最上边可以正常运行。

!!后来发现overlay这样用,qingstor挂载过来的会不可写(overlay中,upper可写,lower只读,都在lower层,则不可写,所以无法使用。aufs中,多层会写最上层),所以可以用aufs,overlay不行。
但两种联合文件系统的问题是,都需要对linux版本做升级,重启机器会影响服务,升级过程中是否影响其他一些功能的正常启动暂不清楚(例如定时脚本少执行一次;个别服务没有设置开机自动重启……)

最终还是将overlayfs用aufs替换
大量数据迁移到对象存储服务过程中使用联合文件系统的迁移方案_第3张图片

笔记到此end。

你可能感兴趣的:(Linux)