简约的CDN minicdn

码农软件 · 软件分类 · 网页开发工具 · 2019-03-21 08:58:15

软件介绍

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 的运行过程

原文地址

查找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 是我fork的,把这两个问题修复了,虽然提了pr,不过感觉他们一时半会不会merge的。

受 python-celery 的启发,我实现了 peer 退出时候的两种状态(Warm close and Code close)。 Warn close可以保证党节点不在服务的时候才退出。Code close就是强制退出,下载者可能会发现下载中断的问题。

架构

  • M: Manager

  1. 负责维护Peer的列表,每个peer会去Manager同步这个列表。

  2. 所有的请求会先请求到manager, 然后由manager重定向到不同的peer

  • P: Peer

    1. 提供文件的下载服务

    2. Peer之间会根据从manager拿到的peer列表,同步文件

    Manager 与 Peer 是一对多的关系

    [M]
     |`------+--------+---......
     |       |        |[P]     [P]      [P]  ....

    Run Manager

    命令行启动

    ./minicdn -mirror http://localhost:5000 -addr :11000 -log cdn.log
    • 对网站http://localhost:5000进行镜像加速

    • 监听11000端口

    • 日志存储在cdn.log中

    源站的所有下载地址,最好都改成这个http://localhost:5000/something

    Run Peer

    命令行启动

    ./minicdn -upstream http://localhost:11000 -addr :8001
    • 指定Server地址http://localhost:11000

    • 监听8001端口

    本文地址:https://codercto.com/soft/d/1815.html

    Spark

    Spark

    Bill Chambers、Matei Zaharia / O′Reilly / 2017-10-31 / GBP 39.99

    Learn how to use, deploy, and maintain Apache Spark with this comprehensive guide, written by the creators of the open-source cluster-computing framework. With an emphasis on improvements and new feat......一起来看看 《Spark》 这本书的介绍吧!

    JSON 在线解析
    JSON 在线解析

    在线 JSON 格式化工具

    随机密码生成器
    随机密码生成器

    多种字符组合密码

    RGB HSV 转换
    RGB HSV 转换

    RGB HSV 互转工具