IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

p2p数据分发

Makeinstall 2010-09-27 08:43:05 累计浏览 3,866 次
本机暂存

分享下2年前做过的一个传输项目,比较粗糙,当年的相关文档找不全了:(

背景:

运维中经常遇到这类传输需求,A生成数据,然后将数据分发到下游B1,B2,B3….Bn。传统的做法有如下几种:

  1. A生成数据文件后,顺带生成flag(标记文件)。下游机器配置定时任务,定期探测A机器的数据是否生成,当生成后通过wget下载
  2. A生成数据文件后,直接通过scp将数据推送到下游机器。

上述方式一般都采用系统命令和SSH信任关系,对系统依赖较强,当IP/域名发生变化、wget/ssh版本不同、机器增删时都会导致传输异常。而且还需要考虑限速、续传、数据完整性等因素,甚至有些变态需求,如数据需要同时到达下游N台机器。所以设计了一套传输工具,替代scp/wget的方式,采用推送的方式将数据分发到下游,提供p2p、限速、传输中校验的功能。

主要功能:

  • 1对N数据传输
  • 支持P2P功能、分块大小,可开关
  • 支持传输限速、续传、重试功能
  • 支持传输完成后调用外挂程序功能
  • 支持目录嵌套的文件传输
  • 支持排除与指定正则表达式匹配的文件或目录的传输
  • 可实时查询传输状态
  • 支持对数据校验的可配置
  • 上游身份认证功能
  • 传输配置统一管理 
  • 支持send_file选项函数开关


设计思路:

1

  • KungFu Panda:功夫熊猫,简称KFP。
  • CAC:配置验证中心,负责集中管理传输数据的配置,包括wugui可以将数据发给那些po,用什么方式传输。po通过CAC验证发送传输请求的wugui是否合法等
  • Master Wugui控制端,其中功能包括种子(sed)的生成发送、第一次数据传输、传输控制等
  • Po常驻内存。按照Master Wugui的控制,接受数据并提供po之间的数据传输。
  • 数据块:使用c++的bitset 定义bitmap,默认每个数据块大小为2MB。Bitmap大小为51200及支持每次传输不超过100G的数据
  • 数据块组:将总数据块分成n份,每一份就是一个数据块组。一个数据块组中包含多个数据块。

    流程描述:

    懒得找图了,直接文字说明。详细的异常处理逻辑太多了,此处省去N千字,如果需要可以联系我:)(如,po机器死机、po网络中断、po下载过慢、避免单个po压力过大、避免master相对较闲等处理逻辑)

    1. 假设master控制3个po程序,将数据分成N块,然后将这些数据块分成3(按照下游po的数量)个数据块组。
    2. master生成种子信息,并连接CAC获取本次传输需要连接的po信息及相关配置。
    3. CAC授权本次传输,并生成随机的密钥。master通过获取的密钥,连接正确的po。
    4. po连接CAC验证密钥正确性后,本次传输开始
    5. po1第一次从tr获取第一个数据块组。第一次接收到从master第一个数据块组后,再分别从po2和po3上下载剩余的2个数据块组
    6. po1完成第一次数据块组下载后,按照master的控制,连接po2下载自己没有的数据块(第二个数据块组)
    7. po1完成第二次数据块组下载后,按照master的控制,连接po3下载自己没有的数据块(第三个数据块组)
    8. po2 和 po3 依次类推,循环连接其余po机器,完成数据下载。
    • master和po中都会配置CAC的IP,CAC一般为多个,连接任意一个进行认证即可。是否开启P2P,限速以及传输后的动作都在CAC中进行配置。
    • CAC采用epoll模式,读取配置并生成密钥,性能不是瓶颈
    • 数据校验采用传输中校验,可以将全部校验再传输的cpu峰值降低,校验算法提供CRC和MD5 2种。

    运行方式:

    在每次传输时,master需要指定本次传输的类型,master通过类型连接CAC获取相关配置。

    ./masterwugui -c base1 -x a.txt b.txt c.txt -p /home/work/data/base
    ./masterwugui -h
    ./masterwugui -v
    其中,-c用于指定传输的classname
    -x用于指定排除的文件,可以是多个文件
    -p用于指定源文件的目录
    -h显示帮助信息
    -v显示版本信息

    po和CAC都是常驻内存运行,无参数。

    优缺点:

    优点

    1. 源端机器负载过大,挂载的下游机器有限
    2. 简化数据传输脚本的编写,将超时、限速、数据验证功能集成
    3. 提高下游的机器数据获取的速度
    4. 简化数据传输时对系统的依赖,如:ssh信任关系、proftp、wget、scp…
    5. 中配置管理,数据安全认证

    缺点:

    1. 下游机器的负载会比传统wget负载载有所提升,可以通过限速进行控制。
    2. 传输的数据总大小有限制,不能超过100G
    3. 每次传输最多支持200个PO,如采用P2P模式,瓶颈还是在上游(已经有解决方案,下次分享)

    测试:

    • 测试环境:3台cac, 1台wugui, 20台po
    • 测试数据:9.1G

    case1:限速10m,且数据校验

    2

    case2:不限速,且数据校验

    3

    case3:不限速,不校验

    4

  • 同分类推荐文章

    1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
    2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
    3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

    查看更多 DevOps 文章 →

    建议继续学习

    1. Twitter/微博客的学习摘要 (累计阅读 12,262)
    2. 面试题 – 为什么我的朋友圈不见了? (累计阅读 11,953)
    3. Zookeeper研究和应用 (累计阅读 9,484)
    4. 分布式哈希和一致性哈希 (累计阅读 8,815)
    5. 面试IT业界顶尖企业所应该知道的10道题(1) (累计阅读 8,527)
    6. python实现一个P2P文件发布 (累计阅读 7,926)
    7. 在百度的第一年 (累计阅读 6,922)
    8. Memcache分布式部署方案 (累计阅读 6,818)
    9. 大数据下的工行 (累计阅读 6,643)
    10. ZooKeeper管理员指南——部署与管理ZooKeeper (累计阅读 6,590)