技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> p2p数据分发

p2p数据分发

浏览:2792次  出处信息

分享下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. python实现一个P2P文件发布    (阅读:6802)
    2. NAT连通性测试工具以及Flash P2P中的NAT穿透原理    (阅读:4662)
    3. Amazon分布式系统Dynamo    (阅读:4440)
    4. 提升PHP性能之改变Zend引擎分发方式    (阅读:1944)
    QQ技术交流群:445447336,欢迎加入!
    扫一扫订阅我的微信号:IT技术博客大学习
    © 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

    京ICP备15002552号-1