系列文章是博主对沈剑的《架构师训练营》分享内容的个人笔记总结,原内容公众号“成为架构师”。
CDN(content delivery network)即内容分发网络,它的核心就是实现就近访问
CDN非常适合用于静态资源的加速访问(js、css、html、多媒体文件等)
那么什么是就近访问呢,就近的实际含义就是物理网络的”地理位置“近 假设有一个静态资源 abc.jpg在不同地理区域的机房都有存放,那么当北京用户试图访问这一资源的时候浏览器的请求就会被解析到北京机房,或许你会有疑问,请求根本就没到服务器,怎么会知道要到那个机房呢?
这一过程的实现依赖的DNS的解析服务,DNS解析可以根据请求的ip,依照一定的配置规则,将域名解析为不同的nginx的公网ip,比如北京的ip,www.daojia.com的域名就会被解析为北京机房的公网ip
地理位置是CDN最常用的一种边缘网络配置规则
从CDN的就近访问实现来看,我们可以知道dns-server是这一过程的核心,除了dns-server,CDN作为一个分发网络,还需要其他的组成部分 CDN网络的主要构成:
源:主数据库,所有的、最新的资源镜像:多个”穿透缓存“,源的复制智能DNS,决定我们访问哪一个数据在多处存储,就一定会有一致性问题,而一致性问题的解决有共性,又有具体问题具体分析的个性,每种场景下都有适合它的更优方案
假如源里更新了abc.js,但是镜像没有更新,数据不一致了,如何处理?
这是一致性问题属于(分布式)缓存的不一致问题,通常有两种方案:
源更新的时候,过期掉镜像里的abc.js (缓存淘汰)等待镜像里的abc.js过期(缓存过期)就方案一来说,考虑这要如何实现,源需要维护一份镜像的List,然后for循环这一List对缓存进行淘汰,这是典型的反向依赖,源依赖了镜像在增加或者减少减少镜像节点的时候都要修改源的配置,是不合理的
来看方案二,在缓存未过期的时间段内,将有很长一段时间客户端会得到脏数据,这让人也不太能接受
在这一场景下,有一种更加的实践:使用文件版本号
为每一个静态文件的命名带上版本号,若原先的abc_v1.2.3.js升级为abc_v1.2.4,那么dns-server在解析域名试图获取这一文件的时候就能知道镜像里并不存在,就可以直接去源里取得数据,十分的高效
资源更新无外乎两种方式:
资源更新的时候,源一次性推送所有镜像发现资源缺失的时候,镜像主动去拉取源方案一如前文所说的,发生了反向依赖的问题,所以在CDN的实践中通常采取第二种,即拉取的策略,镜像可以定时主动与源进行同步
上一篇回顾:【成为架构师2-5】维护session一致性的四种方案 下一篇更精彩:【成为架构师2-7】TCP负载均衡,长连接的负载均衡策略