Gingko - 百度内网用于数据分发的P2P传输工具


Gingko ——百度内网P2P传输工具 刘明 • 百度,研发工程师 – 参与内网p2p传输工具gingko的完整设计与研发 • 联系方式 – E-mail:liuming03@baidu.com – weibo:@csuliuming 目录 背景 Gingko简介 Gingko的主体框架 Tracker 客户端 Gingko应用场景——全网分发 背景 • 在1000台机器上部署一个程序包 • 在全公司数十万机器上部署一份java包 • 将数据周期性的分发到一批机器上 使用单机下载工具 • 每台机器可以用wget/scp/curl从数据源下载 Host Host Host Host Source host … Wget/scp/curl 直到遇到… 原因——并发数太高导致! • 连接数不足——connection refused • Proftpd/sshd子进程数太多——资源耗尽 • 网卡到达上限——网卡报警 设置并发度 Source host Host Host Host Host Host Host Host Host Host ① ② ③ • 对机器进行分组——组内并行,组间串行 还是有问题 • 应用程序的逻辑变得更加复杂 • 部署系统/数据分发系统等每个系统都需要 重新写一遍几乎同样的串并行控制逻辑 • 传输有先后顺序,总体速度显著降低 于是我们有了第一代p2p传输工具 Host Host Host Host Source host … p2p 但这就行了吗? • 数据源的server是个单点 – 下游peer数不能超过1000 • 长尾——总有几个拖后腿的 • 源在hdfs上,需要做一次中转 • 下载速度还不够快 另外——关于流量控制方面 目录 背景 Gingko简介 Gingko的主体框架 Tracker 客户端 Gingko应用场景——全网分发 Gingko是什么? • 公司内网p2p数据分发工具(平台) • 简单的说:只要是1对多的数据分发都可以 通过gingko来完成。 – 数据/配置的周期性分发 – 程序包的部署 – 索引、广告库的下发 Linux下类似工具 • Ctorrent – http://ctorrent.sourceforge.net/ • µTorrent – http://www.utorrent.com/ 为什么要自己再做一个? • 外部的p2p工具更多的是给普通用户使用, 而非工业化系统使用。 • All in automation——让数据分发更加自动化 • 定制化的功能点——站在巨人的肩膀上 • 高性能的tracker服务器 • 流量可控 Gingko需要解决的问题 • 一对多的数据分发 – 大规模——全公司所有机器 – 全并发——同时 – 整体分发速度要快(1.8T T表示单机传输耗时) – 减少长尾 • 网络流量控制 – 数据源总体网络流量限速 – 减少跨机房/跨地域流量 • 支持异构的hdfs/http源 Gingko当前使用现状 • 每天传输的数据量——700TB+ • 每天下载调用次数——1600w+ • 覆盖公司产品线数——150+ • 节省90%的跨地域流量 • 支持全内网统一部署一个程序包——java/os image等 目录 背景 Gingko简介 Gingko的主体架构 Tracker 客户端 Gingko应用场景——全网分发 首先,在整体架构上 于是我们引入了tracker服务器 • 化单点为集群化的服务,保证高可用性 • 记录每个peer都在下载什么数据以及状态 • 供所有peers查询与其下载同一份数据的其 他peers列表 • 控制peers连接范围,减少跨地域跨机房流 量 Gingko主体架构 • 客户端 – Libtorrent库 – 一些修改和定制 • Tracker • Thrift rpc + redis tracker peer peer peer announce BT protocol redis 目录 背景 Gingko简介 Gingko的主体架构 Tracker 客户端 Gingko应用场景——全网分发 高性能tracker • 内网统一的tracker集群 • 负载均衡 – 当前6个tracker实例(包括冗余)扛住了内网所 有流量 • 高并发 – 单tracker实例1.8w qps吞吐量 Announce • Announce request – Infohash – Ip:port – Idc – Status – Is_seed – Num_want • Announce response – Peers – Have_seed tracker peer peer Seed peer 2. Return peers list 1. Announce to tracker Tracker的基本实现机制 • 通信协议和模型 – Thrift rpc(libtorrent扩展增加对其的支持) – Nonblocking muti-thread • 存储 • memery——绝大部分下载的peers • Redis——种子peers及抽样做种的peers 提高tracker的性能 • 数据结构 – unordered_map:infohash管理 – unorderd_map >:peers管理及更新 – Vector >:peers查询 • 合并redis请求 – 大量查询请求都是在同时请求同一个infohash – 用独立线程的pipeline处理增删peer的请求 • 过期处理 – Peer退出时发送带有stop状态的消息 – Infohash在过期后自动删除,连带其关联的peers列表 Tracker的扩展性 • Tracker实例 – Routing table – 智能DNS + LVS • Redis实例 – 对infohash做一致性hash Routing table Tracker集群架构 DNS BJ HK JP HD jx tc m1 nj hz Redis 1 Redis 2 Redis 3 Redis 4 announce 智能DNS LVS Tracker集群 Redis集群 流量控制 • 流量优先级:从高到低 – 同网段——通过ip白名单和掩码 – 同机房 – 同地域——idc流量少的链路优先 – 跨地域 • TOS标签 跨地域处理 Redis tracker peer peer tracker peer peer Seed peer peer 1. announce 2. No seeding peer 2. Save seeding peer to redis 3. Get seeding peer from redis bj hd 目录 背景 Gingko简介 Gingko的主体架构 Tracker 客户端 Gingko应用场景——全网分发 客户端 • 常驻进程bbts-agent – 用来提供后台做种服务 • 命令行工具Gko3 – 生成种子文件 – 与agent交互 – 下载数据 • 实现方案 • Libtorrent——bt协议 • Thrift rpc——与tracker通信 做种 • 单机做种 – 后台agent统一提供本机的所有做种服务 – 控制单机总上传带宽 • Http做种 – 支持BEP 19,方便http为数据源的p2p下载 • Hdfs做种 – 支持以hdfs为数据源的p2p下载 下载方式 • 通过种子文件(*.torrent)下载数据 – 需要先将种子文件分发到下载机器上 • 通过infohash下载数据 – Infohash:40字节的数据唯一标记 – 先下载种子文件,再下载实际数据 – 下载种子文件也是通过p2p方式,减少源压力 当前gingko支持的主要功能点 • 文件过滤——如过滤目录中的日志文件 • 部分下载——只下载目录中的部分文件 • 断点续传 • 下载完成后后台做种——加速 & 分享 • Direct IO • Ip白名单,掩码 • 动态磁盘预分配——减少磁盘碎片数 原生支持hdfs源 • 生成种子文件 – 数据在单机,用gko3 mkseed生成 – 数据在集群,Hadoopseed 遍历hdfs路径 Mapreduce计 算分片sha-1 编码生成种 子文件 Hdfs/http 混合p2p下载示意图 gko3 gko3 gko3 Hdfs(or httpd) tracker Hadoopseed 1. list files 2. MapReduce for generate torrent file 3. Download from hdfs by libhdfs 3. Download by p2p Hdfs与p2p混合下载方式 • 下载 – 一些未下载分块直接从hdfs上下载 – 大部分未下载分块通过p2p下载 • 限速 – P2p下载和hdfs下载限速统一 – P2p下载流量优先(80%+流量通过p2p下载) Hdfs-p2p混合下载模块组织 • 使用动态链接库作为扩展 Gko3 core Hdfs-plugin.so Other-plugin.so Hdfs api other api API 目录 背景 Gingko简介 Gingko的主体架构 Tracker 客户端 Gingko应用场景——全网分发 gingko 数据 配送 部署 传库 扩容 全网 分发 为什么要做全网分发? 所有机器都有一些公共的需求 • 运行环境:java/python/kernel/os image • 公共库:*.so • agent & tools 全网分发的目标 基本解决方案 nginx nginx nginx Download下载集群 (万兆网卡机器) Host Host Host Host Host 将每台机器的下载任务启动时间打散在15分钟内 …… …… 成效与问题 • <10M的agent/tools – 15分钟内即可内网全量部署 • >10M的java/python – 包的体积大 – 下载集群压力大 – 会否造成内网大规模流量导致瘫痪? p2p全网分发需关注的问题 • 自动化、可运维 • 只允许idc内部互传,不允许跨idc互传 • 出现异常时能够快速止损 架构模型 tracker lighttpd 物理idc 逻辑idc 1 …… 逻辑idc n 快速止损 tracker lighttpd 物理idc 逻辑idc 发送stop消息 stop 全网分发——实际效果 • 源:lighttpd • 规模:数十万台机器 • 数据大小:700M左右(os image) • 下载限速:2M/s • 耗时:约30分以内 • 分享率:99.5% Thank you!
还剩55页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

n8cx

贡献于2014-08-24

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf