【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件

【实验目的】
据说华为云对象存储OMS服务的复制功能挺牛逼的,能够在线复制其他云上的对象存储文件,体验一下效果如何。
对象存储适合存放非结构化数据,如图片、视频、文件等等。用文本文件测试一下效果。

【思路】
1、在腾讯云对象存储COS上创建一个标准存储桶。
2、通过python写一个爬虫脚本,爬取糗事百科网站上第一页的笑话,每个笑话作为一个文件,调用腾讯的SDK接口自动存放到腾讯云对象存储COS中。
3、使用华为云对象存储服务OMS将腾讯云对象存储COS中的笑话文件在线复制到华为云,观察路径结构是否相同。
4、通过python脚本,分别调用腾讯云和华为云上的SDK接口,将所有笑话读出来,并分别保存到一个文件中。通过beyondcompare工具对比内容是否一致。
5、python爬虫程序继续爬取第二页的笑话并上传至腾讯云的对象存储COS中,检查笑话文件是否从腾讯云同步到华为云上。
6、重复步骤4,检查对象存储中增量部分内容是否一致。

【操作步骤】
1、编写python爬虫代码,将糗事百科上主页第一页笑话爬取到本地,存放为文件。Python爬虫代码参考后文。爬虫脚本运行结果和文件生成情况如下。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第1张图片
2、在腾讯云创建测试桶和测试目录,OK。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第2张图片
3、安装腾讯云对象存储COS的SDK插件。本文测试的爬虫脚本在笔记本的windows环境上运行,在笔记本上的命令行中执行命令“pip install -U cos-python-sdk-v5”
4、在腾讯云的控制台-访问管理-云API密钥-API密钥管理-新密钥。记录好appid和密钥,后续SDK API调用需要通过密钥验证调用者的身份和权限。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第3张图片
5、python爬虫获取的笑话,不用在本地生成文件了,直接写入到对象存储的指定文件夹“糗事百科笑话”的文件中。篇幅有限,这里截图值包含了部分文件列表。这部分代码见附录1

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第4张图片
6、在华为云上创建一个OBS桶,并下载华为云的访问密钥。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第5张图片

7、启动华为云对象存储OMS服务,根据提示输入腾讯云和华为云的桶信息。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第6张图片

8、选择指定迁移文件夹“糗事百科笑话”。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第7张图片

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第8张图片

9、迁移完成,到华为云对象存储OBS中检查,文件夹“糗事百科笑话”和下级的笑话文件已经全部拷贝过来。华为云目前暂只支持按修改时间进行排序,不支持按照文件名,对比起来不方便。后面用第三方工具beyondcompare进行专项对比数据一致性。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第9张图片
10 、安装华为云对象存储OBS的python版本SDK工具,步骤参考:帮助中心 > OBS Python SDK API参考 数据类型
https://support.huaweicloud.com/api-obs_python_sdk_api_zh/zh-cn_topic_0119681269.html
11、通过Python脚本分别读取华为云和腾讯云上的所有笑话文件,并分别保存到文件“华为云上的笑话.txt”和“腾讯云上的笑话.txt”中。使用第三方工具beyondcompare进行数据一致性的对比,对比方式二进制对比,即逐字节对比。对比结果是华为云从腾讯云复制过来的笑话,数据是一致的。这部分python代码见附录2.

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第10张图片
12、测试增量同步的情况。思路如下:
糗事百科首页的笑话,每隔几分钟就会更新成新笑话,使用爬虫脚本再次爬取笑话。
第1个笑话以追加更新的方式加入到joke_1.txt中,更新后joke_1.txt中保存2个笑话。
第2个笑话已覆盖更新的方式写入到joke_2.txt中,更新后joke_2.txt中保存最新的1个笑话。
其他笑话文件,暂不更新。
这部分python代码见附录3。

备注:
腾讯云对象存储COS目前不支持“追加写”的方式更新对象,对于频繁更新的文件,如日志文件,费时又费钱。
华为云对象存储OBS支持“追加写”的方式更新对象,有一些限制条件,详情见:https://support.huaweicloud.com/devg-obs_python_sdk_doc_zh/zh-cn_topic_0120253011.html

13、增量更新结果说明,从腾讯云上的更新时间确认,仅笑话1和笑话2是增量数据。下一步重点关注华为云对象存储复制功能OMS是否只同步更新了这2个文件。PS:腾讯云不支持按照修改时间排序文件名,查找哪个文件更新了,很不方便。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第11张图片

14、观察华为云对象存储OBS和复制服务OMS,没有进行自动更新,也没有按钮触发更新同步信息。需要在华为云对象存储中,手动创建新的复制任务,此时只会同步增量数据(即笑话1和笑话2)。原理:复制任务会先读取源端对象存储的元数据,用于对比哪些文件发生了变化,然后只复制有更新的文件。 操作步骤参加上面第7/8步。
15、观察华为云对象存储的更新时间,发现只有笑话1和笑话2有更新,从传输的数据量也说明了新的复制任务只进行了增量同步。PS:华为云对象存储支持按修改时间进行排序,在大量文件中查找哪些文件有更新时,华为云比腾讯云更方便。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第12张图片

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第13张图片
16、重复步骤11,通过python脚本分别将腾讯云和华为云更新后的笑话下载,并分别汇总到一个文本文件中,进行逐字节比较。经确认,两边数据完全一致。脚本代码见附录2。

【容灾实战】体验华为云对象存储迁移工具OMS迁移其他云平台上的对象存储文件_第14张图片

【结论】
1、华为云对象存储服务复制服务OMS,支持全量和增量复制其他云厂商(AWS、阿里云、腾讯云、百度云、金山云、青云、七牛云)的对象存储。
2、复制后,两个平台上的文件是字节级的一致性。

【心得】
本文仅以腾讯云对象存储做测试,发现有2点是华为云对象存储做的更好的地方:
1、华为云支持按照修改时间显示哪些文件最近被修改了,方便寻找更新文件。腾讯云不支持。
2、华为云支持文件以“追加写”的方式更新文件,对于频繁更新的文件,省钱又高效。腾讯云不支持“追加写”方式更新。

【附录-python脚本】
附录1:爬虫程序读取糗事百科的笑话并存放到腾讯云对象存储上。

#!/usr/bin/python3
#-*- coding: utf-8 -*-

import sys

#网络爬虫所需的插件
import urllib.request
import re

#腾讯云对象存储COS所需的插件
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

###开始爬虫,从糗事百科网站获取笑话###
#将爬虫伪装成浏览器,避免被网站屏蔽
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)

#获取所有的笑话内容
webUrl = "http://www.qiushibaike.com/8hr/page/1"
webContent=urllib.request.urlopen(webUrl).read().decode("utf-8", "ignore")
matchPat = '
.*?(.*?)' jokes = re.compile(matchPat, re.S).findall(webContent) jokeCount = len(jokes) ###结束爬虫### ###开始将笑话全部存放到腾讯云对象存储中### secret_id = 'AKIDwgAPOAcwwf7OOBpz1nJYdU6SaT7xxx' # 替换为用户的secret_id secret_key = 'MSIsCFMErDKCwUp142qRq20kHafWxxxx' # 替换为用户的secret_key region = 'ap-chengdu' token = None config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) client = CosS3Client(config) for idx in range(jokeCount): joke = re.sub(r'\n', "", str(jokes[idx])) #删除换行符 joke = re.sub(r'
', "", joke) #删除多余标签 file_name = "joke_" + str(idx+1) + ".txt" file_path = '糗事百科笑话/' + file_name response = client.put_object(Bucket='tx-lyc-cos-1256385300',Body=joke,Key=file_path) print(response['ETag']) print(str(joke)) print("======") ###结束将笑话全部存放到腾讯云对象存储中###

附录2:分别读取华为云和腾讯云的对象存储中的笑话,用于进行一致性对比。

#!/usr/bin/python3
#-*- coding: utf-8 -*-

import sys

#访问华为云对象存储所需的插件
from obs import ObsClient
from obs import *

#访问腾讯云对象存储所需的插件
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

###开始 读取华为云中的笑话###
ak='HUPPCP5G6IGAC08Oxxxx'
sk='ql3wxcugPsA9sdczRYae2w87h84Uah72ryvPxxxx'
region ='https://obs.cn-south-1.myhwclouds.com'
obsClient = ObsClient(access_key_id = ak, secret_access_key= sk, server = region)
bucket = 'hello-obs-demo'
resp = obsClient.listObjects(bucketName=bucket, prefix='糗事百科笑话/joke')
files = resp.body.contents
fileCount = len(files)

#将这些文件中的笑话内容分别读出来,并写入名为“华为云上的笑话.txt”文件中
fo = open('华为云上的笑话.txt',  'wb')
fileCount = len(files)
jokeInfo = '笑话总数:' + str(fileCount)
fo.write(jokeInfo.encode('utf-8', 'ignore'))

for idx in range(fileCount):
        file = files[idx]
        fileName = '\n\n===' + file.key + '===\n'
        fo.write(fileName.encode('utf-8', 'ignore'))
        fileBody = obsClient.getObject(bucketName=bucket, objectKey=file.key, loadStreamInMemory='True')
        fo.write(fileBody.body.buffer)
fo.close()
obsClient.close()
print('读取华为云上的笑话结束,总数:' + str(fileCount))
###结束 读取华为云中的笑话###

###开始 读取腾讯云中的笑话###
secret_id = 'AKIDwgAPOAcwwf7OOBpz1nJYdU6SaT7Xxxx'     # 替换为用户的secret_id
secret_key = 'MSIsCFMErDKCwUp142qRq20kHafW9xxx'     # 替换为用户的secret_key
config = CosConfig(Region='ap-chengdu', SecretId=secret_id, SecretKey=secret_key, Token='')  
client = CosS3Client(config)
bucket = 'tx-lyc-cos-1256385300'
objList = client.list_objects(Bucket=bucket, Prefix='糗事百科笑话/joke')
files = objList['Contents']

#将这些文件中的笑话内容分别读出来,并写入名为“腾讯云上的笑话.txt”文件中
fo = open('腾讯云上的笑话.txt',  'wb')
fileCount = len(files)
jokeInfo = '笑话总数:' + str(fileCount) 
fo.write(jokeInfo.encode('utf-8', 'ignore'))

for idx in range(fileCount):
    file = files[idx]
    fileName = '\n\n===' + file['Key'] + '===\n'
    fo.write(fileName.encode('utf-8', 'ignore'))    
    fileBody = client.get_object(Bucket=bucket,  Key=file['Key'])
    fo.write(fileBody['Body'].get_raw_stream().read())
    
fo.close()
print('读取腾讯云上的笑话结束,总数:' + str(fileCount))
###结束 读取腾讯云中的笑话###

附录3:测试笑话1文件追加最新的笑话(即存储新旧2个笑话),笑话2文件替换成新的笑话,其他文件保持不变。用于测试增量同步的情况。

#!/usr/bin/python3
#-*- coding: utf-8 -*-

import sys

#网络爬虫所需的插件
import urllib.request
import re

#腾讯云对象存储所需的插件
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

###开始从糗事百科完整上爬取笑话内容###
#浏览器伪装池,将爬虫伪装成浏览器,避免被网站屏蔽
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)

#获取糗事百科首页中的第1个和第2个笑话
webUrl = "http://www.qiushibaike.com/8hr/page/1"
webContent=urllib.request.urlopen(webUrl).read().decode("utf-8", "ignore")
matchPat = '
.*?(.*?)' jokes = re.compile(matchPat, re.S).findall(webContent) joke1 = re.sub(r'\n', "", str(jokes[0])) #删除换行符 joke1 = re.sub(r'
', "", joke1) #删除多余标签 joke2 = re.sub(r'\n', "", str(jokes[1])) #删除换行符 joke2 = re.sub(r'
', "", joke2) #删除多余标签 ###结束获取笑话### ###开始将笑话全部存放到腾讯云对象存储中### secret_id = 'AKIDwgAPOAcwwf7OOBpz1nJYdU6SaT7Xxxxx' # 替换为用户的secret_id secret_key = 'MSIsCFMErDKCwUp142qRq20kHafWxxxx' # 替换为用户的secret_key region = 'ap-chengdu' # 替换为用户的region token = None # 使用临时秘钥需要传入Token,默认为空,可不填 config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 client = CosS3Client(config) bucket = 'tx-lyc-cos-1256385300' #下载第一个笑话的内容到joke_1.txt中 fp = open('joke_1.txt', "wb") jokeBody = client.get_object(Bucket=bucket, Key='糗事百科笑话/joke_1.txt') fp.write(jokeBody['Body'].get_raw_stream().read()) print("下载旧的笑话") #将新爬取的笑话1,追加到joke_1.txt中 sepString = '\n====joke_1.txt中的新笑话如下====\n' fp.write(sepString.encode('utf-8', 'ignore')) fp.write(joke1.encode('utf-8', 'ignore')) fp.close() rsp = client.put_object_from_local_file(Bucket='tx-lyc-cos-1256385300', LocalFilePath='joke_1.txt', Key='糗事百科笑话/joke_1.txt' ) print("写入新的笑话1") #将新爬取的笑话2,直接覆盖腾讯云对象存储中的joke_2.txt中 rsp = client.put_object(Bucket='tx-lyc-cos-1256385300', Body=joke2,Key='糗事百科笑话/joke_2.txt' ) print("写入新笑话2") ###结束将笑话全部存放到腾讯云对象存储中###

 

你可能感兴趣的:(容灾/备份/迁移)