记一次迁移3T静态数据到存储服务的实践过程,跟大家分享一下。
刚毕业,水平有限,重在记录和分享。^ _ ^
如果你的遇到的场景与上述特征相近,那么可以试着读完全文。
附录:
问题记录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
如果不考虑最后一条,我们可以通过修改代码,对资源进行双写,即向目前本地磁盘写一份,向新的对象存储服务写一份,读取资源不变,然后开始从本地磁盘向新的位置copy数据了,等全部copy完,新的位置就有全量数据了(迁移过来的数据+新写入的数据),最后切换一下数据读取的位置到新的对象存储服务就行了。
但这次让从linux文件系统层面去尝试一下,主要原因是以下几点:
如图,我们要从原文件系统(source fs),迁到青云(qingcloud)的对象存储服务中(qingstor),通过s3fs将qingstor挂载到本地,然后和source fs组成联合文件系统(起初计划用overlayFs,后来实际换成了aufs),这样在联合文件系统中,上层和下层的merge用来读写,当读取的资源在上层不存在时,会去找下层;当写入写文件时,会写到上层(即对象存储服务),与此同时进行常规数据迁移。
细节不写了,看图意会^ ^。
我一开始也都不了解,所以查询调研么,分享下
一种联合文件系统,设计简单,速度更快。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
指原文件系统,无特殊含义,即 from
(青云对迁移工具qscamel的配置也是这样定义)
source:
# type 是当前端点的类型。
# 可选值: aliyun, fs, filelist, gcs, qingstor, qiniu, s3, upyun.
type: fs
# path 是当前端点的路径。
path: “/path/to/source”
S3FS(Simple Storage Service File)是一款支持将对象存储中的bucket以文件形式导出的文件系统接口,兼容POSIX语义。S3fs是基于FUSE(用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统。目前Linux通过内核模块对此进行支持。一些文件系统如ZFS,glusterfs和luster使用FUSE实现。)开发文件系统,允许Linux和Mac Os X挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式。
QingStor™ 对象存储为用户提供可无限扩展的通用数据存储服务,具有安全可靠、简单易用、高性能、低成本等特点。
即青云的对象存储服务(to)
文档地址:https://docs.qingcloud.com/qingstor/
设计图里写的qcamel,应该是指qscamel(一个用于在不同的端点 (Endpoint) 中高效迁移数据的工具)
文档上说,可以对接青云、阿里、七牛等的多种提供商的对象存储服务,这样就好理解了,就是个迁移工具。
文档地址:https://docs.qingcloud.com/qingstor/developer_tools/qscamel.html
通过s3fs进行数据镜像挂载,把S3存储桶挂载到Linux的文件系统下,这样操作存储桶里的数据就如同操作本地文件一样方便。
通过overlay这种联合文件系统保证迁移过程中数据(图片)的正常访问,将source fs作为下层,青云对象存储服务作为上层,通过qscamel下层数据向上层的数据迁移。
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)
特别说明:以下内容大多都是过程中的文本记录,暂不整理了,时间不太多
1、利用s3实现对qingstor的挂载
2、完成overlay的上(qingstor)、下层(source fs)的配置,实现资源的正常访问
3、利用qscamel对数据进行迁移
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
青云对象存储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]...
#成功
配置项中的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
#之前放到对象存储服务中的文件已经有了,新增文件后在对象存储服务中也同步过去了,挂载成功。
#写入密匙
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
#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,其他全部不变,则正常运行。)
文档: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镜像未能成功运行,有报错,使用正常文件路径则正常,初步怀疑这种方法不可行,二者不能这样应用,具体有待进一步查阅和调试。
个人认为步骤设计如下:
!!后来发现overlay这样用,qingstor挂载过来的会不可写(overlay中,upper可写,lower只读,都在lower层,则不可写,所以无法使用。aufs中,多层会写最上层),所以可以用aufs,overlay不行。
但两种联合文件系统的问题是,都需要对linux版本做升级,重启机器会影响服务,升级过程中是否影响其他一些功能的正常启动暂不清楚(例如定时脚本少执行一次;个别服务没有设置开机自动重启……)
笔记到此end。