架构:接入层架构演变
随着互联网行业的发展,服务端的架构也在不断随着行业的发展主键的完善,本文将介绍接入层架构的演变过程,以及各个过程遇到的核心问题。对接入层有一个整体的认知。
单机架构
问题:单机瓶颈导致整个服务很快到达瓶颈。
第一次演变:DNS负载均衡
既然单机存在瓶颈,那就可以引入多台服务器,并且各个服务器上部署相同的代码,来共同分担线上的流量。为了达到这个目标最简单的方式就是配置多个域名的A记录。因为DNS解析时会轮训配置的A记录,以此来达到负载均衡的目的。
问题:通过DNS做负载均衡存在成本高,延迟高的问题
第二次演变:7层负载均衡
于是,你开始了第二次架构演变,目前需要解决的问题是:如何能够快速的扩缩容?如何能够快速下线一台指定的服务器来解决单机问题?
通过调研你发现,nginx这个组件可以解决你的问题。通过nginx来承接外网流量,内网流量调度交由nginx来完成,在nginx这一层,可以灵活的解决上面提的问题。同时只需要用一个外网IP即可,节省了这部分的花销。
问题:Nginx虽然解决了后端实例的水平扩容问题,但是Nginx的单机问题成为整个服务的瓶颈。
第三次演变:4层负载均衡
既然1台Nginx存在瓶颈,也可以参考之前的思路,使用多台Nginx实例,如果引入多台Nginx,那么就需要考虑如果对Nginx上层的流量进行分流。幸运的是我们已经有了现成的方案LVS
,LVS
是一个四层负载均衡器,引入LVS
后的接入层架构:
引入四层负载均衡器之后,我们方便的对7层负载均衡进行横向扩容。当LVS
工作在DR
模式时,只做请求转发,性能很高。在4层负载均衡之前再使用DNS
轮训的方式,可以大大增加接入层的能力。但是又有问题了,LVS
成了流量的入口,他的可用性直接觉得了整个架构的稳定性,虽然吞吐提高了,但是稳定性成了不确定的点。
问题:LVS解决了7层负载均衡的水平扩容问题,但是单点
LVS
导致架构稳定性问题。
第四次演变:LVS+keepalived
一台LVS
存在单点问题,那么可以使用两台LVS
实例,并且通过keepalived
的方式将两台LVS
做双机热备,当主机挂了,会通过keepalived
自动选择备机继续提供服务,提高服务的容错性。
第五次演变:就近访问
图片和视频是一种相对特殊的资源,一旦创建,除了删除是不会被修改的,所以就很方便做缓存。为了对于这些静态资源加速,我们可以进行特殊处理,把这些静态资源分发到全国各地,请求时根据用户请求的IP
地址来选择合适的数据存储位置。以此来提供更流畅的体验,这种技术我们称为内容分发网络CDN
,现在我们的整个接入层架构如下:
对于静态资源,我们选择特定的域名,然后通过域名的CNAME
记录指向我们的CDN加速域名,最后再通过智能DNS
根据用户请求的IP地址,选择合适的 CDN节点,并实现了就近访问,与此同时,这些静态资源的请求也不会直接访问到我们的计算资源。节省了比较多的网络带宽。
总结
通过这几次的演变,我们搭建除了一个具有灵活伸缩性,高可用的接入层系统架构,但是这一些还远远没有结束,我们还是有很多的挑战需要面对。例如如何解决多运营商间的高速跨运营商访问?DNS域名解析出现问题如何容灾?剩下的部分先留个坑,后面再做分析。