使用 Aspera 高速传输
Aspera 高速传输克服了传统 FTP 和 HTTP 传输的限制,能在大多数情况下提高数据传输性能,尤其是在等待时间长和有丢包问题的网络中。
此功能当前在 Object Storage 中不支持 Satellite。 了解更多信息。
Aspera 高速传输将使用 FASP 协议上载对象,而不是标准 HTTP PUT
操作。 使用 Aspera 高速传输进行上传和下载具有以下优点:
- 传输速度更快
- 在控制台中可上传超过 200 MB 的大对象,使用 SDK 或库可上传 1 GB
- 上传任何类型的数据(例如,多媒体文件、磁盘映像以及其他任何结构化或非结构化数据)的整个文件夹
- 可定制传输速度和缺省首选项
- 可以独立查看、暂停、恢复或取消传输
Aspera 高速传输在 IBM Cloud 控制台 中可用,也可以使用 Aspera Transfer SDK以编程方式使用。
Aspera 高速传输仅在某些区域可用。 有关更多详细信息,请参阅集成服务。
如果目标存储区具有 不可变 Object Storage 策略,那么无法使用 Aspera 高速传输。
使用控制台
如果在支持的区域中使用控制台来添加对象,那么系统将提示您选择安装 Aspera Connect 客户机的选项。 此浏览器插件提供 Aspera 高速传输来上传文件或文件夹。
安装 Aspera Connect
- 选择安装 Aspera Connect 客户机。
- 根据您的操作系统和浏览器,遵循相应的安装指示信息。
- 恢复文件或文件夹上传。
Aspera Connect 插件还可以直接从 Aspera Web 站点进行安装。 有关对 Aspera Connect 插件问题进行故障诊断的帮助,请参阅此文档。
安装插件后,可以选择将 Aspera 高速传输设置为缺省值,以用于使用同一浏览器执行的到目标存储区的任何上传。 选中记住我的浏览器首选项。 在存储区配置页面的传输选项下也提供了相关选项。 通过这些选项,可以在“标准”和“高速”之间进行选择,以作为上传和下载的缺省传输。
通常,使用 IBM Cloud Object Storage 基于 Web 的控制台并不是使用 Object Storage 的最常用方法。 “标准”传输选项将对象大小限制为 200 MB,并且文件名和密钥要相同。 Aspera 高速传输支持更大的对象大小,并且性能更高(取决于网络因素)。
Aspera 服务器在可配置 TCP 端口 (缺省情况下为 33001) 上运行一个 SSH 服务器。 服务器端的防火墙必须允许此一个 TCP 端口访问 Aspera 服务器。 没有服务器在 UDP 端口上侦听。 当 Aspera 客户机启动传输时,该客户机在指定的 TCP 端口上打开到 SSH 服务器的 SSH 会话,并协商数据将通过的 UDP 端口。 缺省情况下,Aspera 客户机和服务器配置为使用 UDP 端口 33001。 在会话启动步骤之后,客户机和服务器都将在协商的端口上发送和接收 UDP 流量。 要允许 UDP 会话启动,Aspera 服务器端的防火墙必须允许端口 UDP 33001 访问 Aspera 服务器。 有关更多信息,请参阅防火墙注意事项。
传输状态
**活动:**启动传输后,传输状态会显示为“活动”。 传输处于活动状态时,可以暂停、恢复或取消活动传输。
**已完成:**完成传输后,有关此传输以及此会话中所有传输的信息都会显示在“已完成”选项卡上。 可以清除这些信息。 您只能查看有关当前会话中已完成的传输的信息。
**首选项:**可以将上传和下载的缺省值设置为“高速”。
使用 Aspera 高速传输进行下载将产生输出费用。 有关更多信息,请参阅定价页面。
**高级首选项:**可以设置上传和下载的带宽。
使用 Aspera Transfer SDK
- 从 IBM API Hub 下载 Aspera Transfer SDK。 SDK 是二进制文件 (命令行实用程序和用于侦听传输请求的守护程序),配置文件和特定于语言的连接器的集合。
- 从相应的软件包管理器 (pip,maven,gem 等) 安装 grpc 依赖项。
- 启动守护程序并将相关编程语言连接器文件导入到项目中。
- 通过向 Aspera 客户机传递守护程序使用的本地端口来实例化该客户机。
- 创建包含传输所需的所有信息的
transfer_spec
:icos
信息:- API 密钥
- 服务实例标识
- 目标端点
- 存储区名称
- 传输方向
- 远程主机 (您可以通过使用
?faspConnectionInfo
查询参数向存储区发送 GET 请求来找到此请求) - 用于传输的资产 (基本上是一组文件路径)
- 将传输规范和配置信息传递到传输请求。
以下是使用 Python的示例:
import random
import string
import grpc
import json
import os.path
from urllib3.connectionpool import xrange
import transfer_pb2 as transfer_manager
import transfer_pb2_grpc as transfer_manager_grpc
def run():
# create a connection to the transfer manager daemon
client = transfer_manager_grpc.TransferServiceStub(
grpc.insecure_channel('localhost:55002'))
# create file
file_path = generate_source_file()
# create transfer spec
transfer_spec = {
"session_initiation": {
"icos": {
"api_key": os.environ.get('IBMCLOUD_API_KEY'),
"bucket": os.environ.get('IBMCLOUD_BUCKET'),
"ibm_service_instance_id": os.environ.get('IBMCLOUD_COS_INSTANCE'),
"ibm_service_endpoint": os.environ.get('IBMCLOUD_COS_ENDPOINT')
}
},
"direction": "send",
"remote_host": "https://ats-sl-dal.aspera.io:443",
"title": "strategic",
"assets": {
"destination_root": "/aspera/file",
"paths": [
{
"source": file_path
}
]
}
}
transfer_spec = json.dumps(transfer_spec)
# create a transfer request
transfer_request = transfer_manager.TransferRequest(
transferType=transfer_manager.FILE_REGULAR,
config=transfer_manager.TransferConfig(),
transferSpec=transfer_spec)
# send start transfer request to transfer manager daemon
transfer_response = client.StartTransfer(transfer_request)
transfer_id = transfer_response.transferId
print("transfer started with id {0}".format(transfer_id))
# monitor transfer status
for transfer_info in client.MonitorTransfers(
transfer_manager.RegistrationRequest(
filters=[transfer_manager.RegistrationFilter(
transferId=[transfer_id]
)])):
print("transfer info {0}".format(transfer_info))
# check transfer status in response, and exit if it's done
status = transfer_info.status
if status == transfer_manager.FAILED or status == transfer_manager.COMPLETED:
print("finished {0}".format(status))
break
def generate_source_file(name='file'):
with open(name, 'w') as file:
# file.write('Hello World!')
file.write(''.join(random.choice(string.ascii_lowercase) for i in xrange(10 ** 10)))
return os.path.abspath(name)
if __name__ == '__main__':
run()