[关闭]
@zhongdao 2021-08-20T16:57:09.000000Z 字数 66347 阅读 1657

BFTv2.0接口说明及概念与流程

未分类


1. 前言

对bft不了解,采用不正确的术语来描述,说明对技术有误解,会导致+最终的业务系统无法正常设计和实现,达成预期的需求和效果,浪费人力和时间。
所以前3章进行概要的说明和流程图示意。

具体的接口,技术规范见第4章: 数据结构与接口

2. 术语定义

BT术语

P2P网络与BitTorrent技术简介
https://www.zybuluo.com/zhongdao/note/1390440

一般的下载服务器为每一个发出下载请求的用户提供下载服务,而BitTorrent的工作方式与之不同。分配器或文件的持有者将文件发送给其中一名用户,再由这名用户转发给其他用户,用户之间相互转发自己所拥有的文件部分,直到每个用户的下载都全部完成。这种方法可以使下载服务器同时处理多个大体积文件的下载请求,

以下是BitTorrent协议中重要的名词定义和算法介绍。

BFT的术语

p2p中的BT技术是 对等端的传输技术,发送端和接收端都是平等的,而且是一样的,只要防火墙打开,即可互相传输。

BFT 1.0 != 2.0 两者有很大不同,不能沿用1.0的术语和发送接收流程。

BFT v1.0

ctorrent API Server接口说明
https://www.zybuluo.com/zhongdao/note/1210252

制作种子: 根据目录生成 目录同名.torrent文件

做种服务时间:seedtime, 对外提供下载服务的时长,默认3天或者5天7天。与业务需求有关。

创建任务:无论是发送还是接受文件,都是创建一个BT的进程,有文件则对外提供下载服务,本地没有文件则从其他节点处下载。

做种服务: 根据种子文件和创建任务,启动p2p服务,提供做种服务时长的下载服务,然后结束

影片分发业务需求:需要在2-3天完成一部影片的传输,以替代硬盘的快递。所以一部影片200G做种服务时长通常设为5-7天就够了,如果还没下载完成,说明网络带宽不够,或者是意外,需要采用硬盘快递的备份方法来满足影院的上映需求。

BFT v2.0

因为混合了中心化的传输方式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下载概要原理

image_1f495ushjiol2uu1ogbr3a5ha9.png-68kB
从 BT 客户端角度考虑,下载原理分为以下几步:

一.根据 BitTorrent 协议,文件发布者会根据要发布的文件生成提供一个 .torrent 文件。
客户端可从 Web 服务器上下载种子文件,并从中得到 Tracker 服务器 URL 等信息。

二.根据 Tracker URL 与 Tracker 服务器建立连接,并从服务器上得到 Peers 信息。

三.根据 Peers 信息与一个 Peer 建立连接,依据 Peer wire 协议完成握手,
并从 Peer 端下载数据文件。同时监听 Peer 的连接,并给 Peer 上传数据文件。

3. BFT的相应概念发送接收阶段与流程介绍

在BFT里为了方便人们理解,种子节点也叫作中心节点或者发送节点

下载节点包括2类, 在BFT里主要是边缘节点,终端影院接收节点。 前者可以对外提供服务,起到缓存和扩充中心节点的作用。后者因为防火墙未打开无法对外提供下载服务,所以只接收。

3.1 BFT v1.0 发送接收阶段

发送阶段划分:
发送端: 制作种子| 根据种子启动任务, (读取进度)100% | 持续对外提供下载服务 seedtime 时长 | 结束进程

对于本地存储目录中有片源的发送端,创建任务后,任务的过程同上面发送阶段,是否对外服务可以从本机的2780的web页面看到。

接收阶段划分:
接收端: 接收种子| 启动任务 | 0% | 下载 -- 100% | 持续对外提供下载服务 seedtime 时长 | 结束进程

对于边缘节点和影院终端,创建任务后,任务的过程同上面接收阶段

BFTv1.0接口的阶段划分示意图美图.jpg-1740.1kB

通过api, 无论发送端还是接收端都是创建create一个任务即开始整个阶段。
如果对外提供服务seedtime 是0, 那么下载完马上结束进程,无法查询到进度。

3.2 BFT v2.0 传输阶段与接口调用时机

BFT 除了 P2P(BT)的传输方法之外,还提供了华为云的OBS,CDN的下载模式,三种下载方法混合起来传输,并且可以配置采用哪些方法,方法传输的数据量的大小,是全时段传输还是按照闲时传输。

BFTv2.0接口的业务阶段划分示意图美图.jpg-1762.9kB

3.3 BFT v1.0 与 v2.0的并存与接收特性

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.4 BFT v2.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 来将其哈希计算值加入库中,以便支持免重复传输。
例如:

  1. /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时

运营时为了实现接收端免重复传输,发送时要等前一个接收完发送下一个。

4. 数据结构与接口

4.0 BFT2相关配置文件说明

存储本地dcp目录库里的所有dcp的哈希表路径是固定的:
/etc/bft2/hashtable.txt
配置路径信息直接写入
inithashtable.sh
mhashtable.sh
日志: /var/log/bft2/mhashtable.log

混合传输的配置文件:
路径:/etc/bft2/config.json

  1. {
  2. "servertype": "cacher",
  3. "machinetype": "local",
  4. "receiverid": "cfec0001",
  5. "vip":"1.2.3.4",
  6. "basedatapath": "/data/dcp",
  7. "basesubdir": "cfec-001",
  8. "avoidrepeat": true,
  9. "ctcs": "localhost:2780",
  10. "senderid": "cfec",
  11. "senderdomain": "http://47.92.93.51",
  12. "bt-obs-cdn":"2:1:1",
  13. "priorpolicy":"fulltime",
  14. "tracker": "http://bttracker.top:6969/announce",
  15. "defaultseedtime": "72",
  16. "obsurl": "obs://cfec-001",
  17. "cdnurl": "http://47.92.93.51",
  18. "bttime": "06:00-18:00",
  19. "obstime": "08:00-18:00",
  20. "cdntime": "06:00-00:00",
  21. "ctfilesorder":true,
  22. "obsak":"AQGKZ0KGJTSMQRWCWXJG",
  23. "obssk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
  24. "obsendpoint":"obs.ap-southeast-1.myhuaweicloud.com"
  25. "datasource":"local"
  26. "receiverstoreplan":"A"
  27. "uploadingnum":5
  28. "downloadingnum":5
  29. }

解释说明:
注意: 所有的路径与网址 后面不带 "/"

  1. "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时长。
  2. "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即可。
  3. "hashtable": "/data/bft2/hashtable.txt",
  4. "receiverid": "cfec0002", #接收者id, 用于请求的唯一标识
  5. "vip": "1.2.3.4", #接收者内部ip, 也用于请求的唯一标识
  6. "basedatapath": "/data/dcp", # 发送端的基础存储目录,下一级是cfec-001形式,再下一级是dcp目录名
  7. "avoidrepeat": true, #避免重复传输开关
  8. "ctcs": "localhost:2780", # bt的web控制端地址,用于启动bt任务
  9. "senderid": "cfec", # 中心发送端id, 不能有下划线,字母,数字组成
  10. "senderdomain": "http://103.90.190.176", #用于下载种子和上传请求,规模大时用集群和域名
  11. "bt-obs-cdn":"2:1:1", # 默认发送的策略,界面上可修改
  12. "prior":"fulltime",
  13. "tracker": "http://bttracker.top:6969/announce", # 生成种子用
  14. "defaultseedtime": "72", #p2p任务的默认做种时间
  15. "obsurl": "obs://lijun123", # obs的起始地址
  16. "cdnurl": "http://download.bttracker.top", # cdn下载域名
  17. "bttime": "08:00-18:00", # 闲时,此时段传输费用低 (不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
  18. "obstime": "08:00-18:00", # 闲时,此时段传输费用低(不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
  19. "cdntime": "06:00-00:00" # 闲时,此时段传输费用低(不能出现24:00,用00:00代替)用00:00-23:59表示此方法的全时段
  20. "ctfilesorder":true # 对文件进行按方法分配时,顺序采用torrent种子文件中的顺序和逆序进行分配,否则文件大时会影响bt切片后下载超出分配的数据。
  21. "obsak":"AQGKZ0KGJTSMQRWCWXJG", # obs桶的ak,多个桶可以共享
  22. "obssk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0", # obs桶的sk,多个桶可以共享
  23. "obsendpoint":"obs.ap-southeast-1.myhuaweicloud.com" # obs桶的,需要看控制台里内容,对应一个桶obsurl: obs://cfec-001, 如果是多个桶的访问,这里需要更换,要传参数到api.
  24. "datasource":"local" # local or obs, 表示machinetype为local时的数据从哪里来,是本地目录/data/dcp/cfec-001/ 还是 obs://cfec-001/ 目前业务暂不支持此功能,也就是本地存储时不支持obs的传输方式.
  25. "receiverstoreplan":"A" # 仅对receiver类型有效,A表示A存储方案,是/data/dcp不区分中心和机构id, B表示B存储方案,/data/dcp/cfec-001/dcps 区分中心和机构id
  26. "uploadingnum":5 同时上传中状态的任务个数
  27. "downloadingnum":5 同时下载中状态的任务个数

说明:

avoidrepeat: 为true时, 会打开避免重复传输功能。false时,照常传输。对应 task.json中的localsamefiles字段的写入和相应功能的打开。

servertype:sender, cacher, receiver ,
类型不同决定存储方案不同。有公网ip的可以做sender,cacher.
改变servertype时,需要重新清理并初始化哈希表

4.1 任务策略文件数据格式

4.1.1 centername-id-name.task.json数据格式说明

名称规则:中心名-机构id-uuid.task.json
例如: cfec-001-dad26d2a65489468986515.task.json

  1. {
  2. "sourcetype": "sender",
  3. "senderid": "cfec",
  4. "name": "xiaofang",
  5. "type": "dir",
  6. "senderlocalpath": "/data/dcp/cfec-001/dcps",
  7. "basesubdir":"cfec-001"
  8. "datasource":"local"
  9. "size": 668521472,
  10. "bt-obs-cdn": "1:1:1",
  11. "policy": "priortime",
  12. "bt": {
  13. "localtorrent": "/data/dcp/cfec-001/dcps/xiaofang.torrent",
  14. "url": "http://47.92.93.51/dcp/cfec-001/dcps/xiaofang.torrent",
  15. "tmpurl":"http://47.92.93.51/dcp/cfec-001/dcps/xiaofang-tmp.torrent
  16. "tracker":"http://bttracker.top:6969/announce"
  17. "seedtime": 72,
  18. "priortime": "00:00-23:00"
  19. },
  20. "obs": {
  21. "url": "obs://cfec-001/dcps/xiaofang",
  22. "priortime": "08:00-24:00",
  23. "ak":"AQGKZ0KGJTSMQRWCWXJG",
  24. "sk":"FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
  25. "endpoint":"https://obs.cn-north-4.myhuaweicloud.com"
  26. },
  27. "cdn": {
  28. "url": "http://103.90.190.176/dcp/cfec-001/dcps/xiaofang",
  29. "priortime": "18:00-05:00"
  30. },
  31. "filelist": [
  32. {
  33. "file": "42e7346d-ff82-c248-9a25-85e3058b0d44.mxf",
  34. "hash": "bb53810cdfea87878d27457f807eb4574706f2e4",
  35. "size": 9632846
  36. },
  37. {
  38. "file": "ASSETMAP.xml",
  39. "hash": "af11b565fc46fb87fa068c7ab89cb8eec3fdd4a9",
  40. "size": 1466
  41. },
  42. {
  43. "file": "PKL.XML",
  44. "hash": "777d28475b581d7b0dc446bb5a965b2bc339a71e",
  45. "size": 957
  46. },
  47. {
  48. "file": "subdir/b9062d02-d9ce-6c4f-80c9-711985835c38.mxf",
  49. "hash": "5efb3b8530afcb5c8ae1c4d182492d4434f5da3e",
  50. "size": 658886048
  51. },
  52. {
  53. "file": "subdir2/VOLINDEX",
  54. "hash": "d9b3efd811d0210d686c8f503d12a7ca28cd4a4f",
  55. "size": 155
  56. }
  57. ],
  58. "localsamefiles":[""],
  59. "btlist": [""],
  60. "obslist": [""],
  61. "cdnlist": [""],
  62. "requesters": [
  63. {
  64. "vip": "",
  65. "id": ""
  66. },
  67. {
  68. "vip": "",
  69. "id": ""
  70. }
  71. ],
  72. "btlistsize": 0,
  73. "obslistsize": 0,
  74. "cdnlistsize": 0,
  75. "btlistsize2": 0,
  76. "obslistsize2": 0,
  77. "cdnlistsize2": 0,
  78. "gentime": "2021-04-19 22:14:30",
  79. "sendtime":"",
  80. "receivetime": "2021-04-19 22:51:05",
  81. "finishedtime": "2021-04-19 23:49:54"
  82. }

说明:

  1. "sourcetype": "sender", # 主动分发模式sender,请求模式request
  2. "senderid": "cfec", # 发送端id
  3. "name": "dirname", # 要传输的内容目录名称或文件名称
  4. "type": "dir", #内容类型 dir/file
  5. "senderlocalpath": "/data/dcp/cfec-001", # 发送端传输内容的父目录, 在任务中仅用于跟踪,不用于建接收端的子目录。
  6. "basesubdir":"cfec-001" # 用于标识发送端和机构id的信息。 对于cacher, 当存储dcp时,config.json : basedatapath + task.json: basesubdir + / + name ; 对于tms 的 receiver, 不需要此字段,因为直接存 /data/dcp中
  7. "size": 12345, # 内容大小
  8. "datasource": local # 本机 local or obs , 表示最初发送时,数据来自哪里? 然后决定数据同步的方向
  9. "bt-obs-cdn": "2:1:1", # p2p,obs,cdn的数据传输比例, 例如1:0:0, 1:1:1 等等。
  10. "policy": "priortime", # 请求的传输策略 priortime/fulltime 只闲时传输,全时间段传输。
  11. bt.url # 种子下载地址
  12. bt.tmpurl # 经数据比例分配的临时种子下载地址,为空时表示没有。
  13. cdn.url 标识加速域名cname域名(可以回源到源站ip或域名),根据cdn的配置填入即可
  14. bt.priortime BT的闲时传输时间(此时段传输流量费用低)
  15. cdn.priortime CDN的闲时传输时间(此时传输流量费用低)
  16. obs.priortime OBS的闲时传输时间(此时传输流量费用低)
  17. "filelist" 即是要传输目录的绝对路径下的所有文件列表,是相对路径。
  18. "btlist","obslist","cdnlist" 是按照平均分配下来的不同方式各自传输的文件列表,与bt-obs-cdn有关.
  19. "localsamefiles" 用于接收端处理记录用的,用于避免重复传输时,下载到task.json文件后,先将filelist与本地哈希库对比,发现重复文件后,然后写入localsamefiles数组, 等按照传输比例分配时,先提出重复的部分,剩下的进行最终的文件列表任务分配, 分配完,正式开始下载,然后将不同方式的合并到一起,再根据重复的文件将其复制过去,填补完全,这时下载真正完成。
  20. "gentasktime":"", 发送端生成任务文件时间
  21. "sendtime":"", 发送时间
  22. "receivetime":"", 接收时间
  23. "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 得到的是空间占用大小。
只是简单累加所有文件的大小,则用下面脚本:

  1. find xiaofang -type f -ls | awk '{sum += $7} END {print sum}'

4.1.2 xiaofang.task.json 实例1 发送端产生任务描述

发送端根据业务需求的1:1:1的方法对比,根据本机的hashtable.经查文件哈希之后生成的任务文件。(发送端本机经过inithashtable.sh, 而且日常hashtable有监控, 每个文件都有完整的sha1的hash)

  1. {
  2. "sourcetype": "sender",
  3. "senderid": "cfec",
  4. "name": "zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV",
  5. "type": "dir",
  6. "senderlocalpath": "/data/dcp/cfec-001/dcps",
  7. "basesubdir": "cfec-001",
  8. "bt-obs-cdn": "1:1:1",
  9. "policy": "fulltime",
  10. "bt": {
  11. "localtorrent": "/data/dcp/cfec-001/dcps/zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV.torrent",
  12. "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",
  13. "tracker": "http://bttracker.top:6969/announce",
  14. "seedtime": "169",
  15. "priortime": "06:00-18:00"
  16. },
  17. "obs": {
  18. "url": "obs://cfec-001/dcps/xiaofang",
  19. "priortime": "08:00-18:00",
  20. "obsak": "AQGKZ0KGJTSMQRWCWXJG",
  21. "obssk": "FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0",
  22. "obsendpoint": "obs.ap-southeast-1.myhuaweicloud.com"
  23. },
  24. "cdn": {
  25. "url": "http://103.90.190.176/dcp/cfec-001/dcps/zds_3d_ADV_F_CMN-CMN_CN-G_20-CMN_2K_20160827__i3D_OV",
  26. "priortime": "06:00-24:00"
  27. },
  28. "filelist": [
  29. {
  30. "file": "886e309a-dfd4-45ee-a542-7d1c4b4251e9_cpl.xml",
  31. "hash": "eb8f45c6b81f2d01bc9e35f6efa403a23e93901c",
  32. "size": 1778
  33. },
  34. {
  35. "file": "zds-viedo.mxf",
  36. "hash": "79d317fddb697d5dc1f991dd05fcd309f048a13c",
  37. "size": 933597669
  38. },
  39. {
  40. "file": "zds-audio.mxf",
  41. "hash": "99e81362750a1220ef1901457cd7942a94a2610d",
  42. "size": 8623166
  43. },
  44. {
  45. "file": "VOLINDEX",
  46. "hash": "7648bf1e3b6f1c398d661b34988f69708028f583",
  47. "size": 155
  48. },
  49. {
  50. "file": "24e738d2-8f07-437f-84f4-3f5efb8af8cc_pkl.xml",
  51. "hash": "acb2bceea62e18d3217f85ce80f1350e77616906",
  52. "size": 1014
  53. },
  54. {
  55. "file": "ASSETMAP.xml",
  56. "hash": "bfe19db4e920c486efdd6256187941bcc88463a8",
  57. "size": 1453
  58. }
  59. ],
  60. "size": 942225235,
  61. "btlist": ["zds-viedo.mxf"],
  62. "obslist": [],
  63. "cdnlist": [
  64. "zds-audio.mxf",
  65. "886e309a-dfd4-45ee-a542-7d1c4b4251e9_cpl.xml",
  66. "ASSETMAP.xml",
  67. "24e738d2-8f07-437f-84f4-3f5efb8af8cc_pkl.xml",
  68. "VOLINDEX"
  69. ],
  70. "requesters": [
  71. {
  72. "vip": "",
  73. "id": ""
  74. }
  75. ],
  76. "gentime": "2021-04-25 16:56:37",
  77. "btlistsize": 933597669,
  78. "obslistsize": 0,
  79. "cdnlistsize": 8627566
  80. }

4.2 数据结构中业务相关知识说明

忙时闲时的收费相关说明

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点的价格是平时的一半,利用这个时间段进行数据下载,可以大大减少流量费用。

4.3 BFTv2.0混合传输接口说明

4.3.1 创建发送任务

简要说明:分发模式下创建发送任务
适用节点类型:sender

http://localhost:8191/send

业务端简要处理流程:

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不重启,

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "send",
  6. "method_params": {
  7. "taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
  8. "reactive":"false",
  9. }
  10. }

返回:

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "send",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeeded!"
  8. }
  9. }

或者:

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "send",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"restarted same name bt process, succeed!"
  8. }
  9. }

异常:

1.没找到文件:

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"send",
  5. "return_status":"false",
  6. "return_content":{"desc":"open json file error:open /data/sender/tmp/cfec-001-xiaofang.task.json: no such file or directory"}}
  1. json文件格式错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"invalid json format:/data/sender/tmp/cfec-001-xiaofang.task.json"}}
  1. 复制taskfile错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"copy taskfile: /tmp/cfec-001-xiaofang.task.json error."}}
  1. 任务已在队列中,(重复发送)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"same taskfile in queues:/data/sender/queues/cfec-001-xiaofang.task.json"}}
  1. 任务正在发送中,(重复发送)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"same taskfile in uploading:/data/sender/uploading/cfec-001-xiaofang.task.json"}}
  1. 文件缺少,(种子缺失)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"not found torrent:/data/dcp/cfec-001/dcps/xiaofang.torrent pls re generate task and torrent. "}}
  1. 重启同名任务失败
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"restart bt serving failed: xxx.torrent in cfec-001-xiaofang.task.json "}}
  1. 已经存在同名进程任务
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"exisited same name ct torrent bt process, send task failed: xxx.torrent in cfec-001-xiaofang.task.json "}}
  1. 再激活参数错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"send",
  4. "return_status":"false",
  5. "return_content":{"desc":"reactive parameter input error "}}

curl测试用例:

  1. 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
  2. {"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"}}

4.3.2 创建接收任务

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参数无关。

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "recv",
  6. "method_params": {
  7. "taskfile": "/data/receiver/tmp/cfec-001-uuid.task.json",
  8. "reactive":"true"
  9. }
  10. }

返回:

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "recv",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeed!"
  8. }
  9. }

如果是cacher类型,重新激活

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "recv",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"reactive cacher bt seeding with taskfile:cfec-001-xiaofang.task.json"
  8. }
  9. }

或者重新下载一遍

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "recv",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"same name task downloaded, to download again."
  8. }
  9. }

或者 本地重复文件都存在,直接复制完成传输

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "recv",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"all localsamefiles existed copy and finished, succeed!"
  8. }
  9. }

或者 已经下载过,本地重复文件都存在,直接复制完成传输

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "recv",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"same name task downloaded, all localsamefiles existed copy and finished, succeed!"
  8. }
  9. }

异常:

1.没找到文件:

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"recv",
  5. "return_status":"false",
  6. "return_content":{"desc":"open json file error:open /data/receiver/tmp/cfec-001-xiaofang.task.json: no such file or directory"}}
  1. json文件格式错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"invalid json format:/data/receiver/tmp/cfec-001-xiaofang.task.json"}}
  1. 文件列表的总大小为0,错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"total files size equal 0 :/data/receiver/tmp/cfec-001-xiaofang.task.json"}}
  1. 同名任务已经在队列中
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"same taskfile in queues:/data/receiver/queues/cfec-001-xiaofang.task.json"}}
  1. 同名任务已经在下载中
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"same taskfile in downloading:/data/receiver/downloading/cfec-001-xiaofang.task.json"}}
  1. 同名任务已经下载完成
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"same taskfile in downloaded:/data/receiver/downloaded/cfec-001-xiaofang.task.json"}}
  1. 移动任务策略文件错误
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"move json file to /data/receiver/tmp erro"}}
  1. 任务文件校验错误 (说明发送端生成,或者本地免重复哈希表数据来自同目录等相关的问题)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"totalsize != all lists2 sum + localsamesize : /data/receiver/tmp/cfec-001-xiaofang.task.json"}}
  1. 任务文件校验错误 (说明发送端生成错误)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"totalsize != all lists sum : /data/receiver/tmp/cfec-001-xiaofang.task.json"}}
  1. 要下载的尺寸为0,
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"total files size equal 0"}}
  1. 下载不了种子
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"could not download torrent from http://47.92.93.51/dcp/cfec-001/dcps/xiaofang.torrent"}}
  1. 临时种子参数错误(taskfile在发送端生成错误,或网络错误)
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "return_content":{"desc":"need tmptorrent and found bt.tmpurl is empty."}}
  1. 下载不了种子
  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "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)

  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"recv",
  4. "return_status":"false",
  5. "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类型:

  1. 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
  2. {"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类型:

  1. 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
  2. {"reqest_message_id":"321","message_type":"response","method_name":"recv","return_status":"true","return_content":{"desc":"succeed!"}}

4.3.3 上传进度查询

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没有全路径

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "uploadprogress",
  6. "method_params": {
  7. "taskfile": "cfec-001-xiaofang.task.json",
  8. }
  9. }

返回:
可用状态

返回状态:
status: queues 队列中, uploading 上传中,uploaded 上传完, ready 准备就绪, finished 结束, error 错误

ready: 表示所有方式的状态都可用,准备就绪,可以对外提供下载。(对应btstatus: seeding, obs:completed, cdn:available)

  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"uploadprogress",
  4. "return_status":"true",
  5. "return_content":{
  6. "taskfile":"/data/sender/uploaded/cfec-001-changjiang_FTR-1_F_EN-XX_20_2K_20210315_OV.task.json",
  7. "status":"ready",
  8. "desc":"",
  9. "btstatus":"seeding",
  10. "obsstatus":"completed",
  11. "cdnstatus":"available"}}

或者上传中

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "message_status": "true",
  6. "method_name": "uploadprogress",
  7. "return_content": {
  8. "taskfile": "/data/sender/uploaded/cfec-001-xiaofang.task.json"
  9. "status": "uploading "
  10. "desc": ""
  11. "btstatus": "seeding"
  12. "obsstatus": "uncompleted 66%"
  13. "cdnstatus": "available"
  14. }
  15. }

所有的状态都可用时(),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 是否可以访问,可访问,则是可对外服务,否则是不可用服务)

异常:

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "message_status": "false",
  6. "method_name": "uploadprogress",
  7. "return_content":{
  8. "taskfile":"",
  9. "status":"unknown",
  10. "desc":"",
  11. "btstatus":"unknown",
  12. "obsstatus":"completed",
  13. "cdnstatus":"unknown"
  14. }
  15. }

curl测试用例:

  1. 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
  2. {"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"}}

4.3.4 下载进度查询

http://localhost:8191/progress

简要说明:下载端的下载进度

适用类型:sender, receiver,cacher

receiver节点类型

下载完, 对 tms, receiver 直接将 dcp 移动到 A: /data/dcp 下,或者B: /data/dcp/cfec-001/dcps下; 发送节点 移动 到 /data/dcp/cfec-001/dcps/

根据文件名到各个目录检索,看处于什么阶段。如果是正在下载,计算和查一下进度、速度。
参数:不带路径,而仅仅是任务文件名

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "progress",
  6. "method_params": {
  7. "taskfile": "cfec-001-file99M.task.json",
  8. }
  9. }

返回:

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "progress",
  6. "return_content": {
  7. "status": "downloading”,
  8. "taskfile":"/data/receiver/downloading/cfec-001-xiaofang.task.json",
  9. "dcppath":"/data/dcp/xiaofang"
  10. "btstatus":"btseeding",
  11. "downerror":"",
  12. "downloaded": "12345",
  13. "rate": "10 KB/s",
  14. "totalpercent": "66%",
  15. "btrate": "3 KB/s",
  16. "btpercent": "22%",
  17. "obsrate": "5 KB/s",
  18. "obspercent": "23%",
  19. "cdnrate":"2 KB/s",
  20. "cdnpercent": "21%",
  21. "ecompletedtime": 1111,
  22. "bt2downpercent":"99.084%",
  23. "obs2downpercent":"0.000%",
  24. "cdn2downpercent":"0.916%",
  25. "localsamepercent":"0.000%",
  26. "totalbytes":"1234567890"
  27. }
  28. }

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

下载完成

  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"progress",
  4. "return_status":"true",
  5. "return_content":{
  6. "Status":"downloaded",
  7. "taskfile":"/data/receiver/downloading/cfec-001-xiaofang.task.json",
  8. "dcppath":"/data/dcp/xiaofang"
  9. "Downloaded":"53756747598",
  10. "Rate":"",
  11. "TotalPercent":"100.000%",
  12. "btrate":"",
  13. "BtPercent":"",
  14. "obsrate":"",
  15. "obspercent":"",
  16. "cdnrate":"",
  17. "cdnpercent":"",
  18. "totalbytes":"1234567890"}
  19. }

异常:
1. 未发现任务文件

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"progress",
  5. "return_status":"false",
  6. "return_content":{"desc":"unknown task, not found task."}}

2.任务文件打开错误:

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"progress",
  5. "return_status":"false",
  6. "return_content":{"desc":"open dir error:open /data/sender/tmp/cfec-001-xiaofang.task.json : no such file or directory"}}
  1. 不支持cacher类型进度查询
  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"progress",
  5. "return_status":"false",
  6. "return_content":{"desc":"do not support cacher type progress, change method_name to cprogress"}}
  1. 还在队列中,无法查询
  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"progress",
  5. "return_status":"false",
  6. "return_content":{"desc":"task in queues, no progress now."}}

curl测试用例:

  1. 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
  2. {"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节点类型

对于 cacher类型,不存在下载,不存在下载进度的请求需求,只是对外做种服务与否:
不存储,做种服务过程中的下载和对外服务,都位于 /data/transfer/bt/cfec-001 目录下.

将 method_name 换成 cprogress即可
查询进度:

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "cprogress",
  6. "method_params": {
  7. "taskfile": "cfec-001-file99M.task.json",
  8. }
  9. }

返回

  1. {"reqest_message_id":"321",
  2. "message_type":"response",
  3. "method_name":"cprogress",
  4. "return_status":"true",
  5. "return_content":{
  6. "Status":"seeding",
  7. "desc":"btseeding dir:/data/transfer/bt/cfec-001/xiaofang4-tmp"}}

正在做种:seeding
没有做种:noseeding
如果有错误,则为"seeding error" 或"noseeding error"

curl测试用例:

  1. 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
  2. {"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"}}

4.3.5 创建发送任务策略文件

http://localhost:8191/gentask

简要说明:根据参数生成分发模式下发送任务的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, 生成种子和策略文件前,要不要删除之前存在的旧的。(不删除可以节省时间,但是个别情况下,种子文件有损坏,或者与目录内容不一致时需要删除,再生成)

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "gentask",
  6. "method_params": {
  7. "dcppath": "/data/dcp/cfec-001/xiaofang",
  8. "taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
  9. "basesubdir":"cfec-001",
  10. "btobscdn": "1:1:1",
  11. "policy": "fulltime",
  12. "tracker":"http://bttracker.top:6969/announce",
  13. "seedtime":"72",
  14. "datasource":"obs",
  15. "obsurl":"obs://cfec-001/dcps/xiaofang",
  16. "ak":"",
  17. "sk":"",
  18. "endpoint":"",
  19. }
  20. }

返回:

  1. 提前已经准备好种子,返回成功:
  1. {
  2. "request_message_id": "12345",
  3. "method_name": "gentask",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeeded!"
  8. }
  9. }
  1. 开始生成种子和任务,返回:
  1. {
  2. "request_message_id": "12345",
  3. "method_name": "gentask",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "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."
  8. }
  9. }

异常:
1. taskfile为空

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"gentask",
  5. "return_status":"false",
  6. "return_content":{"desc":""error, please provide taskfile path."}}
  1. taskfile为空
  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"gentask",
  5. "return_status":"false",
  6. "return_content":{"desc":""error, not exist dcp path: /data/dcp/cfec-001/dcps/xiaofang-nonexists."}}

3.系统中已经存在同名做种进程:

  1. {
  2. "reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"gentask",
  5. "return_status":"false",
  6. "return_content":{"desc":"same torrent process is generating:/data/dcp/cfec-001/dcps/xiaofang.torrent "}}

curl测试用例:

  1. 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
  2. {"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."}}

4.3.6 任务策略文件生成查询

http://localhost:8191/taskfilesquery

简要说明:根据目录名到各个目录检索,看任务策略文件和种子是否生成完成。

适用类型: sender

参数:
dcp路径,
任务策略文件路径和名称

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "taskfilesquery",
  6. "method_params": {
  7. "dcppath": "/data/dcp/cfec-001/xiaofang",
  8. "taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json"
  9. }
  10. }

返回:
返回说明:status: finished, unfinished, error.
1. 成功

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "taskfilesquery",
  6. "return_status": "true",
  7. "method_params": {
  8. "status": "finished”,
  9. "desc":"succeed!"
  10. }
  11. }
  1. 未完成
  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "taskfilesquery",
  6. "return_status": "true",
  7. "method_params": {
  8. "status": "unfinished”,
  9. "desc":"process making seed "
  10. }
  11. }

其他返回的描述:
desc:"no make seed process and not found task.json."
desc:" please wait until dcppath.torrent and taskfile all are finished."
...

异常:
1. 目录不存在

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "taskfilesquery",
  6. "return_status": "false",
  7. "method_params": {
  8. "status": "error”,
  9. "desc":"not exist /data/dcp/cfec-001/dcps/xiaofang "
  10. }
  11. }
  1. 文件打不开
  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "taskfilesquery",
  6. "return_status": "false",
  7. "method_params": {
  8. "status": "error”,
  9. "desc":"open json file error: /data/receiver/bt/cfec-001/cfec-001-xiaofang.task.json "
  10. }
  11. }

curl测试用例:

  1. 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
  2. {"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."}}

4.3.7 取消任务

http://localhost:8191/cancel
简要说明:
停止上传或下载进程。(需要考虑忙时,闲时的情况)
默认要么是上传中,要么是下载中,只有一种情况,不存在两者同时。优先取消下载。
下载时: 先找出taskfile的路径,然后读取参数,分别杀死bt,obs,cdn的下载进程。清理队列,删除错误文件。
上传时: 先找出taskfile的路径,然后读取参数,杀死bt进程,清理队列,删除错误文件。

适用类型:sender, receiver

参数:
taskfile: 任务策略文件名, 不带路径

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "cancel",
  6. "method_params": {
  7. "taskfile": "cfec-001-xiaofang.task.json",
  8. }
  9. }

返回:

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "cancel",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeeded!"
  8. }
  9. }

不存在同名任务的情况:

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "cancel",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"no need to cancel, not found task: xxx.task.json"
  8. }
  9. }

curl测试用例

  1. 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
  2. {"reqest_message_id":"321","message_type":"response","method_name":"cancel","return_status":"true","return_content":{"desc":"succeed!"}}
  1. 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
  2. {"reqest_message_id":"321",
  3. "message_type":"response",
  4. "method_name":"cancel",
  5. "return_status":"true",
  6. "return_content":{"desc":"no need to cancel, not found task: cfec-001-xiaoang.task.json"}}

4.3.8 创建发送任务简化(暂不用)

分发模式下创建发送任务

业务端简要处理流程:
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桶的参数,为空时采用配置默认

  1. {
  2. "message_id": "12345",
  3. "message_type": "request",
  4. "message_source": "tms",
  5. "method_name": "sends",
  6. "method_params": {
  7. "dcppath": "/data/dcp/cfec-001/xiaofang",
  8. "taskfile": "/data/sender/tmp/cfec-001-xiaofang.task.json",
  9. "btobscdn": "1:1:1",
  10. "policy": "fulltime",
  11. "datasource":"obs",
  12. "obsurl":"obs://cfec-001/dcps/xiaofang",
  13. "tracker":"http://bttracker.top:6969/announce",
  14. "seedtime":"72",
  15. }
  16. }

todo:

a. 去掉 taskfile, return taskfile path
b. 增加查询上传任务是否完成的接口 ( 生成种子,生成task.json, 启动p2p ,obs, cdn )

返回:
1. 成功

  1. {
  2. "request_message_id": "12345",
  3. "method_name": "sends",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeeded!"
  8. }
  9. }
  1. 临时开始生成种子,需等待种子生成完成后再开始发送,返回:
  1. {
  2. "request_message_id": "12345",
  3. "method_name": "sends",
  4. "message_type": "response",
  5. "return_status": "true",
  6. "return_content": {
  7. "desc":"succeed, but the torrent is generating, please wait until /data/dcp/cfec-001/xiaofang.torrent is finished."
  8. }
  9. }
  1. 同名任务已经在队列中
  1. "return_status": "false",
  2. "return_content": {
  3. "desc":"same task in queues:/data/sender/queues/cfec-001-xiaofang.task.json"
  4. }
  1. 同名任务已经在上传中
  1. "return_status": "false",
  2. "return_content": {
  3. "desc":"same task in uploading:/data/sender/uploading/cfec-001-xiaofang.task.json"
  4. }

4.3.11 配置文件上传更新 (暂不用)

暂定安装时手工编辑config.json

4.3.12 配置文件下载 (暂不用)

4.3.13 相关api工具

查看所有的时间调度任务和正在下载任务

采用按照方法来看调度,以及按照任务为维度来看调度。

  1. curl http://localhost:8191/showschedules

显示示例:

  1. Now: 2021-05-28 22:33:57
  2. Scheduls by Methods:
  3. bt schedules
  4. bt next runtime: no schedule
  5. cdn schedules
  6. cfec-001-xiaofang7 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  7. cfec-001-xiaofang9 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  8. cdn next runtime:2021-05-28 22:34:00
  9. obs schedules
  10. cfec-001-xiaofang7 priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  11. obs next runtime:2021-05-28 22:34:00
  12. Schedules by TaskNames:
  13. cfec-001-xiaofang7
  14. bt priortime: none
  15. cdn priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  16. obs priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  17. cfec-001-xiaofang9
  18. bt priortime: none
  19. cdn priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  20. obs priortime: start: 2021-05-28 22:34:00 +0800 CST stop: 2021-05-28 22:37:00 +0800 CST
  21. All Current Downloading:
  22. cfec-001-xiaofang7 bt:obs:cdn = 0:1:1 priortime obs: 0 22:34-22:37 cdn: 0 22:34-22:37
  23. cfec-001-xiaofang9 bt:obs:cdn = 0:0:1 priortime cdn: 0 22:34-22:37

载入配置

修改配置文件/etc/bft2/config.json 后需要执行,配置出错会提示

  1. curl http://localhost:8191/reloadconf

"reload config.json ok."

时间心跳检测

  1. curl http://localhost:8191/heartbeat

"2021-05-28 22:32:26 is living."

查看版本

  1. curl http://localhost:8191/version

2.001

断电后重启任务

仅对 receiver类型有效。
正在下载中的任务,如果突然断电,开机后会自动恢复。查看日志可以看到:

  1. 2021/05/30 11:29:41 monitor.go:335: start downloading taskfiles: xxx,yyy

5. 其他对接

5.1 背景知识了解

存储规范

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/ 目录下

dcp 目录预处理与实时监控

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生成。

对于并行文件系统obsfs的监控

inofity 不支持 并行文件系统 obsfs的监控
而obsfs通常都位于中心发送端节点,
如果要对中心发送节点的存储进行每个目录的哈希计算,那么需要另外一套计算方法。

5.2 dcp包预处理的对接

为了不影响功能,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
那么,需要主动调用

  1. /root/soft2/addhashtable.sh /data/dcp3/cfec-001/dcps/xiaofang

调用完需要等一段时间,计算完哈希后,系统的免重复功能才可用。不用免重复功能的话无所谓。

/etc/bft2/config.json 中
"machinetype":"local"时无需主动

5.3 安装配置时obs对接

1个桶对应一个 endpoint
所以每一个 中心和结构 都要有自己的endpoint的记录

obsfs 并行文件系统配置规范

一个或多个中心可以有相同的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)

5.4 发送端的配置步骤

系统的/data目录最好和系统盘分开,由一块大硬盘构成。
并且 /data 目录是一整个分区,包括下面的子目录,不是多个分区和文件系统。

使用ubuntu 16.04 版本

5.4.1. 安装apache2, 链接dcp

  1. 先安装apache2 , 链接目录
  1. apt install -y apache2
  2. cd /var/www/html/
  3. ln -s /data/dcp dcp

5.4.2. 设置网络域名等信息,写入配置

vi /etc/bft2/config.json

1 中心 对应---> 1 cdn域名 --> n 机构 ---> n obs桶

设置域名, 安装中心节点时, 需要手工配置这些项, 涉及到 cdnurl, senddomain.
例如:
103.190.190.176 是源站,配置的cdn域名为huaweicontrol.365noc.com, 写入config.json 规定后面不能跟"/".

  1. "senderdomain": "http://huaweicontrol.365noc.com",
  2. "obsurl": "obs://cfec-001", #可以设置一个默认的中心标识-机构id
  3. "cdnurl": "http://huaweicontrol.365noc.com",

其中CDN的配置中,.torrent文件类型的刷新失效时间设为3分钟
其他文件类型可以设置为默认1个月

如果华为云的 obs, cdn,或者边缘云主机的 闲时时段发生了变化,也需要更新,
目前默认值如下:

  1. "bttime": "00:00-23:59",
  2. "obstime": "00:00-08:00",
  3. "cdntime": "08:00-18:00",

5.4.3. 设置obsfs

vi /etc/bft2/config.json

"senderid": "cfec", #设置中心标识, 例如改为wuxi

本地存储类型的发送中心,设置
"machinetype":"local",
云上的挂载obsfs并行文件系统的华为ecs主机发送中心,设置
"machinetype":"hwecs",

本地存储类型的发送中心,如果要上传的数据经常来自本地硬盘存储,设置:
"datasource":"local",
如果经常来自用户上传的obs桶,那么设置:
"datasource":"obs",

5.4.3.1 本地发送中心

片库在本地存储, 最终存储目录是/data/dcp/cfec-001/dcps
每建立一个中心的机构,就建立一个如中心标识-机构id这样的cfec-001的目录

5.4.3.2 华为云发送中心

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

  1. wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsfs/current/obsfs_Ubuntu16.04_amd64.tar.gz
  2. tar -zxvf obsfs_Ubuntu16.04_amd64.tar.gz
  3. cd obsfs_Ubuntu16.04_amd64
  4. bash install_obsfs.sh
  5. apt-get install -y libfuse-dev libcurl4-openssl-dev
  6. ./obsfs --version

https://support.huaweicloud.com/fstg-obs/obs_12_0006.html
已获取访问密钥(AK和SK)

  1. echo AQGKZ0KGJTSMQRWCWXJG:FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0 > /etc/passwd-obsfs
  2. cat /etc/passwd-obsfs
  3. chmod 600 /etc/passwd-obsfs

https://support.huaweicloud.com/fstg-obs/obs_12_0008.html

  1. mkdir /data/dcp/cfec-001
  2. mkdir /data/dcp/cfec-002
  3. mkdir /data/dcp/cfgdc-001
  1. vi /home/startobsfs.sh
  2. 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
  3. 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
  4. 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
  5. chmod +x /home/startobsfs.sh
  6. echo "bash /home/startobsfs.sh" >> /etc/rc.local
  1. /home/startobsfs.sh
  2. 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

5.4.4. p2p相关安装配置

tracker 服务器不必安装新的,统一用原来的 bttracker.top 就可以,以下步骤略过。
如果对于某些私有云一定要求有自己的 tracker时,则可以新建一个,按照下面的步骤安装即可。

5.4.4.1. 搭建Tracker服务器

下载OpenTracker依赖库及源码,编译。

  1. cvs -d :pserver:cvs@cvs.fefe.de:/cvs -z9 co libowfat
  2. cd libowfat
  3. make
  4. cd ..
  5. # LEGACY: cvs -d:pserver:anoncvs@cvs.erdgeist.org:/home/cvsroot co opentracker
  6. git clone git://erdgeist.org/opentracker
  7. cd opentracker
  8. make

5.4.4.2. 加入服务启动项

每次启动后自动运行,可以编辑 /etc/rc.local
加入

  1. # only tracker need this line
  2. nohup /root/soft/opentracker/opentracker -p 6969 -P 6969 >/dev/null &

注意:ctcs默认是几百k, 所以一定要设置。

5.4.4.3. DNS指向变更

为了方便使用,可以将域名指向此IP,例如域名是
bttracker.top, 指向 39.106.122.67

5.4.4.4 配置文件中的p2p配置

根据该中心的tracker进行配置

  1. "tracker": "http://bttracker.top:6969/announce",

5.4.5. 载入配置

curl http://localhost:8191/reloadconf

5.4.6. 测试obs桶的可用性和cdn的可用性

obs ls 可以加上 ak,sk, endpoint参数例如:

  1. obsutil ls obs://cfec-001/dcps/ -i=ak -k=sk -e=endpoint
  1. curl -L http://huaweicontrol.365noc.com

ping 看ip有没有指向非本地中心的ip.

  1. ping huaweiwuxi.365noc.com
  2. ping: unknown host huaweiwuxi.365noc.com

域名解析出错,说明没有配置成功cdn域名

也可以通过 nslookup huaweicontrol.365noc.com 来判断是否存在华为cdn的域名。
例如:

  1. nslookup huaweicontrol.365noc.com
  2. Server: 202.106.0.20
  3. Address: 202.106.0.20#53
  4. Non-authoritative answer:
  5. huaweicontrol.365noc.com canonical name = huaweicontrol.365noc.com.09ca91c8.c.cdnhwc1.com.
  6. huaweicontrol.365noc.com.09ca91c8.c.cdnhwc1.com canonical name = hcdnd101.gslb.c.cdnhwc2.com.
  7. Name: hcdnd101.gslb.c.cdnhwc2.com
  8. Address: 124.202.167.217
  9. Name: hcdnd101.gslb.c.cdnhwc2.com
  10. Address: 124.202.167.216
  11. Name: hcdnd101.gslb.c.cdnhwc2.com
  12. Address: 124.202.167.222
  13. Name: hcdnd101.gslb.c.cdnhwc2.com
  14. Address: 124.202.167.215
  15. Name: hcdnd101.gslb.c.cdnhwc2.com
  16. Address: 124.202.167.221
  17. Name: hcdnd101.gslb.c.cdnhwc2.com
  18. Address: 124.202.167.218
  19. Name: hcdnd101.gslb.c.cdnhwc2.com
  20. Address: 124.202.167.220
  21. Name: hcdnd101.gslb.c.cdnhwc2.com
  22. Address: 124.202.167.219

5.4.7. 更新相关配置到 页面管理平台

如果发运管理平台上有相关参数配置,需要将其填写更新到页面上。

5.5 软件包的镜像网站与安装

ubuntu 16.04镜像

选择一台有域名,有空间的,而且三大运营商都可以访问到的公网ip主机。至少300G空间以上。

  1. apt-get install apt-mirror

vim /etc/apt/mirror.list

  1. 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
  2. deb-amd64 http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
  3. deb-amd64 http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
  4. deb-amd64 http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
  5. deb-amd64 http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
  6. 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
  7. deb-i386 http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
  8. deb-i386 http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
  9. deb-i386 http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
  10. deb-i386 http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse
  11. deb-src http://archive.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
  12. deb-src http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
  13. deb-src http://archive.ubuntu.com/ubuntu xenial-proposed main restricted universe multiverse
  14. deb-src http://archive.ubuntu.com/ubuntu xenial-backports main restricted universe multiverse

执行apt-mirror得到镜像网站。

添加定时

  1. 50 3 * * * root /usr/bin/apt-mirror

增加软连接

  1. ln -s /var/spool/apt-mirror/mirror/archive.ubuntu.com/ubuntu /var/www/html/ubuntu
  2. 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/

  1. ###### Ubuntu Main Repos
  2. deb http://domain.com/ubuntu/ xenial main restricted universe multiverse
  3. ###### Ubuntu Security Repos
  4. deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
  5. ###### Ubuntu Update Repos
  6. deb http://domain.com/ubuntu/ xenial-updates main restricted universe multiverse
  7. deb http://domain.com/ubuntu/ xenial-backports main restricted universe multiverse
  1. ###### Ubuntu Main Repos
  2. deb http://103.90.190.176/ubuntu/ xenial main restricted universe multiverse
  3. ###### Ubuntu Security Repos
  4. deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
  5. ###### Ubuntu Update Repos
  6. deb http://103.90.190.176/ubuntu/ xenial-updates main restricted universe multiverse
  7. 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

修改替换完成后,执行下面命令测试

  1. apt update

cpan

因为要用到 cpan网站安装一个模块。
为了避免国外网速太慢,造成安装速度慢,可以镜像到本地网站。如在华为云或者阿里云上。(不要只安装在某个网络如联通内,可能移动等网络访问不了)

建目录,链接到 www root

  1. mkdir /data/CPAN -p
  2. cd /data/CPAN
  3. curl --connect-timeout 10 -L https://cpanmin.us > cpanminus
  4. ln -s /data/CPAN /var/www/html/cpan

手工执行

  1. rsync -av --delete ftp.funet.fi::CPAN /data/cpan/project/CPAN/

添加定时任务

  1. * 20 * * * root /usr/bin/rsync -av --delete ftp.funet.fi::CPAN /data/CPAN/ >/dev/null 2>&1

修改完后, http://xxx/cpan 可以访问到后. xxx 指此网站域名。
通过

  1. cpanm --mirror http://47.92.93.51/cpan/ -n --reinstall JSON

测试
显示:

  1. --> Working on JSON
  2. Fetching http://47.92.93.51/cpan/authors/id/I/IS/ISHIGAKI/JSON-4.03.tar.gz ... OK
  3. Configuring JSON-4.03 ... OK
  4. Building JSON-4.03 ... OK
  5. Successfully reinstalled JSON-4.03
  6. 1 distribution installed

客户端修改

修改安装脚本vi install-ctorrent-ubuntu-16.04.sh

  1. cpanmcmd="cpanm --mirror http://mirrors.163.com/cpan/ -n "

将地址改为自己网站的地址。
http://47.92.93.51/cpan/

另外,cpanminus 的下载安装也可以换成相应网站地址

  1. curl --connect-timeout 10 -L http://47.92.93.51/bftv2/cpanminus | perl - --sudo App::cpanminus || apt install -y cpanminus
  2. fi

6. 说明

6.1 开发时排查问题顺序checklist

  1. 检查 /etc/bft2/config.json 确认 sender, receiver, cacher类型, 根据类型确认存储目录等特性,receiver的A,B类型 确保没有来回切换造成的混乱
  2. ps -ef |grep mhash 检查mhashtable.sh是否在服务和运行, /var/log/bft2/mhashtable.log的输出日志来检查,是否在正常写入存储目录的哈希
  3. curl http://localhost:8191/reloadconf 来重新载入配置,查看配置是否有错误.
    curl http://localhost:8191/showschedules
    查看当前的运行调度的时间任务,是否与你执行和期望的相同。

  4. 检查cdn刷新配置,确保发送端的.torrent文件,-tmp.torrent文件与接收端的文件内容一致, 也可以通过http://localhost:2780/页面来查看同名目录种子文件的内容的一致性

  5. 对比发送端和接收端的task.json是否一致,除去localsamefiles去重后的btlist,obslist,cdnlist的部分。检查 生成时间接收时间是否正常。 如果找不到可以到发送端的/data/sender下,接收端的/data/receiver下搜索相关文件
  6. 查看相应时间点的/var/log/bft2/bftv2.log 看提示信息。
  7. 通过自动发送和自动接收的脚本来执行发送接收。
    /root/soft2/test/ 目录下
    发送端执行autosend.sh ,执行完毕后,
    // 自动发送流程整合, gentask, taskfilesquery, send, uprogress

接收端执行autorecv.sh , 最后查看要发送的任务是否100%正确。
// 自动接收流程整合, scp 103.90.190.190 taskfile, recv, progress, checkdcp by ctorrent -c.

假设发送端是 103.90.190.176

  1. # 接收端仅执行1次, 增加免密登录功能
  2. ssh-keygen
  3. ssh-copy-id root@103.90.190.176
  4. # 发送端执行
  5. ./autosend.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV 1:1:1 fulltime cfec-001
  6. # 接收端执行
  7. autorecv.sh
  8. ./autorecv.sh SmartShow1920_FTR-1-25_F-178_20_2K_20200715_SMPTE_OV cfec-001 true 103.90.190.176

6.1.1 相关知识

现有接收端种子,ctorrent -c 发现

progress 时判断不同方法已下载大小的方法

bt, obs, getduSizeprocess

  1. du -s --block-size=1 /data/transfer/bt/wuxi-001/
  2. du -s --block-size=1 /data/transfer/obs/wuxi-001/
  3. cdn: DirSize
  4. cd dir;
  5. find . ! -type d -printf '%s\n' | paste -sd+ - | bc

tms中 obs桶的秘钥存储

/usr/tms/code/tms_server/tms.properties

  1. ##################
  2. ####BFT V2.0默认配置
  3. ##################
  4. tms.server.bft.torrent.seedtime=168
  5. tms.server.bftv2.torrent.deloldtorrent=1
  6. tms.server.bftv2.datasource.wuxi-001=obs
  7. tms.server.bftv2.obs.ak.wuxi-001=AQGKZ0KGJTSMQRWCWXJG
  8. tms.server.bftv2.obs.sk.wuxi-001=FVFrFGivQ3OXrCls8HXRbqQJuzxhNTr0ecmG9gj0
  9. tms.server.bftv2.obs.endpoint.wuxi-001=obs.cn-north-4.myhuaweicloud.com
  10. tms.server.bftv2.btobscdn.wuxi-001=1:0:0
  11. tms.server.bftv2.policy.wuxi-001=fulltime

6.1.2 现象分类与排查步骤

6.1.2.1 如果一直未完成状态downloading, 而进入不了downloaded 查看

  1. 查看 发送端 是否 available 100% , 说明发送端种子和文件对应不上。因为每次生成策略文件,重新分配,会重新生成tmp的torrent和相应tmp目录。
  2. 到 /data/transfer/bt 下查看 -c -tmp.torrent 是否available100%
  3. 判断原因,
    A. 可能是发送端没有删除旧的就发送策略和.torrent种子,而当前的和旧种子或目录不一致。
    B. 也存在一种原因是,发送端在100%avialable时,网络中断,导致tracker连不上,所以重新启动发送端直到 2780 就100%, 再来看接收端。
    B.1 也是发送端发现not 100% available那就重试.

6.1.2.2 downloaderr 状态

  1. 查看 /data/receiver/downloading/xx.err 内容,尝试命令,查看
    查看返回 err exit code 了知原因
  1. 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
  2. ta/transfer/cdn/wuxi-001/8d9c0142-dfce-4bcd-bff9-54cbc20170b2/pkl_7005a21c-e09e-4875-8757-bc6f9dedb9f7.xml
  3. 6

其中的err exit 是6, 表示 resolve hostname error. 说明下载时域名无法解析。

  1. 解决办法是程序内部重试5次每次5分钟, 记录 err 到 errhistory

6.2 api手工测试相关

一个可以执行脚本的测试工具,测试用例见所有.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下载说明

cdn 下载会尝试多次,每次拉大时间间隔

  1. 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
  2. % Total % Received % Xferd Average Speed Time Time Time Current
  3. Dload Upload Total Spent Left Speed
  4. 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0Warning: Transient problem: timeout Will retry in 1 seconds. 999 retries left.
  5. 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 2 seconds. 998 retries left.
  6. 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 4 seconds. 997 retries left.
  7. 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0Warning: Transient problem: timeout Will retry in 8 seconds. 996 retries left.
  8. 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0Warning: Transient problem: timeout Will retry in 16 seconds. 995 retries
  9. Warning: left.
  10. 100 4253k 100 4253k 0 0 389k 0 0:00:10 0:00:10 --:--:-- 963k

6.3 命令行脚本说明

以下脚本都默认cfec-001为中心和机构标识,也可传参修改,修改中心标识脚本参数, 以联通中心为发送端,并从其uploaded/远程复制下载任务json

如果变更了中心发送节点,那么需要手工修改shell来替换中心地址为新的发送端地址。

使用前准备

接收端增加免密登录功能

第一次增加免密登录的话,执行
ssh-keygen
提问都取默认值回车即可。

然后将秘钥复制到发送端
ssh-copy-id root@121.36.106.24
提示输入密码,输入即可。
然后就可以使用如下脚本了,只是需要加上 121.36.106.24 的发送端ip的这个参数

发送端添加obs信息

找系统管理员,获取 endpoint, ak,sk等信息
写入/root/soft2/test下的 gentask.sh,autosend.sh 这2个脚本的相应行

  1. elif [[ $basesubdir == "wuxi-001" ]];then
  2. endpoint=obs.cn-north-4.myhuaweicloud.com
  3. elif [[ $basesubdir == "wuxi-002" ]];then
  4. endpoint=obs.cn-north-4.myhuaweicloud.com
  5. 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 # 看门狗日志

基本测试流程说明

  1. 发送端生成哈希表
    inithashtable.sh /data/dcp/cfec-001/dcps/xiaofang
  2. 发送端生成任务
    ./gentask.sh xiaofang 1:1:1 fulltime cfec-001
  3. 查询任务文件是否完成
    ./query.sh xiaofang
  4. 发送端发送任务 , 查询任务上传进度
    ./send.sh xiaofang
    ./uprogress.sh cfec-001-xiaofang
  5. 接收端接收任务, 查询下载进度和速度
    ./recv.sh xiaofang
    ./progress.sh cfec-001-xiaofang
  6. 取消任务
    ./cancel xiaofang
  7. 测试与1.0的同名任务兼容性问题
    ./recv2.sh xiaofang
  8. 修改 /etc/bft2/hashtable.txt 测试重复下载

开发用测试用例与流程说明

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完整性

testapi.sh

说明: 发送端执行 (有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

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-repeated.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记录
检查完整性

testapi-schedule-send.sh

目的:测试不同的时间下的闲时下载,闲时下载,非闲时停止

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分钟内完成的任务,并记录。

testapi-schedule-recv.sh

目的:测试不同的时间下的闲时下载,闲时下载,非闲时停止

A. 接收5个2分钟内下载完成的小任务,判断当下没有开始下载,3分钟后开始下载。下载完成校验dcp。

B. 查看 showshchedules, 是否符合预设任务时间调度情况

C. priortime 接收的大文件任务,看时间到时,是否有进程,时间结束时是否结束并且无error结束。
等2天后看下载进度有无增加,或者完成。

整体模块的功能与输入输出

文档输出:
安装文档
发送端配置文档
bft2接口文档
方案文档

分组传输接口说明

私有分组传输功能作为一个单独的模块,其接口见其他文档:BFT分组传输方案与接口

私有分组配置文件说明

分组标识与密码如下:
/etc/bft/groupsettings.json
统一配置文件,与TMS共用,

  1. {"Groupid":"joyfullness","Password":"1234"}

种子服务器的地址和相关配置信息:
/etc/bft/serversettings.json

  1. {
  2. "Groupserver":"minio.prod.365noc.com:13490",
  3. "User":"minio",
  4. "Password":"minio^YHN9ij",
  5. "Randuplimit":30,
  6. "IsglobalCache":false
  7. }

存储所有的已经下载的私有分组种子
/etc/bft/downloadedtorrents.txt

  1. testonly_dirsend.torrent 2020-07-22T11:49:57
  2. testonly_masterslave.torrent 2020-07-22T11:49:57

种子的存储路径则在savepath:/data/dcp下,与BFT的存储种子与目录的路径一致。

分组传输日志:
/var/log/bft/bftgroup.log

7. 其他

安装

系统网络环境配置与BFT安装维护 (密码123)
https://www.zybuluo.com/zhongdao/note/1399949#4-%E5%AE%89%E8%A3%85
见第4章. 安装 的 v2版最简安装 的内容

fatal error: runtime: out of memory

增加交换分区的大小,
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

安装时的交换分区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

体现在 install-bftv2-ubuntu-16.04.sh 如下

  1. sudo grep "/data/swap/swapfile" /etc/fstab
  2. if [ $? -eq 0 ]; then
  3. t=`free -g | tail -1 | awk '{print $2}'`
  4. echo "found swapfile total $t G"
  5. if [[ $t > 10 ]];then
  6. echo "greater than 10G swap space.";
  7. else
  8. echo "less than 10G swap space.";
  9. fi
  10. else
  11. echo " add swapfile 20G"
  12. mkdir -p /data/swap
  13. cd /data/swap
  14. dd if=/dev/zero of=swapfile bs=1024 count=20000000
  15. mkswap -f swapfile
  16. swapon swapfile
  17. echo "/data/swap/swapfile /swap swap defaults 0 0" > /etc/fstab
  18. fi

profiling

https://blog.golang.org/pprof

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/

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注