在看《大型网站技术架构-核心原理与案例分析》的一些整理汇总,其中图片部分来源于书籍。
《大型网站技术架构-核心原理与案例分析》 作者:李智慧 2013年出版
目录:
关键词含:一致性Hash算法…。
演化历程
演化的价值观
误区
图例
模式的关键在于模式的可重复性
分层:横向切分。(将庞大的软件系统切分,将网站软件系统分成应用层、服务层、数据层)
分割:纵向切分。(例如在应用层将不同业务进行分割,如将购物、论坛、搜索、广告分割成不同业务;若是某个业务较庞大、复杂,如购物业务可进一步分割为机票酒店业务、3c业务、小商品业务。对于该些小粒度的业务还可进行拆分为首页、搜索列表、商品详情等模块)
分布式:分层和分割的主要目的是为了切分后的模块便于分布式部署。常用方案:
集群:多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务
缓存:将数据放距离计算最近的位置加快处理速度,改善性能第一手段,可以加快访问速度,减小后端负载压力。使用缓存 两个前提条件 :1.数据访问热点不均衡;2.数据某时段内有效,不会很快过期;3、二八原则,针对于大量20%部分查询内容作缓存,若是一直更新的资源没有必要作缓存
异步:旨在系统解耦。异步架构是典型的消费者生产者模式,特性如下:
冗余:实现高可用。数据库的冷备份和热备份
自动化:包括发布过程自动化,自动化代码管理,自动化测试,自动化安全检测,自动化部署,自动化监控,自动化报警,自动化失效转移,自动化失效恢复,自动化降级,自动化分配资源
安全:密码,手机校验码,加密,验证码,过滤,风险控制
架构是“最高层次的规划,难以改变的规定”。主要关注五个要素:
网站性能测试
性能的测试指标主要有:
性能测试方法:
web前端性能测试
Web 前端性能优化
应用服务器性能优化
主要手段有缓存、集群、异步
1、分布式缓存(网站性能优化第一定律:优化考虑使用缓存优化性能):遵循二八定理,80%请求落在20%的数据上,将20%的数据进行缓存。
2、合理使用缓存。
缓存雪崩
指的是缓存服务失效,大量请求落到数据库而宕机,导致网站不可用。一般网站会使用缓存热备提高缓存可用性(指的是当缓存服务器宕机,将缓存访问切换到热备服务器),这种方案不太好,缓存不应该当做一个可靠的数据源来使用。正解:使用分布式缓存集群(缓存数据分别到集群多台服务器上,若是某一台宕机那么只有部分数据丢失,重新从数据库加载数据即可,不会有很大影响)。缓存穿透
:3、分布式缓存架构:缓存部署在多个服务器组成的集群中,以集群方式来提供缓存服务。两种架构①JBoss Cache代表的更新同步分布式缓存。②Memcached为代表不互相通信分布式缓存。
4、异步操作(消息队列,削峰作用)。
5、使用集群:通过负载均衡技术来构建一台对多台,将并发访问请求进行合理分发。
6、代码优化:①多线程。②资源复用(线程池)。③数据结构。④垃圾回收
[任务执行时间/(任务执行时间-IO等待时间)] x CPU内核数
,线程数最佳数量与CPU内核数量成正比,与IO阻塞成反比;CPU型-不要超过CPU内核数。【保证线程安全:①设置成无状态。②使用局部变量。③合理使用锁】存储性能优化
架构
高可用的网站架构:目的是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问。
主要手段:数据和服务的冗余备份及失效转移,一旦某些服务器宕机,就将服务切换到其他可用的服务器上,如果磁盘损坏,则从备份的磁盘读取数据。
不同层
针对于不同层
保证高可用:
应用
高可用的应用
:显著特点是应用的无状态性
服务
高可用的服务:无状态的服务,可使用类似负载均衡的失效转移策略,此外还有如下策略:
分级管理
:根据应用是否核心、服务是否优先使用更好来对服务进行分级。不同服务在服务部署上也要进行必要的隔离,避免一个服务宕机产生连锁反应。
超时设置
:若是一个请求由于服务端的宕机、线程死锁问题导致长时间不能响应,那么就需要采取策略。
异步调用
:举个例子若是一个注册功能,需要调用三个服务:①用户信息写入数据库。②发送账号注册成功邮件。③开通对应权限。若是同步调用,一旦中间步骤阻塞不能发送邮件时,会到之后其他两个服务也无法执行,导致用户注册失败。
服务降级
:网站访问高峰期,会有大量并发导致性能下降,严重导致宕机一些服务不可用。为保证核心应用的运行,需要对服务进行降级,两种手段如下:
幂等性设计
:对于应用调用服务失败后,会重新调用请求发送到其他服务器,该失败可能是虚假的失败。例如服务已经处理成功但是由于网络故障应用没有收到响应,这是应用重新提交请求导致服务重复调用,若是这个服务是转账操作,就会产生严重后果。
数据
高可用的数据:主要手段是数据备份和失效转移机制。涉及CAP原理(分别是可用、一致、伸缩性,一般采用CP,放弃C)。
1、数据备份
冷备:定期将数据备份到存储介质上物理保存,若是系统存储坏了,就从冷备设备中恢复数据。缺点是不能保证数据最终一致和数据可用性。
热备:分为异步热备、同步热备
2、失效转移:服务器集群中一旦一台服务器宕机,那么应用服务器针对这台服务器的所有读写操作路由到其他服务器上
三步骤如下:
软件质量保证手段或措施
一般使用发布脚本来进行网站发布:①关闭负载均衡服务器上一台或一小批服务器。②关闭这些服务器,将软件代码上传启动。③接着打开负载均衡服务器之前关闭的服务器路由。(若是执行到这步还没发布完成,重复操作)
1、web自动化测试技术:工具如ThoughtWorks开发的Selenium
(运行在浏览器,编写脚本模拟用户操作),一些大公司会开发自己的测试工具来进行对全站网站的测试。
2、预发布验证:一般经过测试好的项目代码不会直接发布到一些负载均衡上的服务器里,而是先发布在预发布机器上(与实际对外开放的服务器一样,区别仅仅在于不对外开放只用于测试),经过开发、测试工程师测试完成之后才会正式发布到服务器上。
快速失败理念
:一旦系统启动发现问题就立刻抛出异常,停止启动让工程师进行排查。3、代码控制:主干开发、分支发布
或分支开发、主干发布
,一般网站采用分支开发,主干发布。(也就是要进行代码功能新增、修改新切一个分支,完成之后合并到主干,主干永远保持最新的版本来进行发布)
4、自动化发布:让发布成为流程化,尽量少的让人工进行干预。
5、灰度发布:针对于软件刚刚发布,就发现软件问题,此时需要发布回滚,卸载发布软件使其复原。
对于大网站可能有上万台服务器,这时候就要使用灰度发布的策略,每天只发布一部分服务器,后一天没问题再发布一部分,最终经过几天全部发布。
其他用途:也常用于用户测试,在部分服务器上发布新版本,比较用户对两个版本的满意度来确定最终的方案。
网站运行监控
要对发布上线的项目进行监控!
1、监控数据采集
Ganglia
,支持大规模服务器集群。2、监控管理:主要目的就是用于系统性能评估,来采取风控策略
大型网站的“大型”是指:
伸缩性的分为如下几个方面
网站架构的伸缩性设计
应用服务器集群的伸缩性设计
HTTP 重定向负载均衡
:DNS->负载均衡服务器,接着在负载均衡服务器中进行重定向返回给浏览器。
DNS 域名解析负载均衡
:在DNS解析域名请求同时进行负载均衡处理。对应域名配对多个目标ip地址,通过负载均衡算法策略进行得出浏览器访问地址。
反向代理负载均衡
(在 HTTP 协议层面,应用层负载均衡)IP 负载均衡
(在内核进程完成数据分发):响应后请求会经过负载均衡服务器。
数据链路层负载均衡
(数据链路层修改 mac 地址,三角传输模式,LVS):响应数据不经过负载均衡服务器,直接返回给浏览器。【大型网站使用最广】负载均衡算法
分布式缓存集群的伸缩性设计
访问模型
:通过Memcached 客户端来进行访问缓存服务器集群。
伸缩性挑战
:对分布式缓存集群进行弹性伸缩
数据存储服务集群的伸缩性设计
软件设计最具有挑战部分
:分解系统的各个模块、如何定义各个模块的接口、如何复用组合不同的模块构造成一个完整的系统。
软件架构师价值
·:其最大的价值不在于掌握多少先进的技术,而在于具有将一个大系统切分为N个低耦合的子模块的能力,这些子模块包含横向业务模块,也包含纵向的基础模块。能力主要来源于专业技术与经验,还有一部分源自架构师对业务场景的理解、对人性的把握、甚至对世界的认知。
系统架构设计层面的开闭原则:
1、构建可扩展的网站架构
2、利用分布式消息队列降低耦合性
事件驱动架构(Event Driven Architecture)
分布式消息队列
3、利用分布式服务打造可复用的业务平台
Web Service 与企业级分布式服务
大型网站分布式服务的需求及特点:服务注册、发现、服务调用;负载均衡、失效转移、高效远程通信、整合异构系统(不同语言)、对应用最少侵入、版本管理、实时监控。
分布式服务框架设计(Thrift, Dubbo):最简单、高效分布式服务框架采用SOA
4、可扩展的数据结构(如 ColumnFamily
设计):无需修改表结构添加字段,无需像关系型数据库一样要提前设置多个字段。
5、利用开放平台建设网站生态圈:提供更多的增值服务才能够赚钱,方式有围绕对应业务展开一些增值业务,将一些内部服务封装成一些调用接口进行开放。让网站、用户、开发者相互形成依赖,形成一个生态圈。
XSS 攻击和 SQL 注入攻击是构成网站应用攻击最主要的两种手段,此外还包括 CSRF,Session 劫持等手段。
1、攻击与防御
2、信息加密技术及密钥安全管理
方式一:单向散列加密,不同输入长度的信息通过散列计算得到固定长度的输出,不可逆。
方式二:对称加密。对大量数据文件使用一个密钥加密,一旦密钥丢失,就会造成很大的后果。
方式三:非对称加密。开放公钥,私有只在服务端存储用于解密。
密钥安全管理:①密钥算法放在单独服务器上,通过调用服务来加密解密,密钥专人保管。(缺点是造成性能瓶颈) ②加解密算法放在应用系统里,密钥放在独立服务器上,密钥存储方式是将其进行切割成数片放在不同存储介质里。
3、信息过滤与反垃圾
阿_拉_伯
需要进行降噪。微博发布业务:
初期【同步推】:用户发表微博后系统会立即将这条微博插入到所有粉丝列表。若是用户量比较大,如明星发布微博就会引起大量数据库写操作,超出数据库负载,系统性能急剧下降。
改进【异步推拉结合】:①用户发表后系统将微博写入消息队列后立即返回(加快用户响应速度)。②消费队列消费者任务将微博推送给所有当前在线粉丝队列后立即返回。③对于非在线用户登录再根据列表拉取微博订阅列表。
微博频繁刷新:
采用多级缓存策略,热门微博和明星用户微博缓存在所有微博服务器上;在线用户的微博和近期微博缓存在分布式缓存集群上。
效果:对于微博操作中刷微博操作,几乎全部都是对缓存进行访问,可获取良好系统性能。
…待补充
[1]. 大型网站技术架构-全面梳理
[2]. 图解大型网站技术架构的历史演化过程
安全
[2]. 图解大型网站技术架构的历史演化过程
安全