Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[question]关于supernode 存储的疑问 #50

Closed
nonly opened this issue Apr 16, 2018 · 16 comments

Comments

Projects
None yet
4 participants
@nonly
Copy link
Contributor

commented Apr 16, 2018

种子文件和文件的元信息都是存储到本地了么;
种子文件是不是应该持久化到数据库中呢?
从代码里没看到数据库相关的操作。

@nonly nonly changed the title 关于supernode 存储的疑问 [question] [question]关于supernode 存储的疑问 Apr 16, 2018

@lowzj lowzj added the question label Apr 17, 2018

@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 17, 2018

文件,文件的元信息,分片信息都存储在supernode本地硬盘上。
蜻蜓本质上是一个p2p模式的下载工具,适用于大规模的文件下载,不做存储,但是有类cdn的功能,加快下载速度;同时supernode有机制清理已下载的文件,所以没有必要对种子文件持久化。如果文件不存在,supernode会回源进行下载,建立文件元信息,分片信息。

@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 17, 2018

supernode 一个集群内的节点之间没有数据同步么?
supernode节点之间做负载均衡,而种子文件却没有共享,会不会降低分发速度,同一份源文件会被不同supernode重复下载吧?

@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 17, 2018

而且当源不可用的时候,例如镜像仓库,也无法充分利用peer之间的镜像数据。

@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 17, 2018

目前开源版没有缓存共享功能,同一份源文件可能会被不同supernode重复下载。目前正在推动内外版本合一,会逐步开放内部高级特性到开源版,也会将开源版新增特性回归内部版本。

@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 17, 2018

  1. 缓存共享中的缓存具体是什么,是种子文件还是源文件呢?
    2.我测试了下,supernode本地的*.meta文件就是分片信息吧,这个就是种子文件么?
@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 17, 2018

  1. 是源文件经过分片处理后的文件。
  2. *.meta是文件元信息,保存文件的md5,访问/更新时间,文件地址,分片大小,任务id等。*.md5是分片信息,保存每个分片的md5和大小。同一个源文件在不同supernode上的meta/md5文件是一样的。
@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 17, 2018

  1. 我理解的种子文件是包含每个分片对应的dstCid列表的,大致看了代码,种子信息是保存在内存的吧,没做持久化;
  2. 而且现在返回的并不是一个资源ip列表,不知道是不是我理解错了。
@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 17, 2018

我还是没理解:种子文件为啥不需要持久化和数据同步;
对于不太活跃的源文件(可能同时有几个客户端下载),测试下,如果还需要重新通过supernode下载并解析的话,下载速度比直接回源下载慢不少的。

@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 18, 2018

种子文件里一般包含: 要下载的文件分片信息,tracker服务器地址。tracker相当于一个问询服务器,用于告诉下载者,你正在下载的文件,同时还有哪些人也在下载。

使用蜻蜓下载文件时,使用方式跟我们常见的BT不同,与wget基本一致,符合开发人员习惯:

dfget --url downloadUrl --node 127.0.0.1

其中--url指定你要下载的文件,--node指定supernode地址。

蜻蜓的supernode就相当于p2p下载模式下的tracker服务。同时supernode也要扮演peer角色,如果要下载的文件不在supernode本地(可能第一次下载,源文件已修改或者磁盘清理机制删除),则会回源下载到supernode本地(计算并按分片下载),成为此文件最初的peer,然后供dfget下载。所以一般单任务第一次下载文件会比直接用wget从源下载慢。

wget不同的是,dfget在启动下载任务时,还会启动一个上传服务,每当下载完一个分片后,汇报给supernode,成为此分片的peer。当有其他dfget任务下载同一个文件时,则会从supernode处得到分片与peer的对应关系,从而从其他dfget端下载。

dfget下载完文件的所有分片后,也不会像wget那样马上结束进程,而是等待所有上传任务结束。当dfget进程结束,也就从supernode分片peer列表中删除了。

所以分片与peer的映射表是在短时间内生成、变化、删除。如果每次变化都要入库,在大规模同文件分发/小规模大量不同文件下载的场景下,数据库压力很大,速率比直接内存操作慢了很多量级。

当某时刻只有一个dfget任务下载时,supernode类似cdn。这样的好处是源流量明显降低,加速下载速度,尤其是当源不在集群内部网络环境中,当然这也要还取决于supernode的机器配置和网络带宽。

对于不太活跃的源文件(可能同时有几个客户端下载),测试下,如果还需要重新通过supernode下载并解析的话,下载速度比直接回源下载慢不少的。

多客户端下载时,并不是每个客户端的分片任务都会从supernode下载,supernode会调度下发分片peer映射表供其下载。对于长时间没被下载的文件,在supernode本地可能会清理掉,下次下载时会稍慢。

@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 18, 2018

@lowzj 感谢解答,非常详细;

@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 19, 2018

@lowzj 我的理解:其实每个supernode维护的peer映射表是不一样的,对于同一个文件,任何supernode都不知道全部所有者。任何supernode挂掉,他维护的peer信息都会丢失;那peer就再找另外一台supernode重新做种。
1)是认为大规模文件分发的场景下,重新做种速度足够快,一些supernode宕机影响不大,还是会提高下载速度的吧?
2)另外,当一些peer宕机(包含supernode),peer映射表某些ip失效的情况下,是采用peer回源取文件还是peer回supernode取文件呢?

@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 20, 2018

@nonly 理解的基本正确。

  1. 当前版本是存在单点问题,一般建议每个机房或集群部署两个supernode。后续会逐步增强稳定性。
  2. 如果是supernode宕机,客户端会重新去另一台supernode注册;如果是客户端宕机,其他客户端相应分片任务下载失败,请求supernode重新获取新的映射表,重新下载分片。
@nonly

This comment has been minimized.

Copy link
Contributor Author

commented Apr 20, 2018

我看到roadmap提到peer回源,是什么场景下回源?我以为就是第2点中提到的场景。

@garfield009

This comment has been minimized.

Copy link
Contributor

commented Apr 20, 2018

@nonly nonly closed this Apr 21, 2018

@wu1405

This comment has been minimized.

Copy link

commented Apr 23, 2018

请问dragonfly.conf,如果我配置多个supernode,每个supernode的访问权重是一样的吗?是轮询的方式吗

@lowzj

This comment has been minimized.

Copy link
Member

commented Apr 23, 2018

@wu1405 非相关性的问题,请重新开一个issue提问。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.