minicdn 简约的CDN minicdn

agolangf • 3130 次点击    
这是一个分享于 的项目,其中的信息可能已经有所发展或是发生改变。
## MiniCDN 一般来说会推荐采用 qiniu 或者 upyun,又或者是 amazon 之类大公司的 cdn 服务,不过当需要一些自己实现的场景,比如企业内部软件的加速,就需要一个私有的 CDN 了。 极简内容分发系统是我在公司里面的一个项目,最近把他开源出来了。可能其他企业或者组织也需要一个类似的东西。 通常来说 CDN 分为 push 和 pull 两种方式,push 比较适合大文件,pull 适合小一些的文件,但是使用起来比 push 要简单的多。 MiniCDN 采用的就是 pull 这种方式,目前的实现方式是所有缓存的文件存储在内存中,使用 LRU 算法淘汰掉就的文件,镜像的文件受限于缓冲区的大小(目前的缓冲区是512M),如果超过了这个缓冲器大小,就没有加速的效果了。 没有所有的智能 DNS,直接用的是最简单的 http redirect。 还没写负载均衡,所以 redirect 的时候,就是随机返回一个节点(简单粗暴) MiniCDN 分为 manager 和 peer。都是写在一个程序里。 我平常用的时候,就只开一个 minicdn 的 Manager 来加速我的后端服务器。如果没有节点的话,manager 就会把自己当成一个节点。然后当有特别大的下载即将要冲击我的服务器的时候。我就会找很多的同事,将 minicdn 部署到他们平常用的电脑上(window系列, 因为是golang语言写的,什么平台的程序都能编译的出来)。这样我在短时间内就拥有了一个性能不错的 cdn 集群(充分利用同事的资源)。当下载冲击结束的时候,在把这些节点撤掉就可以了。相当省事 ## 技术优势 MiniCDN 使用了谷歌开源出来的 groupcache 框架,目前dl.google.com后台就用到了groupcache,性能而言远超那些squid或者nginx-proxy-cache. groupcache 的数据获取过程很有意思,我把他翻译了过来 **groupcache 的运行过程** [原文地址](https://github.com/golang/groupcache#loading-process) 查找foo.txt的过程(节点#5 是N个节点中的一个,每个节点的代码都是一样的) 1. 判断foo.txt是否内存中,并且很热门(super hot),如果在就直接使用它 2. 判断foo.txt是否在内存中,并且当前节点拥有它(译者注:一致性hash查到该文件属于节点#5),如果是就使用它 3. 在所有的节点中, 如果foo.txt的拥有者是节点#5,就加载这个文件。如果其他请求(通过直接的,或者rpc请求),节点#5会阻塞该请求,直接加载完毕,然后给所有请求返回同样的结果。否则使用rpc请求到拥有者的节点,如果请求失败,就本地加载(译者注:这种方式比较慢) groupcache 是2013年写出来的,软件也不怎么更新了。里面的 HTTPPool 还有两个问题一直没有修复,这两个问题直接影响到节点之间不能交换数据。因为官方不用 groupcache 的这部分,所以连用户提的 issue 都不修(真是蛋疼) [https://github.com/codeskyblue/groupcache](https://github.com/codeskyblue/groupcache) 是我fork的,把这两个问题修复了,虽然提了pr,不过感觉他们一时半会不会merge的。 受 python-celery 的启发,我实现了 peer 退出时候的两种状态(Warm close and Code close)。 Warn close可以保证党节点不在服务的时候才退出。Code close就是强制退出,下载者可能会发现下载中断的问题。 ## 架构 * M: Manager * 负责维护Peer的列表,每个peer会去Manager同步这个列表。 * 所有的请求会先请求到manager, 然后由manager重定向到不同的peer * P: Peer * 提供文件的下载服务 * Peer之间会根据从manager拿到的peer列表,同步文件 Manager 与 Peer 是一对多的关系 <pre>[M]  |`------+--------+---......  |       |        |[P]     [P]      [P]  ....</pre> ### Run Manager 命令行启动 <pre class="brush:cpp ;toolbar: true; auto-links: false;">./minicdn -mirror http://localhost:5000 -addr :11000 -log cdn.log</pre> * 对网站http://localhost:5000进行镜像加速 * 监听11000端口 * 日志存储在cdn.log中 源站的所有下载地址,最好都改成这个http://localhost:5000/something ### Run Peer 命令行启动 <pre class="brush:cpp ;toolbar: true; auto-links: false;">./minicdn -upstream http://localhost:11000 -addr :8001</pre> * 指定Server地址http://localhost:11000 * 监听8001端口
授权协议:
MIT
开发语言:
Google Go 查看源码»
操作系统:
跨平台
3130 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传