MiniCDN 使用了谷歌开源出来的 groupcache 框架,目前dl.google.com后台就用到了groupcache,性能而言远超那些squid或者nginx-proxy-cache.
groupcache 的数据获取过程很有意思,我把他翻译了过来
groupcache 的运行过程
查找foo.txt的过程(节点#5 是N个节点中的一个,每个节点的代码都是一样的)
-
判断foo.txt是否内存中,并且很热门(super hot),如果在就直接使用它
-
判断foo.txt是否在内存中,并且当前节点拥有它(译者注:一致性hash查到该文件属于节点#5),如果是就使用它
-
在所有的节点中, 如果foo.txt的拥有者是节点#5,就加载这个文件。如果其他请求(通过直接的,或者rpc请求),节点#5会阻塞该请求,直接加载完毕,然后给所有请求返回同样的结果。否则使用rpc请求到拥有者的节点,如果请求失败,就本地加载(译者注:这种方式比较慢)
架构
-
M: Manager
-
负责维护Peer的列表,每个peer会去Manager同步这个列表。
-
所有的请求会先请求到manager, 然后由manager重定向到不同的peer
-
-
P: Peer
-
提供文件的下载服务
-
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端口