搜狐服务架构优化实践


内容来源:2017 年 08 月 10 日,搜狐研发中心架构师陈伟在“第二届APMCon中国应用性能管理大会”进行《搜狐服务架构优化实践》演讲分享。IT 大咖说(微信ID:itdakashuo)做为独家视频合做方,经主办方和讲者审阅受权发布。
web

阅读字数:2625 | 7分钟阅读数据库

嘉宾演讲视频回顾及PPT: t.cn/Rdv9UjA

摘要

搜狐业务横跨新闻,视频,社交,移动端,垂直领域等诸多方向,业务模式也很是多样化。在最近两年,搜狐的后台服务体系,运维体系,CDN架构,IDC架构都在快速的优化改进。影响用户体验的点都有哪些,如何优化,咱们在这一轮搜狐服务的优化中进行了深刻的思考和实践。 本次将和你们分享在大型综合网站的后台架构优化,微服务体系,用户端链接优化,监控体系建设等方面的经验和教训。缓存

接入层优化

接入层优化其实没有太多的技巧,最核心的要点是离用户越近越好,这也是咱们作接入层优化的主要思路。服务器

自有节点的流量调度

咱们在全国拥有众多的IDC机房,这种状况下最重要的是如何让用户访问离他最近的节点。所以在自有节点的流量调度上咱们作了不少工做,这个过程当中最难的实际上是发现用户的真实位置,传统的作法是经过DNS体系实现总体调度,可是运营商的DNS或者说用户的DNS并不必定能反应真实的网络状况。为了更精准的调度,咱们开始使用相似EDNS这样的协议,而且升级自身的DNS系统,采用更精准的IP库。微信

第三方CDN调度

搜狐在过去的十几年里一直都是采用本身的IDC方案,可是最近几年公有CDN也发展的很是快,在一些特定领域有很大的优点。因此咱们使用了自建CDN加上第三方CDN的混合方案,这其中面临的核心问题仍是调度,随着CDN的增长调度会愈加麻烦。这种架构下就须要与第三方CDN结合的更紧密,获取到他们原始节点的位置,以及经过客户端这样的特殊方式探查当前网络环境下效果最好的CDN。网络

上文的方案依然是基于EDNS,在精准度上仍是不够。为此咱们采用了更进一步的方案,即客户端自主的测试域名对应的每一个CDN的速度,而后结合服务器给的必定策略,综合主动的选择最优策略来访问。这个方案局限性在于没法在App之外的环境下得到很好的效果,另外在调度上也变得更加复杂。因此通常这种方案都是用在标准CDN访问的状况下,好比核心App有着大量的图片和视频。架构

以上全部策略都依赖于对全网环境和真实数据的了解,全部咱们作了一套全网实时品质监控系统,数据源不光来自咱们自身还有一些第三方的检查机构提供的原始数据。负载均衡

协议优化

接入层优化除开从流量调度上着手,还能够介入协议优化。这方面优化效果比较好的就是SPDY和HTTP2,经过咱们的测试发现响应延时下降到了原先的几分之一。实现这样的效果还须要作一些准备,主要是页面要自主的作适应这两个协议的工做。以前在web环境下域名会被打散,图片被存储在各个域名下,这样的方式在HTTP2中是不推荐的,所以咱们在和业务线协调以后转而使用HTTPS,而且改进域名分布方式,得到了不错效果。运维

平台化

搜狐与不少围绕单一业务展开的公司不一样,有着众多的业务线,且业务之间的联系也不是很紧密。而技术的快速发展,使得咱们的技术栈不断的更新,变得愈加复杂。这样的体系致使业务部门之间相对独立,没有全公司的应用运维管理更多的是基础运维。微服务

平台化的应用可以有效缓解以上问题,它经过把一些公有的基础设施抽离出来,以下降业务线的负担。最近几年内咱们逐渐将数据库、Redis集群、对象存储、图片处理等都作成公司内部的私有云形式,提供给业务线使用,这个过程当中咱们还花费了不少精力让这些组件来适应各类语言开发以及对不一样模式的兼容。

SCS对象存储

SCS对象存储的底层系统是咱们本身搭建的,目前已达到了百亿级的存储量,而且和传统的KV不一样,这套系统不只能和多家CDN对接,与图片处理、视频处理系统也能完美融合。

Redis集群

对于大多数业务Redis都是须要用到的缓存,所以咱们针对Redis集群采用了Docker的资源分配方式而且提供自助化的申请平台。对比以前采用工单的方式,云化平台无需再考虑持久性和可用性问题。

监控报警

监控报警服务有Domeos提供,自动配置通用报警。数据源来着硬件统计信息,业务日志、负载均衡等,新开发业务几乎无需配置便可使用。

Docker & 微服务

咱们本身研发了一个Domeos系统,它是基于Kubernetes的开源部署系统,在该平台下可以比较容易的完成业务上线、回滚、服务配置、跨机房应用以及持续集成等。它的主要做用不只仅体如今线上环境的变化,实际上更多的是规范了整个公司的开发行为以及历史遗留问题。从成本上来看资源的复用大大提升,开发成本得以下降。

日志收集和分析

日志收集和分析的大体流程如上图所示。App应用运行在Docker中,控制台日志比较容易收集,对于散落文件日志会要求在上线以前进行配置。这些日志会经由Flume或Flumentd收集,再交由ELK、Kafka、Storm其中之一处理。

负载均衡与服务发现

Docker之因此不能简单的应用,不少时候都是由于负载均衡和服务发现不是很好作。因此咱们在这方面作了不少工做。基层代理使用Nginx完成,因为动态部署的缘由,形成每一个容器的位置随时都会改变,变动以后的新IP信息会被Nginx获取到,而全部的外部应用经过Nginx访问的时候可以自动的进行负载均衡和服务发现。Nginx上还能作日志分析和监控,好比分析服务响应时间过长的缘由。

反劫持

劫持主要有三个方面的影响,一是无孔不入的广告带来的糟糕用户体验,二是对于广告收入的影响,三是服务可控性没法保障,因为劫持致使改版升级没法顺利的抵达用户端。

对此的解决方案有两个,一是监控,利用全国的布点快速发现问题进行报警;二是投诉和协调,这也是最有用的方案,基本上可以解决大部分问题。而针对小区宽带的广告插入问题,更好的解决方式是HTTPS,可是因为一些兼容性和性能上的局限没法大规模的迁移到HTTPS上。

相关文章
相关标签/搜索