@zhongdao
2021-08-20T16:57:09.000000Z
字数 66347
阅读 1678
未分类
对bft不了解,采用不正确的术语来描述,说明对技术有误解,会导致+最终的业务系统无法正常设计和实现,达成预期的需求和效果,浪费人力和时间。
所以前3章进行概要的说明和流程图示意。
具体的接口,技术规范见第4章: 数据结构与接口
P2P网络与BitTorrent技术简介
https://www.zybuluo.com/zhongdao/note/1390440
一般的下载服务器为每一个发出下载请求的用户提供下载服务,而BitTorrent的工作方式与之不同。分配器或文件的持有者将文件发送给其中一名用户,再由这名用户转发给其他用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载都全部完成。这种方法可以使下载服务器同时处理多个大体积文件的下载请求,
以下是BitTorrent协议中重要的名词定义和算法介绍。
种子文件(Torrent文件) 。
BitTorrent是通过一个扩展名为.torrent的种子文件进行下载部署的,它由文件最初发布者创建,发布到互联网上,供感兴趣的用户下载。种子文件记录了负责管理该文件所在分发网络的Tracker服务器的地址、文件名、文件长度以及每个文件分块的SHA-1校验值。
种子节点(Seed节点),
Seed节点是指在一个P2P共享下载网络中,拥有完整文件拷贝的节点。这类节点只提供上传服务,而没有下载请求。
下载节点(Leecher节点)
共享网络中相对于Seed节点的是Leecher节点,它只拥有部分的文件拷贝,在提供这部分拷贝的同时,还会向其他节点请求自己缺少的那部分文件。
跟踪服务器(Tracker服务器) 。
Tracker是一个中心服务器,负责跟踪系统中所有的参与节点,收集和统计节点状态,帮助参与节点互相发现,维护共享网络中文件的下载。一个Tracker服务器可以同时维护和管理多个文件共享网络。
共享网络(Swarm网络)。
一个Swarm共享网络是拥有和传输同一个文件资源的所有节点所构成的一个覆盖网络,包括共享该文件的Seed节点、Leecher节点和Tracker服务器。
p2p中的BT技术是 对等端的传输技术,发送端和接收端都是平等的,而且是一样的,只要防火墙打开,即可互相传输。
BFT 1.0 != 2.0 两者有很大不同,不能沿用1.0的术语和发送接收流程。
ctorrent API Server接口说明
https://www.zybuluo.com/zhongdao/note/1210252
制作种子: 根据目录生成 目录同名.torrent文件
做种服务时间:seedtime, 对外提供下载服务的时长,默认3天或者5天7天。与业务需求有关。
创建任务:无论是发送还是接受文件,都是创建一个BT的进程,有文件则对外提供下载服务,本地没有文件则从其他节点处下载。
做种服务: 根据种子文件和创建任务,启动p2p服务,提供做种服务时长的下载服务,然后结束
影片分发业务需求:需要在2-3天完成一部影片的传输,以替代硬盘的快递。所以一部影片200G做种服务时长通常设为5-7天就够了,如果还没下载完成,说明网络带宽不够,或者是意外,需要采用硬盘快递的备份方法来满足影院的上映需求。
因为混合了中心化的传输方式obs,cdn, 所以按照中心化的传输方式,严格区分发送端和接收端,相应的术语和接口也发生了改变。
任务策略:采用什么样的方式进行传输,具体体现为 dcp.task.json文件。 由用户输入选择参数和默认配置config.json一起决定,由api生成task.json.
发送端: 有片库的节点
中心节点的存储类型: 分2种类型,1. 本地存储中心,上传下载obs (不支持obs的传输方式) 2. 华为ecs内网直接挂载obsfs
边缘节点: 采用p2p的传输方式时,根据接收端的数量多少,人工或者自动配有一定量的边缘节点,帮助实现特定业务时间内的传输。 客观上起到了扩充发送端为多个的功能,减少了仅1个发送端时的整体接收时长。 发送一次dcp, 因影院数量,而确定边缘节点的数量,有个公式关系,大致是50:6,
BFT传输时间计算过程及近似公式 https://www.zybuluo.com/zhongdao/note/1626021
接收端: 影院终端,接收dcp
从 BT 客户端角度考虑,下载原理分为以下几步:
一.根据 BitTorrent 协议,文件发布者会根据要发布的文件生成提供一个 .torrent 文件。
客户端可从 Web 服务器上下载种子文件,并从中得到 Tracker 服务器 URL 等信息。
二.根据 Tracker URL 与 Tracker 服务器建立连接,并从服务器上得到 Peers 信息。
三.根据 Peers 信息与一个 Peer 建立连接,依据 Peer wire 协议完成握手,
并从 Peer 端下载数据文件。同时监听 Peer 的连接,并给 Peer 上传数据文件。
在BFT里为了方便人们理解,种子节点也叫作中心节点或者发送节点
下载节点包括2类, 在BFT里主要是边缘节点,终端影院接收节点。 前者可以对外提供服务,起到缓存和扩充中心节点的作用。后者因为防火墙未打开无法对外提供下载服务,所以只接收。
发送阶段划分:
发送端: 制作种子| 根据种子启动任务, (读取进度)100% | 持续对外提供下载服务 seedtime 时长 | 结束进程
对于本地存储目录中有片源的发送端,创建任务后,任务的过程同上面发送阶段,是否对外服务可以从本机的2780的web页面看到。
接收阶段划分:
接收端: 接收种子| 启动任务 | 0% | 下载 -- 100% | 持续对外提供下载服务 seedtime 时长 | 结束进程
对于边缘节点和影院终端,创建任务后,任务的过程同上面接收阶段
通过api, 无论发送端还是接收端都是创建create一个任务即开始整个阶段。
如果对外提供服务seedtime 是0, 那么下载完马上结束进程,无法查询到进度。
BFT 除了 P2P(BT)的传输方法之外,还提供了华为云的OBS,CDN的下载模式,三种下载方法混合起来传输,并且可以配置采用哪些方法,方法传输的数据量的大小,是全时段传输还是按照闲时传输。
bftv1, v2 接口api同时存在。
对应的TMS 要么未升级支持v1.0, 要么已经升级支持到v2.0
种子/任务分发系统, 面对旧版tms时分发torrent, 面对新版tms时分发task.json 文件。
不会出现旧版tms面对bftv2.0的情况
确保tms修改最小,兼容性最大
业务上v1和v2接收端的需求确定:
bftv2.0 里 3种发送方法, bt,obs,cdn
对于 bftv1.0的接收端,只支持bt的完全下载。
当中心节点的v2.0发送端发送json时,如果是BT:OBS:CDN = 1:0:0 ,即只有BT方法时,会启动完整的目录任务的BT进程对外提供下载服务,否则,在BT数据占一部分时,切分后的目录-tmp的BT进程对外提供下载服务,仅提供部分数据的下载。
相应的 接收端 v1.0 会接收到 完整种子,进行下载。 如果不是1:0:0的情况, v1.0接收端不接收完整种子也就不会下载。
这样是为了符合发送端的实际制定策略,也是内部技术实现的特性。
总共3种节点类型:
中心发送端: sender
边缘节点转发端: cacher
终端接收端:receiver
通过config.json中的 Servertype来设置节点类型, 其中针对 receiver的存储方案, 可以设置 receiverstoreplan 为 A 或B .
类型 | 功能 | 存储 | IP | server type |
---|---|---|---|---|
中心发送端 | 可以发送可以接收,可以创建本中心策略json | /data/dcp/cfec-001/dcps | 公网ip | sender |
接收端 | 只能接收,不能创建策略 | A: /data/dcp B: /data/dcp/cfec-001/dcps | 公网私网ip | receiver |
边缘节点 | 不下载,只对外提供bt做种服务,通常是各种云主机如 华为云 | /data/transfer/bt/cfec-001/ | 公网ip | cacher |
备注:其中的cfec-001: 中心标识-机构id ; 同时也是创建策略时的basesubdir的参数。
就存储类型而言,两种中心发送端节点类型:
类型 | 存储 | obsfs挂载 | 发送端上传 | 用户上传obs桶 | machine type |
---|---|---|---|---|---|
本地中心 | 本地存储/data/dcp/cfec-001/dcps | 无挂载obsfs | 需要手动上传得到终端可用的obs桶下载地址 | 支持 | local |
华为ecs | /data/dcp/cfec-001挂载有obsfs | 挂载obsfs | 本地目录挂载自obs桶,无需上传 | 支持 | hwecs |
发送端上传指:影片dcp放在本地存储,是否需要先上传,然后再对外提供obs桶的下载方式。
为了支持1本地中心节点类型的obs传输方式,在config.json中设置 "machinetype":"local", "datasource":"local"即可
如果数据来源于用户上传到obs://cfec-001/dcps 的桶中,不是本地存储上的,那么"datasource" 设置为"obs"即可。
这样在调用 send接口时,程序会自动判断进行相关操作.
注意:对于华为ecs中心节点类型,每次准备好dcp后,需要手工调用addhashtable.sh 来将其哈希计算值加入库中,以便支持免重复传输。
例如:
/root/soft2/addhashtable.sh /data/dcp3/cfec-001/dcps/xiaofang
a. 并行文件系统的问题,只能采用华为云的ecs来减少失败率,如果是华为云之外的中心节点,挂载obsfs会有失败率。
b. dcp目录名后面添加uuid来确保唯一性
c. 一个dcp里可以打包多个cpl
d. 同一中心下有用户群共享同一套dcp存储, 中心标识/机构或发行商id/dcpname
发送端的dcp存储目录原则: /data/dcp/cfec-001/dcps/dcpname
边缘节点的dcp存储目录原则: /data/dcp/cfec-001/dcps/dcpname
终端接收端虽然可以接受多个中心的同名dcp,但是共享同一套存储。
接收端的dcp存储目录原则: /data/dcp/dcpname
说明:目前的dcpname最新的版本更改为uuid
e. obs桶分 并行桶,普通桶2种类型,特定情况下采用特定的桶
f. obs的存储路径,中心要建一个中心标识-一个发行商id 建一个目录
例如: obs://cfec-001/xiaofang/
对应的本地obsfs挂载目录就是/data/dcp/cfec-001
每个发行商都要建,并且挂载到 中心节点的相应同名目录下。
g. cdn的回源地址,如果采用obs作为源,那么采用一样的路径.
h. 不同目录下,下载同名任务,可以同时下载。 则只会从一个发送端处下载,当相同tracker时。(已经测试通过)
h. /data/transfer/bt/cfec/cfec_001_uuid
I. ctorrent生成种子,可以种子名和目录名都采用全绝对路径,不必进入父目录下执行,方便了不考虑发送端存储路径解析。
因为华为cdn没有go的sdk, 所以每次发送任务没有进行cdn刷新.
如果每次发送目录名都不一致,不存在刷新的问题。
如果目录名一致,文件名一致,但是文件内容不同,就需要刷新。
而为了切割数据,会生成种子文件,也存在刷新的问题。
所以:每次发送目录名需要不相同,如果相同,至少下面的文件名不能相同。
同时,运维需要配置 .torrent的缓存过期时间设置为3-20分钟。 这样同名的.torrent即使内容发生了变化,只要过3-20分钟,下载端也可以正确下载到更新的.torrent.
而目录名不一致,就确保所有客户端从cdn下载,无需刷新,就都可以下载到正确的数据。
为了实现免重复传输,需要在发送端和接收端对dcp目录的存储库进行监控并实时计算sha1sum 哈希,如果没有哈希记录,也就无法完成免重复传输的功能。
监控和计算的结果存放在/etc/bft2/hashtable.txt
需要注意,对于第一次安装,初始化包含多个dcp大文件目录的整个dcp目录库时,需要一些时间来完成。 对于特别大的dcp目录,计算也需要时间。
当出现如下情况和条件时,会实时增删哈希记录:
当如下情况时,不增删哈希记录:
如下情况下,如需要调用inithashtable.sh清理并重建哈希表, 并等待完成
* 第一次安装时,/data/dcp下已经有多个大文件的dcp目录
* 更改了 config.json中的 servertype 或者 receiverstoreplan时
运营时为了实现接收端免重复传输,发送时要等前一个接收完发送下一个。
存储本地dcp目录库里的所有dcp的哈希表路径是固定的:
/etc/bft2/hashtable.txt
配置路径信息直接写入
inithashtable.sh
mhashtable.sh
日志: /var/log/bft2/mhashtable.log
混合传输的配置文件:
路径:/etc/bft2/config.json
{
"servertype": "cacher",
"machinetype": "local",
"receiverid": "cfec0001",
"vip":"1.2.3.4",
"basedatapath": "/data/dcp",
"basesubdir": "cfec-001",
"avoidrepeat": true,
"ctcs": "localhost:2780",
"senderid": "cfec",
"senderdomain": "http://47.92.93.51",
"bt-obs-cdn":"2:1:1",
"priorpolicy":"fulltime",
"tracker": "http://bttracker.top:6969/announce",
"defaultseedtime": "72",
"obsurl": "obs://cfec-001",
"cdnurl": "http://47.92.93.51",
"bttime": "06:00-18:00",
"obstime": "08:00-18:00",
"cdntime": "06:00-00:00",
"ctfilesorder":true,
"obsak":"AQGKZ0KGJTSMQRWCWXJG",
"obssk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
"obsendpoint":"obs.ap-southeast-1.myhuaweicloud.com"
"datasource":"local"
"receiverstoreplan":"A"
"uploadingnum":5
"downloadingnum":5
}
解释说明:
注意: 所有的路径与网址 后面不带 "/"
"servertype": "cacher", #servertype: cacher(边缘节点), sender(发送端), receiver(终端接收端) 用于区分存储的不同形式,sender是/data/dcp/cfec-001/dcps/xiaofang; receiver的A方案 则是 /data/dcp/xiaofang ,receiver的B方案则是同sender一样是/data/dcp/cfec-001/dcps/xiaofang; cacher不需要存储,直接在/data/transfer/bt下接收和做种服务seedtime时长。
"machinetype":"local", # 仅对sender有效,local,hwecs 2种值, hwecs表示华为云上主机,mount obsfs数据主要存储在obs上, 直接对外服务,发送时不需要上传obs, 不用区分数据从哪里来,用不到"datasource"字段; local表示本地机房主机配本地NAS存储等,发送时需要上传dcp到obs,或者从用户的obs桶中下载到本地用于对外做种服务. 需要用到"datasource"字段来判断数据来自obs桶还是本地存储. (因为跨网的obsfs的挂载会有失败率,云内挂载更可靠)。 两者都可以由机构用户通过obsbrowser上传到obs桶。hwecs表示无需上传到obs上,因为本地目录就是mount过的obsfs。直接发布obs,cdn的url即可。
"hashtable": "/data/bft2/hashtable.txt",
"receiverid": "cfec0002", #接收者id, 用于请求的唯一标识
"vip": "1.2.3.4", #接收者内部ip, 也用于请求的唯一标识
"basedatapath": "/data/dcp", # 发送端的基础存储目录,下一级是cfec-001形式,再下一级是dcp目录名
"avoidrepeat": true, #避免重复传输开关
"ctcs": "localhost:2780", # bt的web控制端地址,用于启动bt任务
"senderid": "cfec", # 中心发送端id, 不能有下划线,字母,数字组成
"senderdomain": "http://103.90.190.176", #用于下载种子和上传请求,规模大时用集群和域名
"bt-obs-cdn":"2:1:1", # 默认发送的策略,界面上可修改
"prior":"fulltime",
"tracker": "http://bttracker.top:6969/announce", # 生成种子用
"defaultseedtime": "72", #p2p任务的默认做种时间
"obsurl": "obs://lijun123", # obs的起始地址
"cdnurl": "http://download.bttracker.top", # cdn下载域名
"bttime": "08:00-18:00", # 闲时,此时段传输费用低 (不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
"obstime": "08:00-18:00", # 闲时,此时段传输费用低(不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
"cdntime": "06:00-00:00" # 闲时,此时段传输费用低(不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
"ctfilesorder":true # 对文件进行按方法分配时,顺序采用torrent种子文件中的顺序和逆序进行分配,否则文件大时会影响bt切片后下载超出分配的数据。
"obsak":"AQGKZ0KGJTSMQRWCWXJG", # obs桶的ak,多个桶可以共享
"obssk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0", # obs桶的sk,多个桶可以共享
"obsendpoint":"obs.ap-southeast-1.myhuaweicloud.com" # obs桶的,需要看控制台里内容,对应一个桶obsurl: obs://cfec-001, 如果是多个桶的访问,这里需要更换,要传参数到api.
"datasource":"local" # local or obs, 表示machinetype为local时的数据从哪里来,是本地目录/data/dcp/cfec-001/ 还是 obs://cfec-001/ 目前业务暂不支持此功能,也就是本地存储时不支持obs的传输方式.
"receiverstoreplan":"A" # 仅对receiver类型有效,A表示A存储方案,是/data/dcp不区分中心和机构id, B表示B存储方案,/data/dcp/cfec-001/dcps 区分中心和机构id
"uploadingnum":5 同时上传中状态的任务个数
"downloadingnum":5 同时下载中状态的任务个数
说明:
avoidrepeat: 为true时, 会打开避免重复传输功能。false时,照常传输。对应 task.json中的localsamefiles字段的写入和相应功能的打开。
servertype:sender, cacher, receiver ,
类型不同决定存储方案不同。有公网ip的可以做sender,cacher.
改变servertype时,需要重新清理并初始化哈希表
名称规则:中心名-机构id-uuid.task.json
例如: cfec-001-dad26d2a65489468986515.task.json
{
"sourcetype": "sender",
"senderid": "cfec",
"name": "xiaofang",
"type": "dir",
"senderlocalpath": "/data/dcp/cfec-001/dcps",
"basesubdir":"cfec-001"
"datasource":"local"
"size": 668521472,
"bt-obs-cdn": "1:1:1",
"policy": "priortime",
"bt": {
"localtorrent": "/data/dcp/cfec-001/dcps/xiaofang.torrent",
"url": "http://47.92.93.51/dcp/cfec-001/dcps/xiaofang.torrent",
"tmpurl":"http://47.92.93.51/dcp/cfec-001/dcps/xiaofang-tmp.torrent
"tracker":"http://bttracker.top:6969/announce"
"seedtime": 72,
"priortime": "00:00-23:00"
},
"obs": {
"url": "obs://cfec-001/dcps/xiaofang",
"priortime": "08:00-24:00",
"ak":"AQGKZ0KGJTSMQRWCWXJG",
"sk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
"endpoint":"https://obs.cn-north-4.myhuaweicloud.com"
},
"cdn": {
"url": "http://103.90.190.176/dcp/cfec-001/dcps/xiaofang",
"priortime": "18:00-05:00"
},
"filelist": [
{
"file": "42e7346d-ff82-c248-9a25-85e3058b0d44.mxf",
"hash": "bb53810cdfea87878d27457f807eb4574706f2e4",
"size": 9632846
},
{
"file": "ASSETMAP.xml",
"hash": "af11b565fc46fb87fa068c7ab89cb8eec3fdd4a9",
"size": 1466
},
{
"file": "PKL.XML",
"hash": "777d28475b581d7b0dc446bb5a965b2bc339a71e",
"size": 957
},
{
"file": "subdir/b9062d02-d9ce-6c4f-80c9-711985835c38.mxf",
"hash": "5efb3b8530afcb5c8ae1c4d182492d4434f5da3e",
"size": 658886048
},
{
"file": "subdir2/VOLINDEX",
"hash": "d9b3efd811d0210d686c8f503d12a7ca28cd4a4f",
"size": 155
}
],
"localsamefiles":[""],
"btlist": [""],
"obslist": [""],
"cdnlist": [""],
"requesters": [
{
"vip": "",
"id": ""
},
{
"vip": "",
"id": ""
}
],
"btlistsize": 0,
"obslistsize": 0,
"cdnlistsize": 0,
"btlistsize2": 0,
"obslistsize2": 0,
"cdnlistsize2": 0,
"gentime": "2021-04-19 22:14:30",
"sendtime":"",
"receivetime": "2021-04-19 22:51:05",
"finishedtime": "2021-04-19 23:49:54"
}
说明:
"sourcetype": "sender", # 主动分发模式sender,请求模式request
"senderid": "cfec", # 发送端id
"name": "dirname", # 要传输的内容目录名称或文件名称
"type": "dir", #内容类型 dir/file
"senderlocalpath": "/data/dcp/cfec-001", # 发送端传输内容的父目录, 在任务中仅用于跟踪,不用于建接收端的子目录。
"basesubdir":"cfec-001" # 用于标识发送端和机构id的信息。 对于cacher, 当存储dcp时,config.json : basedatapath + task.json: basesubdir + / + name ; 对于tms 的 receiver, 不需要此字段,因为直接存 /data/dcp中
"size": 12345, # 内容大小
"datasource": local # 本机 local or obs , 表示最初发送时,数据来自哪里? 然后决定数据同步的方向
"bt-obs-cdn": "2:1:1", # p2p,obs,cdn的数据传输比例, 例如1:0:0, 1:1:1 等等。
"policy": "priortime", # 请求的传输策略 priortime/fulltime 只闲时传输,全时间段传输。
bt.url # 种子下载地址
bt.tmpurl # 经数据比例分配的临时种子下载地址,为空时表示没有。
cdn.url 标识加速域名cname域名(可以回源到源站ip或域名),根据cdn的配置填入即可
bt.priortime BT的闲时传输时间(此时段传输流量费用低)
cdn.priortime CDN的闲时传输时间(此时传输流量费用低)
obs.priortime OBS的闲时传输时间(此时传输流量费用低)
"filelist" 即是要传输目录的绝对路径下的所有文件列表,是相对路径。
"btlist","obslist","cdnlist" 是按照平均分配下来的不同方式各自传输的文件列表,与bt-obs-cdn有关.
"localsamefiles" 用于接收端处理记录用的,用于避免重复传输时,下载到task.json文件后,先将filelist与本地哈希库对比,发现重复文件后,然后写入localsamefiles数组, 等按照传输比例分配时,先提出重复的部分,剩下的进行最终的文件列表任务分配, 分配完,正式开始下载,然后将不同方式的合并到一起,再根据重复的文件将其复制过去,填补完全,这时下载真正完成。
"gentasktime":"", 发送端生成任务文件时间
"sendtime":"", 发送时间
"receivetime":"", 接收时间
"finishedtime":"" 完成下载时间
"localpath + name" 即是要传输的目录的绝对路径
经过 obsutil 的cp 到 obs桶上,得到最终的obs下载路径
"obs.url" 是obs的下载路径,是 "桶名称/senderid/name"
桶名称来自安装时的配置,测试用桶名称为lijun123, 华为云分配的 obs.cn-north-1.myhuaweicloud.com 则不必管。obsutil工具用不到。
obs.url ,cdn.url 的内容标识本任务目录的实际下载地址,可以根据规则从config.json中的基本配置obsurl,cdnurl进行配置。
例如 cdnurl是cname加速域名,完整的cdn.url的下载地址来自“cdnurl/dcp/name” 因为 www下的dcp目录连接自 /data/dcp目录,而所有待下载的 目录name 放在 dcp下。
注意:
du -sc dirname 得到的是空间占用大小。
只是简单累加所有文件的大小,则用下面脚本:
find xiaofang -type f -ls | awk '{sum += $7} END {print sum}'
发送端根据业务需求的1:1:1的方法对比,根据本机的hashtable.经查文件哈希之后生成的任务文件。(发送端本机经过inithashtable.sh, 而且日常hashtable有监控, 每个文件都有完整的sha1的hash)
{
"sourcetype": "sender",
"senderid": "cfec",
"name": "zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV",
"type": "dir",
"senderlocalpath": "/data/dcp/cfec-001/dcps",
"basesubdir": "cfec-001",
"bt-obs-cdn": "1:1:1",
"policy": "fulltime",
"bt": {
"localtorrent": "/data/dcp/cfec-001/dcps/zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV.torrent",
"url": "http://103.90.190.176/dcp/cfec-001/dcps/zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV.torrent",
"tracker": "http://bttracker.top:6969/announce",
"seedtime": "169",
"priortime": "06:00-18:00"
},
"obs": {
"url": "obs://cfec-001/dcps/xiaofang",
"priortime": "08:00-18:00",
"obsak": "AQGKZ0KGJTSMQRWCWXJG",
"obssk": "FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
"obsendpoint": "obs.ap-southeast-1.myhuaweicloud.com"
},
"cdn": {
"url": "http://103.90.190.176/dcp/cfec-001/dcps/zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV",
"priortime": "06:00-24:00"
},
"filelist": [
{
"file": "886e309a-dfd4-45ee-a542-7d1c4b4251e9_cpl.xml",
"hash": "eb8f45c6b81f2d01bc9e35f6efa403a23e93901c",
"size": 1778
},
{
"file": "zds-viedo.mxf",
"hash": "79d317fddb697d5dc1f991dd05fcd309f048a13c",
"size": 933597669
},
{
"file": "zds-audio.mxf",
"hash": "99e81362750a1220ef1901457cd7942a94a2610d",
"size": 8623166
},
{
"file": "VOLINDEX",
"hash": "7648bf1e3b6f1c398d661b34988f69708028f583",
"size": 155
},
{
"file": "24e738d2-8f07-437f-84f4-3f5efb8af8cc_pkl.xml",
"hash": "acb2bceea62e18d3217f85ce80f1350e77616906",
"size": 1014
},
{
"file": "ASSETMAP.xml",
"hash": "bfe19db4e920c486efdd6256187941bcc88463a8",
"size": 1453
}
],
"size": 942225235,
"btlist": ["zds-viedo.mxf"],
"obslist": [],
"cdnlist": [
"zds-audio.mxf",
"886e309a-dfd4-45ee-a542-7d1c4b4251e9_cpl.xml",
"ASSETMAP.xml",
"24e738d2-8f07-437f-84f4-3f5efb8af8cc_pkl.xml",
"VOLINDEX"
],
"requesters": [
{
"vip": "",
"id": ""
}
],
"gentime": "2021-04-25 16:56:37",
"btlistsize": 933597669,
"obslistsize": 0,
"cdnlistsize": 8627566
}
obs的闲时: 00:00-08:00
cdn的闲时: 8:00-18:00
bt边缘节点的网络闲时:? 未知, 默认设置为全时段 00:00-23:59
参考资料如下:
从华为的网页说明可以看出, 一天分为2个时段,1个是闲时,剩下的是忙时。 闲时忙时合起来构成了1天的完整时间。
CDN的全时流量包和闲时流量包有什么区别?
https://support.huaweicloud.com/cdn_faq/cdn_faq_0250.html
两种流量包均仅用于流量计费模式。
闲时流量包是CDN活动产品,购买了闲时流量包,一般指北京时间8:00-18:00的消费从闲时流量包计费;
全时流量包可用于所有时间消费的计费。
闲时时段优先消耗闲时流量包。
注:闲时时段以活动公布的时间段为准。
OBS对象存储服务多少钱
https://www.huaweicloud.com/zhishi/price-obs.html
公网流出流量 / 00:00-08:00(闲时)
公网流出流量 / 08:00-24:00(忙时)
怎么降低OBS公网流出流量费用?
https://bbs.huaweicloud.com/blogs/110373
看下OBS公网流出流量的定价:00:00-08:00(闲时):0.25元/GB;08:00-24:00(忙时):0.5元/GB,可以看到0点到8点的价格是平时的一半,利用这个时间段进行数据下载,可以大大减少流量费用。
简要说明:分发模式下创建发送任务
适用节点类型:sender
业务端简要处理流程:
a. 先生成种子到/data/dcp目录下,然后按照业务需求写入/data/sender/tmp/cfec-001-name.task.json, 调用api
b. 业务端发现/data/uploaded/ 目录下的 task.json,说明obs,cdn上传完成,bt已经启动,就可以将task.json分发给各个需要接收的业务端。
(也可以提供接口,服务端上传完成后调用业务端)
条件判断分支:
如果uploaded及之后的状态, bt做种服务中,reactive:false , 不发送,返回 send failed, 因为有同名bt任务,所以发送失败。
如果uploaded及之后的状态, bt没有做种服务中,说明已经过了seedtime7天时间,是真正完成了约定的服务, 参数reactive:false 返回 send succeed, 可以开始同名任务发送。
如果uploaded状态及之后的状态,无论bt是否做种服务中, 只要参数reactive:true 都一律 有则杀,无则重新send. 其他条件满足的情况下,send succeed.
服务接口处理流程:
本接口服务程序会将其json文件移动到目录/data/sender/queues 作为队列的一个任务,后台监控会按照顺序处理并启动任务。依次处理移动到uploading,uploaded,history. 其中上传完成移动到uploaded目录后按业务端情况什么也不做或者主动调用业务端。
参数:
taskfile: 任务策略文件, 复制一份到 /data/sender/tmp/ 下吧, 然后把/data/sender/tmp/cfec-001-uuid.task.json 作为api调用时的路径.
reactive: 是否重启同名p2p的对外服务进程,默认true 停止同名bt任务重启, false不重启,
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "send",
"method_params": {
"taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
"reactive":"false",
}
}
返回:
{
"request_message_id": "12345",
"method_name": "send",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeeded!"
}
}
或者:
{
"request_message_id": "12345",
"method_name": "send",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"restarted same name bt process, succeed!"
}
}
异常:
1.没找到文件:
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"open json file error:open /data/sender/tmp/cfec-001-xiaofang.task.json: no such file or directory"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"invalid json format:/data/sender/tmp/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"copy taskfile: /tmp/cfec-001-xiaofang.task.json error."}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"same taskfile in queues:/data/sender/queues/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"same taskfile in uploading:/data/sender/uploading/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"not found torrent:/data/dcp/cfec-001/dcps/xiaofang.torrent pls re generate task and torrent. "}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"restart bt serving failed: xxx.torrent in cfec-001-xiaofang.task.json "}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"exisited same name ct torrent bt process, send task failed: xxx.torrent in cfec-001-xiaofang.task.json "}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"send",
"return_status":"false",
"return_content":{"desc":"reactive parameter input error "}}
curl测试用例:
curl -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"send","method_params":{"taskfile":"/data/sender/tmp/cfec-001-xiaofang.task.json","reactive":"true"}} http://localhost:8191/send
{"reqest_message_id":"321","message_type":"response","method_name":"send","return_status":"false","return_content":{"desc":"open json file error:open /data/sender/tmp/cfec-001-xiaofang.task.json: no such file or directory"}}
http://localhost:8191/recv
简要说明:分发模式下的接收下载, 不同节点类型存储的dcp路径不同。参考前面知识中的表格
适用节点类型:sender, receiver, cacher
receiver:
json任务文件由业务调用端来完成分发,本接口不负责,只负责启动接收任务过程。
调用端将json任务文件的放到/data/receiver/tmp/, 然后调用接口。
或者为了实现自动化,先写入放到/data/receiver/tmp/目录下之后,直接移动到/data/receiver/queues即可,无需调用接口,即表示进入传输队列。
接收端将taskfile 移动到 /data/receiver/queues 队列,然后通过后台监控进行处理,开始下载流程。
下载完成的标志是 /data/dcp/ (storeplan A) 或者/data/dcp/cfec-001/dcps/ (storeplan B) 下出现dcpname.finished文件
sender:
存在/data/dcp/cfec-001/dcps/
cacher:
对于 cacher类型,不存在下载最后移动到存储目录,不存在下载进度的请求需求,只是根据任务所需的bt分配的数据边下载边对外做种,对外做种服务时间由发送端生成的任务确定,而且不支持免重复传输,只是在/data/transfer/bt目录下做种,一直到做种时间到期后结束,然后删除目录数据,清空。做种服务时间到期前可以reactive重新激活任务延期做种时间。做种时,任务文件一直处于downloading状态目录下,一直到做种时间结束形成结束标记移入downloaded状态。
参数:
taskfile: 任意路径下的json文件,接口会将其移动到 /data/receiver/tmp 下。
reactive: true/false, 表示如果系统中已经有同名任务正在在运行,是否重启下载。默认false. (用于cacher类型的延长服务时间, receiver不需要因为会中断下载,可以用cancel取消任务再下载)
如果已经有同名任务下载过了,默认重新下载,与reactive参数无关。
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "recv",
"method_params": {
"taskfile": "/data/receiver/tmp/cfec-001-uuid.task.json",
"reactive":"true"
}
}
返回:
{
"request_message_id": "12345",
"method_name": "recv",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeed!"
}
}
如果是cacher类型,重新激活
{
"request_message_id": "12345",
"method_name": "recv",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"reactive cacher bt seeding with taskfile:cfec-001-xiaofang.task.json"
}
}
或者重新下载一遍
{
"request_message_id": "12345",
"method_name": "recv",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"same name task downloaded, to download again."
}
}
或者 本地重复文件都存在,直接复制完成传输
{
"request_message_id": "12345",
"method_name": "recv",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"all localsamefiles existed copy and finished, succeed!"
}
}
或者 已经下载过,本地重复文件都存在,直接复制完成传输
{
"request_message_id": "12345",
"method_name": "recv",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"same name task downloaded, all localsamefiles existed copy and finished, succeed!"
}
}
异常:
1.没找到文件:
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"open json file error:open /data/receiver/tmp/cfec-001-xiaofang.task.json: no such file or directory"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"invalid json format:/data/receiver/tmp/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"total files size equal 0 :/data/receiver/tmp/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"same taskfile in queues:/data/receiver/queues/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"same taskfile in downloading:/data/receiver/downloading/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"same taskfile in downloaded:/data/receiver/downloaded/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"move json file to /data/receiver/tmp erro"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"totalsize != all lists2 sum + localsamesize : /data/receiver/tmp/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"totalsize != all lists sum : /data/receiver/tmp/cfec-001-xiaofang.task.json"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"total files size equal 0"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"could not download torrent from http://47.92.93.51/dcp/cfec-001/dcps/xiaofang.torrent"}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"need tmptorrent and found bt.tmpurl is empty."}}
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"could not download tmptorrent from http://47.92.93.51/dcp/cfec-001/dcps-tmp/xiaofang-tmp.torrent"}}
12。 任务文件中的文件列表与下载地址中的种子文件列表不同(说明是cdn刷新问题,下载了旧的种子,需要登录控制台刷新cdn中的torrent文件;或者是任务文件生成错误导致种子文件列表与实际的btlist文件列表不同,例如同样目录没删除旧的过时种子,需要将deloldtorrent设为true)
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"recv",
"return_status":"false",
"return_content":{"desc":"taskfile btlist is not equal torrent content, check taskfile or tmp torrent: http://47.92.93.51/dcp/cfec-001/dcps-tmp/xiaofang-tmp.torrent"}}
curl测试用例:
cacher类型:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"recv","method_params":{"taskfile":"/data/receiver/tmp/cfec-001-xiaofang.task.json","reactive":"true"}} http://localhost:8191/recv
{"reqest_message_id":"321","message_type":"response","method_name":"recv","return_status":"true","return_content":{"desc":"reactive cacher bt seeding with taskfile:cfec-001-xiaofang.task.json"}}
receiver类型:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"recv","method_params":{"taskfile":"/data/receiver/tmp/cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json","reactive":"false"}} http://localhost:8191/recv
{"reqest_message_id":"321","message_type":"response","method_name":"recv","return_status":"true","return_content":{"desc":"succeed!"}}
http://localhost:8191/uploadprogress
简要说明:中心发送端的上传
适用类型:sender
因为有3种方式对外提供服务,bt,obs,cdn.
bt: 只要启动服务即表示已经完成,在做种服务时间内始终都在对外服务提供上传
obs: 将本地的目录文件上传到obs桶中,这期间有个上传的百分比的数字,需要查询obs桶中的文件大小,然后再除以总大小即可。
(本地中心,需要上传, config.json里面 "machinetype": "local", datasource: local 时需要上传; 不过此版本需求里不需要支持obs; 华为云主机中心,mount obsfs, 就在本机目录上,无需上传.)
cdn: 因为本机中心有web网址,是华为的ip,而目录文件就在www的链接下,所以一开始就已经完成了。 cdn回源的过程则是云服务商cdn群的问题,发生在第一次访问时,与本机无关,对下载客户端而言也是透明的,所以只需要检查下www是否可访问即可。 (curl -L http://xxx/dcp , -L 是跟随链接)
参数: taskfile, 注意,这里的taskfile没有全路径
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "uploadprogress",
"method_params": {
"taskfile": "cfec-001-xiaofang.task.json",
}
}
返回:
可用状态
返回状态:
status: queues 队列中, uploading 上传中,uploaded 上传完, ready 准备就绪, finished 结束, error 错误
ready: 表示所有方式的状态都可用,准备就绪,可以对外提供下载。(对应btstatus: seeding, obs:completed, cdn:available)
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"uploadprogress",
"return_status":"true",
"return_content":{
"taskfile":"/data/sender/uploaded/cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json",
"status":"ready",
"desc":"",
"btstatus":"seeding",
"obsstatus":"completed",
"cdnstatus":"available"}}
或者上传中
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"message_status": "true",
"method_name": "uploadprogress",
"return_content": {
"taskfile": "/data/sender/uploaded/cfec-001-xiaofang.task.json"
"status": "uploading "
"desc": ""
"btstatus": "seeding"
"obsstatus": "uncompleted 66%"
"cdnstatus": "available"
}
}
所有的状态都可用时(),status才返回ready成功。
cdn失败时,重试cdn3次,任务算失败, (task文件如何处理?放到failed目录)
或者重新启动整个任务?
说明:
status: queues 队列中, uploading 上传中,uploaded 上传完, ready 准备就绪, finished 结束, error 错误
ready: 表示所有方式的状态都可用,准备就绪,可以对外提供下载。(对应btstatus: seeding, obs:completed, cdn:available)
finished:表示结束服务, 尤其是p2p做种服务时间结束. (根据分配的方法,对应btstatus:noseeding, 其他状态任意)
error时 则 desc会给出 bt errors 或者 bt obs errors提示。
可以到/data/sender/uploading/目录下查看相应 .bterr文件内的详细提示。
其中uploaded 相对于 uploading而言, 当存在上传过程的方法时,会出现这个状态,只是针对某单个方法。这里是obs需要上传的情况。 唯一判断可以对外提供下载服务的标准是ready.
btstatus: "seeding 做种服务中","noseeding 没有做种服务中".
(当正在上传,上传完成,历史任务时的三种taskfile的情况下,判断同名进程是否存在,存在,则是做种服务中。不存在,则是服务已结束
)
obsstatus: "uncompleted x% 数据不完整","completed 数据完整"
(local,local时,obs上的大小小于实际总大小显示uploading,等于显示uploaded; 不需要上传的情况下,直接判断大小是否符合实际总大小 )
cdnstatus: "available 可对外服务","unavailable 服务不可用"
(当正在上传,上传完成,历史任务时的三种taskfile的情况下,判断cdn url 是否可以访问,可访问,则是可对外服务,否则是不可用服务)
异常:
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"message_status": "false",
"method_name": "uploadprogress",
"return_content":{
"taskfile":"",
"status":"unknown",
"desc":"",
"btstatus":"unknown",
"obsstatus":"completed",
"cdnstatus":"unknown"
}
}
curl测试用例:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"uploadprogress","method_params":{"taskfile":"cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json"}} http://localhost:8191/uploadprogress
{"reqest_message_id":"321","message_type":"response","method_name":"uploadprogress","return_status":"true","return_content":{"taskfile":"/data/sender/uploaded/cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json","status":"ready","desc":"","btstatus":"seeding","obsstatus":"completed","cdnstatus":"available"}}
http://localhost:8191/progress
简要说明:下载端的下载进度
适用类型:sender, receiver,cacher
下载完, 对 tms, receiver 直接将 dcp 移动到 A: /data/dcp 下,或者B: /data/dcp/cfec-001/dcps下; 发送节点 移动 到 /data/dcp/cfec-001/dcps/
根据文件名到各个目录检索,看处于什么阶段。如果是正在下载,计算和查一下进度、速度。
参数:不带路径,而仅仅是任务文件名
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "progress",
"method_params": {
"taskfile": "cfec-001-file99M.task.json",
}
}
返回:
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "progress",
"return_content": {
"status": "downloading”,
"taskfile":"/data/receiver/downloading/cfec-001-xiaofang.task.json",
"dcppath":"/data/dcp/xiaofang"
"btstatus":"btseeding",
"downerror":"",
"downloaded": "12345",
"rate": "10 KB/s",
"totalpercent": "66%",
"btrate": "3 KB/s",
"btpercent": "22%",
"obsrate": "5 KB/s",
"obspercent": "23%",
"cdnrate":"2 KB/s",
"cdnpercent": "21%",
"ecompletedtime": 1111,
"bt2downpercent":"99.084%",
"obs2downpercent":"0.000%",
"cdn2downpercent":"0.916%",
"localsamepercent":"0.000%",
"totalbytes":"1234567890"
}
}
status: "queues 任务队列中","downloading 正在下载","downloaderror 下载错误","downloaded 下载完成","history 历史任务","unknown 未知任务" ,
taskfullpath: 任务文件全路径,会随时变,最终稳定在downloaded,history目录里
dcppath: 当status == downloaded时, dcppath给出最终的存储目录,否则返回""
btstatus: btseeding 做种服务中 / nobtseeding 没有做种 , 可以在downloaded之后判断是否还在做种对外服务。下载完后才能进入做种seeding状态。
downerr: 下载时错误,字符串提示,如"bt download error", 当status==downloaderror时出现.否则为空.
downloaded:总下载大小bytes
rate: 总下载速率
ecompletedtime: 预估完成时间, 单位为分钟,-1表示未知。
"bt2downpercent":"99.084%": 表示bt需要下载的数据所占百分比
"obs2downpercent":"0.000%",表示obs需要下载的数据所占百分比
"cdn2downpercent":"0.916%",表示cdn需要下载的数据所占百分比
"localsamepercent":"0.000%"表示本地已有重复数据所占百分比
rate: B/s K/s M/s
当<=9999Byte 时, 单位为 B
当>9999Byte 时, 单位为 K
当>9999*1024Byte (9999K)时,单位为M
下载完成
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"progress",
"return_status":"true",
"return_content":{
"Status":"downloaded",
"taskfile":"/data/receiver/downloading/cfec-001-xiaofang.task.json",
"dcppath":"/data/dcp/xiaofang"
"Downloaded":"53756747598",
"Rate":"",
"TotalPercent":"100.000%",
"btrate":"",
"BtPercent":"",
"obsrate":"",
"obspercent":"",
"cdnrate":"",
"cdnpercent":"",
"totalbytes":"1234567890"}
}
异常:
1. 未发现任务文件
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"progress",
"return_status":"false",
"return_content":{"desc":"unknown task, not found task."}}
2.任务文件打开错误:
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"progress",
"return_status":"false",
"return_content":{"desc":"open dir error:open /data/sender/tmp/cfec-001-xiaofang.task.json : no such file or directory"}}
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"progress",
"return_status":"false",
"return_content":{"desc":"do not support cacher type progress, change method_name to cprogress"}}
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"progress",
"return_status":"false",
"return_content":{"desc":"task in queues, no progress now."}}
curl测试用例:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"progress","method_params":{"taskfile":"cfec-001-xiaofang.task.json"}} http://localhost:8191/progress
{"reqest_message_id":"321","message_type":"response","method_name":"progress","return_status":"true","return_content":{"status":"downloaded","taskfullpath":"/data/receiver/downloaded/cfec-001-xiaofang.task.json","dcppath":"/data/dcp/xiaofang","btstatus":"noseeding","downerror":"","downloaded":668521627,"rate":"","totoalpercent":"100.000%","btrate":"","btpercent":"0.000%","obsrate":"","obspercent":"0.000%","cdnrate":"","cdnpercent":"0.000%","ecompletedtime":0,"bt2downpercent":"0.000%","obs2downpercent":"0.000%","cdn2downpercent":"0.000%","localsamepercent":"100.000%"}}
对于 cacher类型,不存在下载,不存在下载进度的请求需求,只是对外做种服务与否:
不存储,做种服务过程中的下载和对外服务,都位于 /data/transfer/bt/cfec-001 目录下.
将 method_name 换成 cprogress即可
查询进度:
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "cprogress",
"method_params": {
"taskfile": "cfec-001-file99M.task.json",
}
}
返回
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"cprogress",
"return_status":"true",
"return_content":{
"Status":"seeding",
"desc":"btseeding dir:/data/transfer/bt/cfec-001/xiaofang4-tmp"}}
正在做种:seeding
没有做种:noseeding
如果有错误,则为"seeding error" 或"noseeding error"
curl测试用例:
curl -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"cprogress","method_params":{"taskfile":"cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json"}} http://localhost:8191/progress
{"reqest_message_id":"321","message_type":"response","method_name":"cprogress","return_status":"true","return_content":{"status":"seeding","desc":"btseeding dir:/data/transfer/bt/cfec-001/changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV-tmp"}}
简要说明:根据参数生成分发模式下发送任务的json文件
重复执行会删除之前旧有的所有文件包括json, torrent ,tmp.torrent。
适用类型: sender
业务端简要处理流程:
a. 按照业务需求选择好要发送的dcp目录。例如/data/dcp/xiaofang
选择输出的json路径 写入/data/sender/tmp/xiaofang.task.json, json文件名的格式通常取'目录名.task.json' (可以定期检查文件来判断是否生成) , 如果没有相应种子,则会自动生成种子,但是需要等待其种子生成完成。(例如检查父目录下的文件名/data/dcp/xiaofang.torrent)
b. 参数默认按照/etc/bft/config.json的配置来。 一些影响传输的关键参数有: bt-obs-cdn 选择方法和传输数据的比例
policy 全时间传输还是避开忙时传输
服务接口处理流程:
1. 查询config, 输出task.json的相关参数
2. 解析目录, 遍历下面所有文件
3. 查询hashtable, 获得带哈希的文件列表
4. 写入 task.json文件中
参数说明:
"dcppath": # 必填,要发送的dcp路径, 目录后面不能跟"/"
"taskfile": # 必填,指定json策略文件保存路径和名称,按照cfec-001-dcpname.task.json的格式, 已经存在的话会先删除再写新文件。
"basesubdir": # 必填,例如"cfec-001", 云标识-机构id组成
"btobscdn": # 必填,选择哪些方法,例如1:1:1 或1:0:0
"policy": # 必填,全时段传输还是按照配置中的闲时端传输fulltime 或 priortime
"tracker": # tracker
"seedtime": # 发送任务时的做种时长
"datasource":# 华为云节点时用不到此参数。不是华为云中心节点,是本地中心节点时,用到此参数, obs表示原始数据源在obs桶上,发送时需要下载到本地; local表示发送端本机存储模式,发送时需要将数据从本地传到obs;不提供时从配置中读取
"obsurl":"obs://cfec-001/dcps/xiaofang", # 桶的地址url,拼接出: obs://中心标识-机构id/dcps/dcp目录名, 如果为空,则程序自己拼接出来。
"ak":"" # obs桶的参数,为空时采用配置默认,每个桶可能一样也可能不一样
"sk":"" # obs桶的参数,为空时采用配置默认,每个桶可能一样也可能不一样
"endpoint":"" # 必填,obs桶的参数,为空时采用配置默认,一个桶对应一个endpoint,安装时从华为云网页上可获取.
"deloldtorrent":"false" # 默认false, 生成种子和策略文件前,要不要删除之前存在的旧的。(不删除可以节省时间,但是个别情况下,种子文件有损坏,或者与目录内容不一致时需要删除,再生成)
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "gentask",
"method_params": {
"dcppath": "/data/dcp/cfec-001/xiaofang",
"taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
"basesubdir":"cfec-001",
"btobscdn": "1:1:1",
"policy": "fulltime",
"tracker":"http://bttracker.top:6969/announce",
"seedtime":"72",
"datasource":"obs",
"obsurl":"obs://cfec-001/dcps/xiaofang",
"ak":"",
"sk":"",
"endpoint":"",
}
}
返回:
{
"request_message_id": "12345",
"method_name": "gentask",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeeded!"
}
}
{
"request_message_id": "12345",
"method_name": "gentask",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"please wait until /data/dcp/cfec-001/dcps/xiaofang.torrent, /data/dcp/cfec-001/dcps-tmp/xiaofang-tmp.torrent and /data/sender/tmp/cfec-001-xiaofang.task.json all are finished."
}
}
异常:
1. taskfile为空
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"gentask",
"return_status":"false",
"return_content":{"desc":""error, please provide taskfile path."}}
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"gentask",
"return_status":"false",
"return_content":{"desc":""error, not exist dcp path: /data/dcp/cfec-001/dcps/xiaofang-nonexists."}}
3.系统中已经存在同名做种进程:
{
"reqest_message_id":"321",
"message_type":"response",
"method_name":"gentask",
"return_status":"false",
"return_content":{"desc":"same torrent process is generating:/data/dcp/cfec-001/dcps/xiaofang.torrent "}}
curl测试用例:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"gentask","method_params":{"dcppath":"/data/dcp/cfec-001/dcps/xiaofang", "taskfile":"/data/sender/tmp/cfec-001-xiaofang.task.json","basesubdir":"cfec-001","btobscdn":"1:1:1","policy":"fulltime","tracker":"http://bttracker.top:6969/announce","seedtime":"168","datasource":"local","obsurl":"obs://cfec-001/dcps/xiaofang" }} http://localhost:8191/gentask
{"reqest_message_id":"321","message_type":"response","method_name":"gentask","return_status":"true","return_content":{"desc":"please wait until /data/dcp/cfec-001/dcps/xiaofang.torrent, /data/dcp/cfec-001/dcps-tmp/xiaofang-tmp.torrent and /data/sender/tmp/cfec-001-xiaofang.task.json all are finished."}}
http://localhost:8191/taskfilesquery
简要说明:根据目录名到各个目录检索,看任务策略文件和种子是否生成完成。
适用类型: sender
参数:
dcp路径,
任务策略文件路径和名称
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "taskfilesquery",
"method_params": {
"dcppath": "/data/dcp/cfec-001/xiaofang",
"taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json"
}
}
返回:
返回说明:status: finished, unfinished, error.
1. 成功
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "taskfilesquery",
"return_status": "true",
"method_params": {
"status": "finished”,
"desc":"succeed!"
}
}
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "taskfilesquery",
"return_status": "true",
"method_params": {
"status": "unfinished”,
"desc":"process making seed "
}
}
其他返回的描述:
desc:"no make seed process and not found task.json."
desc:" please wait until dcppath.torrent and taskfile all are finished."
...
异常:
1. 目录不存在
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "taskfilesquery",
"return_status": "false",
"method_params": {
"status": "error”,
"desc":"not exist /data/dcp/cfec-001/dcps/xiaofang "
}
}
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "taskfilesquery",
"return_status": "false",
"method_params": {
"status": "error”,
"desc":"open json file error: /data/receiver/bt/cfec-001/cfec-001-xiaofang.task.json "
}
}
curl测试用例:
curl -s -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"taskfilesquery","method_params":{"dcppath":"/data/dcp/cfec-001/dcps/xiaofang", "taskfile":"/data/sender/tmp/cfec-001-xiaofang.task.json" }} http://localhost:8191/taskfilesquery
{"reqest_message_id":"321","message_type":"response","method_name":"taskfilesquery","return_status":"true","return_content":{"status":"unfinished","desc":"no make seed process and not found task.json."}}
http://localhost:8191/cancel
简要说明:
停止上传或下载进程。(需要考虑忙时,闲时的情况)
默认要么是上传中,要么是下载中,只有一种情况,不存在两者同时。优先取消下载。
下载时: 先找出taskfile的路径,然后读取参数,分别杀死bt,obs,cdn的下载进程。清理队列,删除错误文件。
上传时: 先找出taskfile的路径,然后读取参数,杀死bt进程,清理队列,删除错误文件。
适用类型:sender, receiver
参数:
taskfile: 任务策略文件名, 不带路径
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "cancel",
"method_params": {
"taskfile": "cfec-001-xiaofang.task.json",
}
}
返回:
{
"request_message_id": "12345",
"method_name": "cancel",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeeded!"
}
}
不存在同名任务的情况:
{
"request_message_id": "12345",
"method_name": "cancel",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"no need to cancel, not found task: xxx.task.json"
}
}
curl测试用例
curl -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"cancel","method_params":{"taskfile":"cfec-001-xiaofang.task.json"}} http://localhost:8191/cancel
{"reqest_message_id":"321","message_type":"response","method_name":"cancel","return_status":"true","return_content":{"desc":"succeed!"}}
curl -H Content-Type: application/json -X POST --data {"message_id":"321","message_type":"request","message_source":"tms","method_name":"cancel","method_params":{"taskfile":"cfec-001-xiaoang.task.json"}} http://localhost:8191/cancel
{"reqest_message_id":"321",
"message_type":"response",
"method_name":"cancel",
"return_status":"true",
"return_content":{"desc":"no need to cancel, not found task: cfec-001-xiaoang.task.json"}}
分发模式下创建发送任务
业务端简要处理流程:
a. 按照业务需求和预先配置参数写入/data/sender/tmp/name.task.json, 生成同名目录下的种子文件, 调用api
b. 业务端发现/data/uploaded/ 目录下的 task.json,说明obs,cdn上传完成,bt已经启动,就可以将task.json分发给各个需要接收的业务端。
(也可以提供接口,服务端上传完成后调用业务端)
服务接口处理流程:
本接口服务程序会将其json文件移动到目录/data/sender/queues 作为队列的一个任务,后台监控会按照顺序处理并启动任务。依次处理移动到uploading,uploaded,history. 其中上传完成移动到uploaded目录后按业务端情况什么也不做或者主动调用业务端。
参数说明:
"dcppath": # 要发送的dcp路径
"taskfile": # json任务策略文件路径
"btobscdn": # 选择哪些方法bt:obs:cdn所各自占的数据比例
"policy": # 全时段传输fulltime还是按照配置中的闲时端传输priortime
"tracker": # tracker
"seedtime": # 发送任务时的做种时长
"data":"obs", # obs表示原始数据源在obs桶上,发送时需要下载到本地; local表示发送端本机存储模式,发送时需要将数据从本地传到obs;
"obsurl":"obs://cfec-001/dcps/xiaofang", # 桶的地址url
"ak":"" # obs桶的参数,为空时采用配置默认
"sk":"" # obs桶的参数,为空时采用配置默认
"endpoint":"" # obs桶的参数,为空时采用配置默认
{
"message_id": "12345",
"message_type": "request",
"message_source": "tms",
"method_name": "sends",
"method_params": {
"dcppath": "/data/dcp/cfec-001/xiaofang",
"taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
"btobscdn": "1:1:1",
"policy": "fulltime",
"datasource":"obs",
"obsurl":"obs://cfec-001/dcps/xiaofang",
"tracker":"http://bttracker.top:6969/announce",
"seedtime":"72",
}
}
todo:
a. 去掉 taskfile, return taskfile path
b. 增加查询上传任务是否完成的接口 ( 生成种子,生成task.json, 启动p2p ,obs, cdn )
返回:
1. 成功
{
"request_message_id": "12345",
"method_name": "sends",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeeded!"
}
}
{
"request_message_id": "12345",
"method_name": "sends",
"message_type": "response",
"return_status": "true",
"return_content": {
"desc":"succeed, but the torrent is generating, please wait until /data/dcp/cfec-001/xiaofang.torrent is finished."
}
}
"return_status": "false",
"return_content": {
"desc":"same task in queues:/data/sender/queues/cfec-001-xiaofang.task.json"
}
"return_status": "false",
"return_content": {
"desc":"same task in uploading:/data/sender/uploading/cfec-001-xiaofang.task.json"
}
暂定安装时手工编辑config.json
采用按照方法来看调度,以及按照任务为维度来看调度。
curl http://localhost:8191/showschedules
显示示例:
Now: 2021-05-28 22:33:57
Scheduls by Methods:
bt schedules
bt next runtime: no schedule
cdn schedules
cfec-001-xiaofang7 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
cfec-001-xiaofang9 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
cdn next runtime:2021-05-28 22:34:00
obs schedules
cfec-001-xiaofang7 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
obs next runtime:2021-05-28 22:34:00
Schedules by TaskNames:
cfec-001-xiaofang7
bt priortime: none
cdn priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
obs priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
cfec-001-xiaofang9
bt priortime: none
cdn priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
obs priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
All Current Downloading:
cfec-001-xiaofang7 bt:obs:cdn = 0:1:1 priortime obs: 0 22:34-22:37 cdn: 0 22:34-22:37
cfec-001-xiaofang9 bt:obs:cdn = 0:0:1 priortime cdn: 0 22:34-22:37
修改配置文件/etc/bft2/config.json 后需要执行,配置出错会提示
curl http://localhost:8191/reloadconf
"reload config.json ok."
curl http://localhost:8191/heartbeat
"2021-05-28 22:32:26 is living."
curl http://localhost:8191/version
2.001
仅对 receiver类型有效。
正在下载中的任务,如果突然断电,开机后会自动恢复。查看日志可以看到:
2021/05/30 11:29:41 monitor.go:335: start downloading taskfiles: xxx,yyy
a. tms终端原有dcp存储管理:
/data/dcp
保持不变,排队下载
b. 中心节点,发送端:
目前需要要支持多个dcp存储目录, 本地目录mount obsfs, 每个机构建一个目录, 存储方案选择:
/data/dcp/cfec-001/ 这样的形式,(子目录: 用户上传到 upload, 完整预处理后到 dcps ) 需要把所有的桶都挂载到相应的目录
根据中心标识-机构id/用户组群id 来区分不同的存储 (华为obs只支持中划线)
其中因为obsfs并行文件系统挂载的失败率问题,需要中心节点位于华为云机房内,与obs网络距离近
因为是obsfs, 同样: obs://cfec-001/dcps 存储最终dcp目录
dcp预处理程序每处理完一个dcps/下的dcp目录,那么就调用
/root/soft2/inithashtable.sh /data/dcp/cfec-001/dcps/xiaofang
c. 边缘节点:
同发送端, 所有接收下来的dcps最终存储在 /data/dcp/cfec-001/dcps/ 目录下
bftv2.0的文件监控系统inotify monitor针对dcp存储库进行实时的增删改的哈希计算并存储到/etc/bft2/hashtables.txt 里,
因为发送端分2种类型,1种是本地部署,本地存储,有obs时进行上传到远端的obs桶上。 文件实时监控系统可以自己发现进入存储目录的所有目录文件主动哈希计算。
还有1种是华为云ecs, /data/dcp/cfec-001 下是直接挂 obsfs obs://cfec-001 对应一个中心的一个机构
对于后面这种并行文件系统的obsfs,需要预处理程序进行主动调用hash生成。
inofity 不支持 并行文件系统 obsfs的监控
而obsfs通常都位于中心发送端节点,
如果要对中心发送节点的存储进行每个目录的哈希计算,那么需要另外一套计算方法。
为了不影响功能,tms的拆分dcp的功能需要确保:
中心节点发送端:确保/data/dcp/cfec-001/dcps/ (mount obs://cfec-001/dcps) 下出现的是拆分好的无需改动的最终目录
边缘节点: 确保 /data/dcp/cfec-001/ 下都是无需改动的最终目录
终端tms节点: 确保 /data/dcp/ 下都是完整无需改动的最终存储目录
如果 /etc/bft2/config.json 中
"machinetype":"hwecs",
那么就是obsfs挂载的系统,这种情况下,每在其/data/dcp/cfec-001/dcps/下增加了一个dcp目录,那么就需要主动调用接口或者脚本,来生成哈希文件。
例如完成 /data/dcp/cfec-001/dcps/xiaofang
那么,需要主动调用
/root/soft2/addhashtable.sh /data/dcp3/cfec-001/dcps/xiaofang
调用完需要等一段时间,计算完哈希后,系统的免重复功能才可用。不用免重复功能的话无所谓。
/etc/bft2/config.json 中
"machinetype":"local"时无需主动
1个桶对应一个 endpoint
所以每一个 中心和结构 都要有自己的endpoint的记录
一个或多个中心可以有相同的ak,sk, endpoint, 下面的每个机构都有一个id
每建立一个机构id,就建一个桶,并将桶挂载到 中心节点的/data/dcp/cfec-001这样的目录。
子目录的名称规则: 中心标识-机构id 例如: /data/dcp/cfec-001
桶的名称规则: 中心标识-机构id 例如: obs://cfec-001
中心标识:全部由英文字母组成,不超过5位
机构id:全数字组成,不超过4位
机构用户上传时,只传到 obs://cfec-001/upload目录,对其他目录没有写,删和修改权限,只有读的权限。
obs://cfec-001/dcps/ 目录存储所有经过拆分等业务处理的dcp,目录名以uuid命名
如果没有upload,dcps的子目录,需要在配置obs时建立。
一个中心对应一个 cdn域名,与桶无关。
dcp包 由机构用户上传,一个机构建议一个或几个用户有上传权限。 dcp包也可能来自硬盘复制。
理论上,如果没有采用同一区域, 每个 桶都可能会有一个 endpoint, ak, sk , 所以安装完一个中心,发运平台和系统管理员之间进行记录和传递这些参数
配置文件中的是默认值,用于简单的测试。每个桶可能不一样,桶的个数也不确定,信息可以写入数据库,也可以在安装后,有个单独文件 确认。 文件的行格式:桶名wuxi-001 ak sk endpoint
config.json 中大部分是 不经常变的参数,是安装时一次定下来的。 而桶不是,是每增加一个机构,都需要添加的信息。
为了实现 用户可以随时随地 通过 obs browser 来上传dcp, 而华为云不能支持子目录授权, 只能一个桶一个机构。 而产品需求是 要权限管理,华为云没别的途经实现, 所以只能牺牲 系统安装和开发的便捷性了。
华为云的 obs 的管理和实现机制就是这样,没办法。
一个云下面的机构不能随便自动添加,添加时需要系统管理员的参与和配置。
平台每增加一个机构时
1. 系统管理员按照 obsfs 并行文件系统配置规范 进行添加桶和权限等配置
2. 写入和发运平台接口约定好的配置文件,或者通过web页面写入桶的配置到平台数据库中(格式:桶名wuxi-001 ak sk endpoint)
系统的/data目录最好和系统盘分开,由一块大硬盘构成。
并且 /data 目录是一整个分区,包括下面的子目录,不是多个分区和文件系统。
使用ubuntu 16.04 版本
apt install -y apache2
cd /var/www/html/
ln -s /data/dcp dcp
vi /etc/bft2/config.json
1 中心 对应---> 1 cdn域名 --> n 机构 ---> n obs桶
设置域名, 安装中心节点时, 需要手工配置这些项, 涉及到 cdnurl, senddomain.
例如:
103.190.190.176 是源站,配置的cdn域名为huaweicontrol.365noc.com, 写入config.json 规定后面不能跟"/".
"senderdomain": "http://huaweicontrol.365noc.com",
"obsurl": "obs://cfec-001", #可以设置一个默认的中心标识-机构id
"cdnurl": "http://huaweicontrol.365noc.com",
其中CDN的配置中,.torrent文件类型的刷新失效时间设为3分钟
其他文件类型可以设置为默认1个月
如果华为云的 obs, cdn,或者边缘云主机的 闲时时段发生了变化,也需要更新,
目前默认值如下:
"bttime": "00:00-23:59",
"obstime": "00:00-08:00",
"cdntime": "08:00-18:00",
vi /etc/bft2/config.json
"senderid": "cfec", #设置中心标识, 例如改为wuxi
本地存储类型的发送中心,设置
"machinetype":"local",
云上的挂载obsfs并行文件系统的华为ecs主机发送中心,设置
"machinetype":"hwecs",
本地存储类型的发送中心,如果要上传的数据经常来自本地硬盘存储,设置:
"datasource":"local",
如果经常来自用户上传的obs桶,那么设置:
"datasource":"obs",
片库在本地存储, 最终存储目录是/data/dcp/cfec-001/dcps
每建立一个中心的机构,就建立一个如中心标识-机构id这样的cfec-001的目录
ecs主机的选择,需要确保 主机与obs桶之间网速很快,读取文件时速度很快,否则会极大影响生成任务文件的时间, 发送做种等时间。
片库在并行文件系统,挂载与obs, 挂载目录是 /data/dcp/cfec-001
每建立一个中心的机构,就建立一个cfec-001的目录
在华为云控制台,设立新桶,桶名如规范,记录 ak,sk, endpoint, 其中一个endpoint对应一个桶。 设置dcps,upload子目录权限。
然后将obs桶挂载到本机目录下。
https://support.huaweicloud.com/fstg-obs/obs_12_0004.html
wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsfs/current/obsfs_Ubuntu16.04_amd64.tar.gz
tar -zxvf obsfs_Ubuntu16.04_amd64.tar.gz
cd obsfs_Ubuntu16.04_amd64
bash install_obsfs.sh
apt-get install -y libfuse-dev libcurl4-openssl-dev
./obsfs --version
https://support.huaweicloud.com/fstg-obs/obs_12_0006.html
已获取访问密钥(AK和SK)
echo AQGKZ0KGJTSMQRWCWXJG:FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0 > /etc/passwd-obsfs
cat /etc/passwd-obsfs
chmod 600 /etc/passwd-obsfs
https://support.huaweicloud.com/fstg-obs/obs_12_0008.html
mkdir /data/dcp/cfec-001
mkdir /data/dcp/cfec-002
mkdir /data/dcp/cfgdc-001
vi /home/startobsfs.sh
obsfs cfec-001 /data/dcp/cfec-001 -o url=obs.ap-southeast-1.myhuaweicloud.com -o passwd_file=/etc/passwd-obsfs -o max_write=131072 -o allow_other -o use_ino
obsfs cfec-002 /data/dcp/cfec-002 -o url=obs.cn-east-3.myhuaweicloud.com -o passwd_file=/etc/passwd-obsfs -o max_write=131072 -o allow_other -o use_ino
obsfs cfgdc-001 /data/dcp/cfgdc-001 -o url=obs.cn-south-1.myhuaweicloud.com -o passwd_file=/etc/passwd-obsfs -o max_write=131072 -o allow_other -o use_ino
chmod +x /home/startobsfs.sh
echo "bash /home/startobsfs.sh" >> /etc/rc.local
/home/startobsfs.sh
df -h
显示:
obsfs 256T 0 256T 0% /data/dcp/cfec-001
obsfs 256T 0 256T 0% /data/dcp/cfec-002
obsfs 256T 0 256T 0% /data/dcp/cfgdc-001
tracker 服务器不必安装新的,统一用原来的 bttracker.top 就可以,以下步骤略过。
如果对于某些私有云一定要求有自己的 tracker时,则可以新建一个,按照下面的步骤安装即可。
下载OpenTracker依赖库及源码,编译。
cvs -d :pserver:cvs@cvs.fefe.de:/cvs -z9 co libowfat
cd libowfat
make
cd ..
# LEGACY: cvs -d:pserver:anoncvs@cvs.erdgeist.org:/home/cvsroot co opentracker
git clone git://erdgeist.org/opentracker
cd opentracker
make
每次启动后自动运行,可以编辑 /etc/rc.local
加入
# only tracker need this line
nohup /root/soft/opentracker/opentracker -p 6969 -P 6969 >/dev/null &
注意:ctcs默认是几百k, 所以一定要设置。
为了方便使用,可以将域名指向此IP,例如域名是
bttracker.top, 指向 39.106.122.67
根据该中心的tracker进行配置
"tracker": "http://bttracker.top:6969/announce",
curl http://localhost:8191/reloadconf
obs ls 可以加上 ak,sk, endpoint参数例如:
obsutil ls obs://cfec-001/dcps/ -i=ak -k=sk -e=endpoint
curl -L http://huaweicontrol.365noc.com
ping 看ip有没有指向非本地中心的ip.
ping huaweiwuxi.365noc.com
ping: unknown host huaweiwuxi.365noc.com
域名解析出错,说明没有配置成功cdn域名
也可以通过 nslookup huaweicontrol.365noc.com 来判断是否存在华为cdn的域名。
例如:
nslookup huaweicontrol.365noc.com
Server: 202.106.0.20
Address: 202.106.0.20#53
Non-authoritative answer:
huaweicontrol.365noc.com canonical name = huaweicontrol.365noc.com.09ca91c8.c.cdnhwc1.com.
huaweicontrol.365noc.com.09ca91c8.c.cdnhwc1.com canonical name = hcdnd101.gslb.c.cdnhwc2.com.
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.217
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.216
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.222
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.215
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.221
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.218
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.220
Name: hcdnd101.gslb.c.cdnhwc2.com
Address: 124.202.167.219
如果发运管理平台上有相关参数配置,需要将其填写更新到页面上。
选择一台有域名,有空间的,而且三大运营商都可以访问到的公网ip主机。至少300G空间以上。
apt-get install apt-mirror
vim /etc/apt/mirror.list
deb-amd64 http://archive.ubuntu.com/ubuntu xenial main main/debian-installer main/installer-amd64 main/i18n main/source restricted restricted/debian-installer universe multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
deb-amd64 http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
deb-i386 http://archive.ubuntu.com/ubuntu xenial main main/debian-installer main/installer-i386 main/i18n main/source restricted restricted/debian-installer universe multiverse
deb-i386 http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
deb-i386 http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
deb-i386 http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
deb-i386 http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
执行apt-mirror得到镜像网站。
添加定时
50 3 * * * root /usr/bin/apt-mirror
增加软连接
ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu /var/www/html/ubuntu
chown www-data:www-data /var/www/html/ubuntu
通过修改客户端,测试此网站的镜像是否可用。
vim /etc/apt/sources.list
domain.com 替换成自己指定的主机域名
例如:
http://mirrors.huaweicloud.com/repository/ubuntu/
http://mirrors.aliyun.com/ubuntu/
###### Ubuntu Main Repos
deb http://domain.com/ubuntu/ xenial main restricted universe multiverse
###### Ubuntu Security Repos
deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
###### Ubuntu Update Repos
deb http://domain.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://domain.com/ubuntu/ xenial-backports main restricted universe multiverse
###### Ubuntu Main Repos
deb http://103.90.190.176/ubuntu/ xenial main restricted universe multiverse
###### Ubuntu Security Repos
deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
###### Ubuntu Update Repos
deb http://103.90.190.176/ubuntu/ xenial-updates main restricted universe multiverse
deb http://103.90.190.176/ubuntu/ xenial-backports main restricted universe multiverse
或者用sed 批量替换原来的域名
sed -i 's/old_domain/new_domain/g' /etc/apt/sources.list
修改替换完成后,执行下面命令测试
apt update
因为要用到 cpan网站安装一个模块。
为了避免国外网速太慢,造成安装速度慢,可以镜像到本地网站。如在华为云或者阿里云上。(不要只安装在某个网络如联通内,可能移动等网络访问不了)
建目录,链接到 www root
mkdir /data/CPAN -p
cd /data/CPAN
curl --connect-timeout 10 -L https://cpanmin.us > cpanminus
ln -s /data/CPAN /var/www/html/cpan
手工执行
rsync -av --delete ftp.funet.fi::CPAN /data/cpan/project/CPAN/
添加定时任务
* 20 * * * root /usr/bin/rsync -av --delete ftp.funet.fi::CPAN /data/CPAN/ >/dev/null 2>&1
修改完后, http://xxx/cpan 可以访问到后. xxx 指此网站域名。
通过
cpanm --mirror http://47.92.93.51/cpan/ -n --reinstall JSON
测试
显示:
--> Working on JSON
Fetching http://47.92.93.51/cpan/authors/id/I/IS/ISHIGAKI/JSON-4.03.tar.gz ... OK
Configuring JSON-4.03 ... OK
Building JSON-4.03 ... OK
Successfully reinstalled JSON-4.03
1 distribution installed
修改安装脚本vi install-ctorrent-ubuntu-16.04.sh
cpanmcmd="cpanm --mirror http://mirrors.163.com/cpan/ -n "
将地址改为自己网站的地址。
http://47.92.93.51/cpan/
另外,cpanminus 的下载安装也可以换成相应网站地址
curl --connect-timeout 10 -L http://47.92.93.51/bftv2/cpanminus | perl - --sudo App::cpanminus || apt install -y cpanminus
fi
curl http://localhost:8191/reloadconf 来重新载入配置,查看配置是否有错误.
curl http://localhost:8191/showschedules
查看当前的运行调度的时间任务,是否与你执行和期望的相同。
检查cdn刷新配置,确保发送端的.torrent文件,-tmp.torrent文件与接收端的文件内容一致, 也可以通过http://localhost:2780/页面来查看同名目录种子文件的内容的一致性
接收端执行autorecv.sh , 最后查看要发送的任务是否100%正确。
// 自动接收流程整合, scp 103.90.190.190 taskfile, recv, progress, checkdcp by ctorrent -c.
假设发送端是 103.90.190.176
# 接收端仅执行1次, 增加免密登录功能
ssh-keygen
ssh-copy-id root@103.90.190.176
# 发送端执行
./autosend.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV 1:1:1 fulltime cfec-001
# 接收端执行
autorecv.sh
./autorecv.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV cfec-001 true 103.90.190.176
现有接收端种子,ctorrent -c 发现
bt, obs, getduSizeprocess
du -s --block-size=1 /data/transfer/bt/wuxi-001/
du -s --block-size=1 /data/transfer/obs/wuxi-001/
cdn: DirSize
cd dir;
find . ! -type d -printf '%s\n' | paste -sd+ - | bc
/usr/tms/code/tms_server/tms.properties
##################
####BFT V2.0默认配置
##################
tms.server.bft.torrent.seedtime=168
tms.server.bftv2.torrent.deloldtorrent=1
tms.server.bftv2.datasource.wuxi-001=obs
tms.server.bftv2.obs.ak.wuxi-001=AQGKZ0KGJTSMQRWCWXJG
tms.server.bftv2.obs.sk.wuxi-001=FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0
tms.server.bftv2.obs.endpoint.wuxi-001=obs.cn-north-4.myhuaweicloud.com
tms.server.bftv2.btobscdn.wuxi-001=1:0:0
tms.server.bftv2.policy.wuxi-001=fulltime
curl http://huaweiwuxi.365noc.com/dcp/wuxi-001/dcps/8d9c0142-dfce-4bcd-bff9-54cbc20170b2/pkl_7005a21c-e09e-4875-8757-bc6f9dedb9f7.xml --create-dirs -o /da
ta/transfer/cdn/wuxi-001/8d9c0142-dfce-4bcd-bff9-54cbc20170b2/pkl_7005a21c-e09e-4875-8757-bc6f9dedb9f7.xml
6
其中的err exit 是6, 表示 resolve hostname error. 说明下载时域名无法解析。
一个可以执行脚本的测试工具,测试用例见所有.frank文件
https://github.com/txthinking/frank
/root/soft2/bftv2 输出日志到 /var/log/bft2/bftv2.log
需要即时查看日志时,先Kill bftv2run.sh 和 bftv2 然后执行
/root/soft2/bftv2 console 输出日志到终端屏幕
/root/soft2/test 下有所有相关脚本用于手工命令行测试。
cdn 下载会尝试多次,每次拉大时间间隔
curl --retry 999 --retry-max-time 0 http://huaweiwuxi.365noc.com/dcp/wuxi-001/dcps/8d9c0142-dfce-4bcd-bff9-54cbc20170b2/pcm_26e3295b-24c8-4d5a-bd4a-63783f17842c.mxf --create-dirs -o /data/transfer/cdn/wuxi-001/8d9c0142-dfce-4bcd-bff9-54cbc20170b2/pcm_26e3295b-24c8-4d5a-bd4a-63783f17842c.mxf
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0Warning: Transient problem: timeout Will retry in 1 seconds. 999 retries left.
0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 2 seconds. 998 retries left.
0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 4 seconds. 997 retries left.
0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0Warning: Transient problem: timeout Will retry in 8 seconds. 996 retries left.
0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 16 seconds. 995 retries
Warning: left.
100 4253k 100 4253k 0 0 389k 0 0:00:10 0:00:10 --:--:-- 963k
以下脚本都默认cfec-001为中心和机构标识,也可传参修改,修改中心标识脚本参数, 以联通中心为发送端,并从其uploaded/远程复制下载任务json
如果变更了中心发送节点,那么需要手工修改shell来替换中心地址为新的发送端地址。
第一次增加免密登录的话,执行
ssh-keygen
提问都取默认值回车即可。
然后将秘钥复制到发送端
ssh-copy-id root@121.36.106.24
提示输入密码,输入即可。
然后就可以使用如下脚本了,只是需要加上 121.36.106.24 的发送端ip的这个参数
找系统管理员,获取 endpoint, ak,sk等信息
写入/root/soft2/test下的 gentask.sh,autosend.sh 这2个脚本的相应行
elif [[ $basesubdir == "wuxi-001" ]];then
endpoint=obs.cn-north-4.myhuaweicloud.com
elif [[ $basesubdir == "wuxi-002" ]];then
endpoint=obs.cn-north-4.myhuaweicloud.com
fi
这样便于脚本自动设置桶的正确信息
不同obs桶的endpoint是不一样的,必须添加。
大部分情况下,ak,sk都一样,不用加,取默认值即可。
如果不同,则需要添加ak,sk信息,按照接口说明中提示添加到 gentask.sh 的脚本中。
autosend.sh
./autosend.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV 1:1:1 fulltime cfec-001
// 自动发送流程整合, gentask, taskfilesquery, send, uprogress
autorecv.sh
./autorecv.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV cfec-001 true 103.90.190.176
// 自动接收流程整合, scp 103.90.190.190 taskfile, recv, progress, checkdcp by ctorrent -c.
实例:
发送端执行(设置过中心端的ak,sk,endpoint等信息):
./autosend.sh xiaofang 1:1:1 fulltime wuxi-001
接收端执行(前提是已经设置过发送端的免密登录,见前面使用前准备一章):
./autorecv.sh xiaofang wuxi-001 true 121.36.106.24
gentask.sh name
gentask.sh name 1:1:1 fulltime cfec-001
//# 传入目录名,默认cfec-001, 根据配置config.json 和目录name, 以及默认的1:1:1, fulltime 生成默认配置文件 name.task.json 放到tasks目录下
query.sh name
query.sh name cfec-001
//# 查询任务策略文件是否生成ready.
send.sh name
send.sh name cfec-001 true
//# 传入目录名,默认cfec-001 ,再激活为true, 从transfer/tmp目录得到任务,然后启动上传
recv.sh name
recv.sh name cfec-001 false $senderip
//# 接收目录name, 清除任务队列,清除/data/dcp,再激活为false, 从103.90.190.176目录复制task.json开始接收
//# 需要提前经过 ssh-copy-id 和 senderip 之间建立免密登录
progress.sh name cfec-001
//# 查看下载进度, 根据task.json的名字,要加中心名-机构id-
uprogress.sh name cfec-001
//# 查看上传进度, 根据task.json的名字
cprogress.sh name cfec-001
//# 查看边缘节点cacher的做种情况
recv2.sh name #暂时不用此脚本
//# 不清除任务队列,也不删除/data/dcp等, 从tasks目录复制任务。
//# 用于: 1. 用于第一次发送后测试重复发送同名任务的异常情况。 2. bftv2启动前已存在ctorrent同名任务时,测试逻辑处理情况
cancel.sh name cfec-001
//# 用于取消任务, 会清理目录下遗留下来的文件
r.sh # 同步开发端程序到本机中心端服务器上作为备份和作为发送端
shell/inithashtable.sh # 初始化/data/dcp的整体目录到sha1哈希表库 /etc/bft/hashtable.txt
shell/mhashtable.sh # 日常实时监控/data/dcp下的哈希表库的增删改的维护
bftv2 # 主程序
bftv2run.sh #看门狗脚本
/var/log/bft2/bftv2.lgo # 输出日志
/var/log/bft2/bftv2run.log # 看门狗日志
functions.sh 公共函数说明
waitfinished name cfec-001 # 等策略文件完成
waitfinished2 name cfec-001 # 等策略文件完成
waitready name cfec-001 # 等发送前的上传完成
cleanstore name cfec-001 # 清理之前下载的目录,种子和哈希表
cpsendertask cfec-001-name 103.90.190.176 # 到ssh-copy-id过的发送端ip上复制 策略文件过来到 /data/receiver/tmp
waitdownloaded name cfec-001 # 查询下载进度,直到下载完成
checkdcp name cfec-001 # 根据存储类型,检查dcp完整性
说明: 发送端执行 (有xiaofang,xiaofang2,xiaofang4目录dcp)
A. 先生成 xiaofang的任务策略
B. 查询是否生成种子和任务策略
C. 执行case0-1.frank系列检查
1.1 生成xiaofang2 1:1:0 priortime策略
1.2 生成xiaofang4 1:1:1 priortime策略
1.3 不存在目录的错误检查, 返回false
2.1 xiaofang4的策略检查不存在, 返回unfinished
2.2 不存在目录的策略的错误检查,返回false
waitfinished2 xiaofang2 cfec-001
waitfinished2 xiaofang4 cfec-001
waitfinished xiaofang cfec-002
waitfinished zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV cfec-001
case0-2.frank系列检查
3.1 重新激活的xiaofang的发送
3.2 不重新激活的xiaofang的发送,返回false
4.1 不存在的策略文件的上传进度查询,返回false.
D. 执行xiaofang的上传进度查询
最终xiaofang的task.json策略文件存在与 /data/sender/uploaded目录
E. 通过脚本上传 zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV
最终效果:
启动了发送 cfec-002-xiaofang,
cfec-001: xiaofang2, xiaofang4, zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV
检查一些异常情况.
为了更换发送主机和中心标识为其他中心标识,需要将xiaofang,xiaofang2,xiaofang4, zds_3d_ADV_F_CMN_
复制过去到/data/dcp/cfec-001/dcps 下
同时执行 changetest.sh cfec-001 wuxi-001
name1=cfec-001
name2=wuxi-001
sed -i "s/{name2}/g" case0-1.frank
sed -i "s/{name2}/g" case0-2.frank
sed -i "s/{name2}/g" testapi.sh
testapi2.sh $senderip
说明: 接收端执行 ( ssh-keygen, ssh-copy-id, 添加了发送端密码)
A. 取消xiaofang, 清理目录, 根据receiver的存储而清理hashtable.txt
清理/etc/bft2/hashtable.txt 哈希表
B. 从发送端senderip:103.90.190.176的uploaded目录复制xiaofang.task.json
C. 执行case2.frank系列检查
5.1 启动xiaofang接收任务
5.2 启动不存在接收任务,返回false
5.3 再次重新启动xiaofang接收任务
D. 执行case3.frank progress系列检查
6.1 查询进度,本地重复文件占比为0.000%
E. 等待下载完成xiaofang 5.3, 下载完成本地构成重复文件哈希。
再次复制xiaofang到本机
F. 执行case4.frank,重新启动xiaofang下载 ??? (这里check 7.1)
7.1 重复文件复制,无需下载而成功。返回true, succeed有重复内容提示描述
7.2 启动不存在接收任务,返回false
再次复制xiaofang到本机
G. case5.frank 重新再启动下载
8.1 再次重新启动xiaofang接收任务,restart=true, true
H. 执行case6.frank, progress检查本地重复文件占比不为 0.000%
9.1 检查 localsamepercent != "0.000%"
I. 检查xiaofang的正确性完整性 ctorrent -c xiaofang.torrent
清理哈希表,清理目录.
J. case7.frnak同时执行xiaofang2,xiaofang4, zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV的下载
一直progress查询等待下载完成
最终效果:
下载了 cfec-002: xiaofang , 通过xiaofang的多次下载,实现了免重复传输,直接复制的功能.
下载了 cfec-001: xiaofang2,xiaofang4, zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV
为了更换发送主机和中心标识为其他中心标识,需要将xiaofang,xiaofang2,xiaofang4, zds_3d_ADV_F_CMN_
复制过去到/data/dcp/cfec-001/dcps 下
同时执行 changetest.sh cfec-001 wuxi-001
name1=cfec-001
name2=wuxi-001
sed -i "s/{name2}/g" case2.frank
sed -i "s/{name2}/g" case3.frank
sed -i "s/{name2}/g" case4.frank
sed -i "s/{name2}/g" case5.frank
sed -i "s/{name2}/g" case6.frank
sed -i "s/{name2}/g" case7.frank
sed -i "s/{name2}/g" testapi2.sh
前提:发送端的 testapi.sh 接收端的testapi2.sh 已经执行完毕并成功。
目的:进一步深入测试免重复传输功能,
之前测试过接收多次xiaofang,接收后再接收会直接重复文件复制无需下载。
sender: 启动了发送 cfec-002-xiaofang,
cfec-001: xiaofang2, xiaofang4, zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV
receiver: 下载了 cfec-002: xiaofang
下载了 cfec-001: xiaofang2,xiaofang4, zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV
A. 再次下载zds, 提示重复复制,完成下载
case-repeated1.frank
检查完整性
B. 清理/etc/bft2/hashtable.txt 中的一部分文件。
第3次下载zds, 部分下载,完成下载
case-repeated1.frank
检查taskfile中是否存在localsamefile记录
检查完整性
目的:测试不同的时间下的闲时下载,闲时下载,非闲时停止
A. 得到当前时间,修改config.json 设置schedule 为 下3分钟后的2分钟时段
B. 创建任务发送,分别priortime 发送 1:0:0, 1:1:1, 1:0:1, 0:1:1 ,0:0:1 发送一个2分钟内完成的小文件
C. priortime 发送一个大文件,需要等第2天共计4分钟内完成的任务,并记录。
目的:测试不同的时间下的闲时下载,闲时下载,非闲时停止
A. 接收5个2分钟内下载完成的小任务,判断当下没有开始下载,3分钟后开始下载。下载完成校验dcp。
B. 查看 showshchedules, 是否符合预设任务时间调度情况
C. priortime 接收的大文件任务,看时间到时,是否有进程,时间结束时是否结束并且无error结束。
等2天后看下载进度有无增加,或者完成。
文档输出:
安装文档
发送端配置文档
bft2接口文档
方案文档
私有分组传输功能作为一个单独的模块,其接口见其他文档:BFT分组传输方案与接口
分组标识与密码如下:
/etc/bft/groupsettings.json
统一配置文件,与TMS共用,
{"Groupid":"joyfullness","Password":"1234"}
种子服务器的地址和相关配置信息:
/etc/bft/serversettings.json
{
"Groupserver":"minio.prod.365noc.com:13490",
"User":"minio",
"Password":"minio^YHN9ij",
"Randuplimit":30,
"IsglobalCache":false
}
存储所有的已经下载的私有分组种子
/etc/bft/downloadedtorrents.txt
testonly_dirsend.torrent 2020-07-22T11:49:57
testonly_masterslave.torrent 2020-07-22T11:49:57
种子的存储路径则在savepath:/data/dcp下,与BFT的存储种子与目录的路径一致。
分组传输日志:
/var/log/bft/bftgroup.log
系统网络环境配置与BFT安装维护 (密码123)
https://www.zybuluo.com/zhongdao/note/1399949#4-%E5%AE%89%E8%A3%85
见第4章. 安装 的 v2版最简安装 的内容
增加交换分区的大小,
ulimit 加到系统参数里
swap
用 top命令行一看,KiB Swap为0,free为0
用 free -m 一看,交换分区也为0
增加交换分区
mkdir /swap
cd /swap
sudo dd if=/dev/zero of=swapfile bs=1024 count=2000000
sudo mkswap -f swapfile
.激活 Swap 文件
sudo swapon swapfile
扩展:
如果需要卸载这个 swap 文件,可以进入建立的 swap 文件目录。执行下列命令。
sudo swapoff swapfile
如果需要一直保持这个 swap ,可以把它写入 /etc/fstab 文件。
/swap/swapfile /swap swap defaults 0 0
https://www.jianshu.com/p/b9f2913518a6
mkdir -p /data/swap
cd /data/swap
dd if=/dev/zero of=swapfile bs=1024 count=20000000
mkswap -f swapfile
swapon swapfile
echo "/data/swap/swapfile /swap swap defaults 0 0" >> /etc/fstab
体现在 install-bftv2-ubuntu-16.04.sh 如下
sudo grep "/data/swap/swapfile" /etc/fstab
if [ $? -eq 0 ]; then
t=`free -g | tail -1 | awk '{print $2}'`
echo "found swapfile total $t G"
if [[ $t > 10 ]];then
echo "greater than 10G swap space.";
else
echo "less than 10G swap space.";
fi
else
echo " add swapfile 20G"
mkdir -p /data/swap
cd /data/swap
dd if=/dev/zero of=swapfile bs=1024 count=20000000
mkswap -f swapfile
swapon swapfile
echo "/data/swap/swapfile /swap swap defaults 0 0" > /etc/fstab
fi
https://code.tutsplus.com/tutorials/make-your-go-programs-lightning-fast-with-profiling--cms-29809
https://www.integralist.co.uk/posts/profiling-go/#memory-management
https://www.jianshu.com/p/162f44022eb7
Go 的 GC 如何调优?
https://www.bookstack.cn/read/qcrao-Go-Questions/spilt.14.GC-GC.md
How we tracked down (what seemed like) a memory leak in one of our Go microservices
https://blog.detectify.com/2019/09/05/how-we-tracked-down-a-memory-leak-in-one-of-our-go-microservices/