本文的思维导图如下:
本文分为三大部分,9个架构模式、8个架构要素和架构要素的提升手段。9个架构模式分别是分层,分割,分布式,集群,缓存,异步,冗余,自动化,安全。8个架构要素分别是性能,可用性,可伸缩,可扩展,安全,成本,可维护,可移植。
在展开阐述之前,先谈谈架构演化思想:好的架构都是演化而来的,好的架构是满足当时业务的需求,切不要为了架构而架构,但设计架构的时候要考虑为系统留一定的余量。
第一部分:9个架构模式
分层:一般分为接入层,应用层,服务层和数据层。接入层是指网络中面向用户连接和访问的部分。应用层负责具体业务和视图展示。服务层为应用层提供服务支持。数据层提供数据存储和访问服务。
分割:将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元。
分布式:常用的分布式方案有分布式应用和服务,分布式静态资源,分布式数据和存储,分布式计算,分布式配置,分布式锁,分布式文件系统。
集群:多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。即使是访问量很小的分布式应用和服务,也至少部署两台服务器构成一个小的集群,目的是提高系统的可用性
缓存:优先考虑使用缓存,使用缓存的两个前提:数据访问热点不均衡和数据在某个时间段内有效。
缓存的手段有:
CDN 内容分发网络 部署在距离终端用户最近的网络服务商
反向代理 缓存网站的静态资源
本地缓存 在应用服务器本地缓存着热点数据
分布式缓存 专门的一个分布式缓存集群
异步:目的降低软件耦合性,可晚点的操作尽量晚点操作
单一服务器内部可通过多线程共享内存队列的方式实现异步
多个服务器集群可通过分布式消息队列实现异步,可看做是内存队列的分布式部署
优点:提供系统可用性,加快网站响应速度,消除并发访问高峰
冗余:服务器冗余运行,数据冗余备份
冷备份:定期备份,存档保存
热备份:实时同步备份,例子:数据库的主从分离
自动化:主要集中在发布运维方面
发布过程自动化,自动化代码管理,自动化测试,自动化安全检测,自动化部署,自动化监控,自动化报警,自动化失效转移,自动化失效恢复,自动化降级,自动化分配资源等
安全:通过密码和手机校验码,加密,验证码,垃圾信息和敏感信息过滤,交易风险控制
第二部分:8个架构要素
架构要素 | 衡量标准 | 常用手段 |
性能 | 响应时间,TPS,系统性能计数器等 | 在浏览器端: 浏览器缓存,页面压缩,合理布局页面,减少cookie传输,CDN,反向代理 在应用服务器端: 本地缓存,分布式缓存,异步分布式消息队列,服务器集群 在代码层面: 多线程,改善内存管理 在数据库服务器端: 索引,缓存,SQL优化,NoSQL等 |
可用性 | 可用性指标 | 在应用服务器端: 服务器集群 在存储服务器端: 冗余备份,失效转移,失效恢复 在软件开发过程: 预发布验证,自动化测试,自动化发布,灰度发布等 |
伸缩性 | 是否容易向集群中添加新的服务器 | 对于应用服务器集群: 通过合适的负载均衡设备向集群不断加入服务器 对于缓存服务器集群: 通过改进缓存路由算法保证缓存数据的可访问性 对于关系数据库集群: 通过路由分区等手段 对于NoSQL数据库产品: 选择对伸缩性支持好的产品 |
扩展性 | 新增业务产品或功能,对现有业务或功能改动最少 | 使用分布式消息队列 使用分布式服务,将业务和可复用服务分离开来,通过分布式服务框架调用 提供开发平台接口给第三方开发者 |
安全性 | 对现有的攻击与窃密手段是否有可靠对策 | XSS攻击:消毒和HttpOnly 注入攻击:消毒和参数绑定 CSRF攻击:表单token,验证码,Referer check Error Code:跳转500页面 HTML注释:代码review 文件上传:设置白名单 路径遍历:资源文件独立部署,使用独立域名 使用web应用防火墙,如ModSecurity 网站安全漏洞扫描 信息加密技术及密钥安全管理 信息过滤与反垃圾:文本匹配,分类算法和黑名单 电子商务风险控制:规则引擎和统计模型 |
成本 | 项目周期,人力成本,机器成本 | 技术选型上选择团队擅长的技术栈 合理分解任务 估算业务量指标DAU,MAU等等 |
可维护 | 易维护性 | 自动化项目管理 自动化监控 自动化发布 |
可移植 | 是否方便移植到别的平台 | 编程语言:选择跨平台语言 软件:选择跨平台软件 系统:选择通用的系统 |
第三部分:架构要素的提升手段
1、提升性能的手段
性能测试指标 | 说明 | 测试方法 |
响应时间 | 指应用执行一个操作需要的时间,包括从发出请求开始到收到最后响应数据所需要的时间 | 重复请求,总响应时间之和取平均 |
并发数 | 指系统能够同时处理请求的数目 网站系统用户数>>网站在线用户数>>网站并发用户数 | 通过多线程模拟并发用户的办法 |
吞吐量 | 单位时间内系统处理的请求数量,体现系统的整体处理能力 量化指标: TPS(每秒事务数) HPS(每秒HTTP请求数) QPS(每秒查询数) | 通过多线程模拟并发用户的办法 |
性能计数器 | 系统负载,对象与线程数,内存使用,CPU使用,磁盘与网络I/O |
性能测试方法分类 | 测试目标 | 测试方法 |
性能测试 | 评估系统性能是否符合需求及设计目标——系统性能指标 | 通过多线程模拟并发用户的办法 |
负载测试 | 评估系统因为突发事件超出日常访问压力的情况下,保证系统正常运行情况下能够承受的最大访问负载压力——最大负载能力 | 通过多线程模拟并发用户的办法 |
压力测试 | 评估可能导致系统崩溃的最大访问负载压力——最大压力承受能力 | 通过多线程模拟并发用户的办法 |
稳定性测试 | 特定条件下运行较长一段时间,系统是否稳定 | 不均匀地对系统施加压力 |
性能分析步骤:
1)检查请求处理的各个环节的日志,分析哪个环节响应时间不合理、超过预期
2)检查监控数据:分析影响性能的主要因素是内存,磁盘,网络还是CPU,是代码问题还是架构设计不合理,或者系统资源确实不足
性能优化分类 | 优化手段 | 说明 |
Web前端性能优化 | 浏览器访问优化 | 1)减少http请求 2)使用浏览器缓存:设置Cache-Control和Expires属性 3)启动压缩:HTML,CSS,JavaScript文件启用Gzip 4)CSS放在页面最上面,JavaScript放在页面最下面 5)减少cookie传输 |
CDN加速 | 缓存一般是静态资源:图片,文件,CSS,Script脚本,静态网页 | |
反向代理 | 配置缓存功能加速web请求,可缓存静态内容和动态内容,动态内容更新,需通过内部通知机制通知反向代理缓存失效 另外,反向代理还起到安全防护和负载均衡的功能 | |
应用服务器性能优化 | 分布式缓存 | 缓存基本原理:减少数据访问时间和减少计算时间 缓存主要用来存放那些读写比很高、很少变化的数据 可以通过缓存预热手段改善性能,启动时加载 还得解决缓存穿透的问题,把不存在的数据也缓存起来(其value为null) |
异步操作 | 使用消息队列,可改善用户响应延迟,具有很好的削峰作用 进行业务异步处理后,需要适当修改业务流程进行配合 | |
使用集群 | 将并发访问请求分发到多台服务器 | |
代码优化 | 1)多线程:使用原因是IO阻塞和多CPU 一台服务器上启动多少线程合适呢? 启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数 2)资源复用 单例:比如spring单例 对象池:比如数据库连接池和线程池 3)数据结构 4)垃圾回收 | |
存储性能优化 | 机械硬盘 vs 固态硬盘 | SSD具有更好的读写性能 |
B+树 vs LSM树 | 传统关系型数据库使用B+树 许多NoSQL使用LSM树 | |
RAID vs HDFS | RAID技术在传统关系数据库及文件系统中应用比较广泛 大型网站比较喜欢使用NoSQL以及分布式文件系统 |
2、提升可用性的手段
| 计算公式 | 说明 |
网站可用性度量 | 网站不可用时间(故障时间)=故障修复时间点-故障发现时间点 网站年度可用性指标=(1-网站不可用时间/年度总时间)*100% | 基本可用:2个9,少于88小时 较高可用:3个9,少于9小时 高可用:4个9,少于53分钟 极高可用:5个9,少于5分钟 |
网站可用性考核 | 故障分=故障时间(分钟)*故障权重 | 故障分是对网站故障进行分类加权计算故障责任的方法 |
故障分类 | 描述 | 权重 |
事故级故障 | 严重故障,网站整体不可用 | 100 |
A类故障 | 网站访问不顺畅或核心功能不可用 | 20 |
B类故障 | 非核心功能不可用,或核心功能少数用户不可用 | 5 |
C类故障 | 以上故障以外的其他故障 | 1 |
| 实现手段 | 描述 |
高可用的应用 | 通过负载均衡进行无状态服务的失效转移 | 实现可用状态实时监测,自动转移失败任务的机制是负载均衡 目前,不管是开源免费的负载均衡软件还是负载均衡硬件,都提供失效转移的功能 |
应用服务器集群的session管理 | session管理的手段有: 1)session复制:开启web容器session复制功能,适用于集群规模小的情况 2)session绑定:利用源地址hash算法,将同一IP请求分发到同一台服务器上,实现session绑定。这种方法很少使用 3)利用cookie记录session 4)session服务器集群:可利用分布式缓存实现 | |
高可用的服务 | 分级管理 | 低优先级的服务部署在不同的虚拟机上进行隔离 高优先级的服务部署在不同的物理机上 核心服务和数据部署在不同地域的数据中心 |
超时设置 | 在应用程序中,设置服务调用的超时时间,一旦超时,通信框架就抛出异常,应用程序根据服务调度策略,可选择继续重试或将请求转移到提供相同服务的其他服务器上 | |
异步调用 | 应用对服务的调用通过消息队列等异步方式完成,避免一个服务失败导致整个应用请求失败的情况 | |
服务降级 | 1)拒绝服务:拒绝低优先级应用的调用,减少服务调用并发数 2)关闭功能:关闭部分不重要的服务,或者服务内部关闭部分不重要的功能 | |
幂等性设计 | 必须保证重复调用和一次调用产生的结果一致 | |
高可用的数据 | 数据备份 | 1)数据冷备:不能保证数据最终一致性和数据可用性 2)数据热备:异步热备方式和同步热备方式 关系数据库热备机制通常指Master-Slave同步机制 |
失效转移 | 失效转移分三部分操作: 1)失效确认 2)访问转移:转移到对等服务器(两台服务器数据完全一致) 3)数据恢复:服务器宕机后,数据存储发生了变化,得恢复 | |
高可用网站的软件质量保证 | 网站发布 | 相当于一次提前预知的服务器宕机 |
自动化测试 | 发布后的回归测试 | |
预发布验证 | 部署到预发布服务器上验证,预发布服务器和正式服务器共用一套数据库,不同的是,预发布服务器没有负载均衡 | |
代码控制 | 1)主干开发,分支发布 2)分支开发,主干发布(使用这种方式) | |
自动化发布 | 火车发布模型: 提交发布请求——>QA确认,安全确认,DBA确认——>代码合并——>预发布验证——>正式发布 | |
灰度发布 | 将集群服务器分成若干部分,每天只发布一部分服务器,成功继续发布,失败回滚,在重新发布 灰度发布也常用于用户测试(AB测试) | |
网站运行监控 (不允许没有监控的系统上线) | 监控数据采集 | 1)用户行为日志收集 2)服务器性能监控:开源性能监控工具Ganglia 3)运行数据报告 |
监控管理 | 1)系统报警 2)失效转移 3)自动优雅降级 |
3、提升可伸缩的手段
伸缩是指不改变功能的情况下,增加集群服务器或对现有功能进行拆分后部署到新的机器。
网站架构的伸缩性设计分类 | 实现手段 | 描述 |
不同功能进行物理分离实现伸缩 | 分层后分离 | 将业务处理流程上的不同部分分离部署,实现系统伸缩性 |
业务分割后分离 | 将不同的业务模块分离部署,实现系统伸缩性 | |
单一功能通过集群规模实现伸缩 | 应用服务器集群的伸缩性设计 | 通过负载均衡实现,负载均衡的方法有: 1)HTTP重定向负载均衡(很少用) 2)DNS域名解析负载均衡(一般作为第一级负载均衡手段) 3)反向代理负载均衡(HTTP协议层面的,优点:部署简单;缺点:反向代理可能会成为瓶颈) 4)IP负载均衡(网络层面的,负载均衡在内核进程完成数据分发,较反向代理负载均衡有更好的性能,负载均衡服务器网卡带宽可能会成为瓶颈) 5)数据链路层负载均衡(数据链路层面的,通过修改mac地址进行负载均衡,常用的负载均衡开源产品LVS,使用最广泛)
负载均衡算法有: 1)轮询(Round Robin,RR) 2)加权轮询(Weighted Round Robin,WRR) 3)随机(Random) 4)最少连接(Least Connections) 5)源地址散列(Source Hashing) |
分布式缓存集群的伸缩性设计 | 通过路由算法和更新缓存服务器列表实现 比较流行的路由算法有: 一致性Hash算法 改进的一致性Hash算法:在一致性Hash算法的基础上增加虚拟层,将一台物理缓存服务器虚拟成一组虚拟缓存服务器,将虚拟服务器的Hash值放置到Hash环中,KEY在环上先找到虚拟服务器节点,再得到物理服务器的信息。一般来说,经验值150,即一台物理服务器虚拟成150个虚拟服务器节点 | |
数据存储服务器集群的伸缩性设计 | 1)关系数据库集群的伸缩性设计 数据分库:不同业务数据表部署在不同的数据库集群上 数据分片:将一张表拆开分别存储在多个数据库中 支持数据分片的分布式关系数据库产品有: Amoeba,Cobar,MyCat 一般的扩容方法: 根据业务远景规划未来集群规模 数据迁移步骤: 先同步数据 后修改路由配置 同分布式缓存集群一样,关键在于路由算法 2)NoSQL数据库的伸缩性设计 NoSQL:指非关系的,分布式的数据库设计模式 应用最广泛的是HBase,Redis,Cassandra,Mongodb |
4、提升可扩展的手段
| 实现手段 | 描述 |
模块化方式 | 分层和分割 | 利用分层和分割的方式将软件分割成若干个低耦合的独立的组件模块 |
聚合方式 | 分布式消息队列 | 消息生产者应用程序通过远程访问接口将消息推送给消息队列服务器 消息队列服务器根据消息订阅列表查找订阅该消息的消息消费者应用程序,将消息队列中的消息按照先进先出的原则将消息通过远程通信接口发送给消费者程序 为了避免消息队列服务器宕机造成消息丢失,会将消息成功发送到消息队列的消息存储在消息生产者的服务器,等消息真正被消息消费者处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息 开源的分布式消息队列产品有:ActiveMQ,Rabbitmq,Nsq,Rocketmq,kafka |
分布式服务 | 分布式服务框架的要求: 1)负载均衡 2)失效转移 3)高效的远程通信 4)整合异构系统 5)对应用最少侵入 6)版本管理 7)实时监控 开源分布式服务框架有:Dubbo | |
其他 | 可扩展的数据结构 | 许多NoSQL数据库使用的ColumnFamily设计就是一种解决方案 |
开发平台 | 提供给第三方开发者使用 |
5、提升安全的手段
| 实现手段 | 描述 |
网站应用的攻击与防御 | XSS攻击:跨站点脚本攻击,分为反射型和持久型 防御手段: 1)消毒 2)HttpOnly | 消毒:进行过滤和消毒处理,即对某些html危险字符转义 HttpOnly:防止XSS攻击者窃取Cookie |
注入攻击:SQL注入攻击和OS注入攻击 防御SQL注入攻击的手段: 1)消毒 2)参数绑定 | 消毒:通过正则表达式匹配,过滤可能注入的SQL 参数绑定:使用预编译手段,绑定参数是最好的防SQL注入方法,如IBatis,Hibernate等 | |
CSRF攻击:跨站点请求伪造,核心是利用了浏览器Cookie或服务器Session策略,盗取用户身份 防御手段:主要是识别请求者身份 1)表单token 2)验证码 3)Referer check | token:通过在请求参数中增加随机数的办法 验证码:请求提交时,输入验证码 Referer check:记录请求来源,验证是否合法 | |
Error Code | 配置web服务器参数,跳转500页面 | |
HTML注释 | 代码review | |
文件上传 | 设置上传白名单 | |
路径遍历 | 静态资源独立部署,使用独立域名 | |
web防火墙 | ModSecurity | |
网站安全漏洞扫描 | ||
信息加密技术及密钥安全管理 | 单向散列加密 | 常用的算法有:MD5,SHA等 |
对称加密 | 对称加密算法有:DES算法、RC算法等 | |
非对称加密 | 非对称加密算法有:RSA算法等 | |
密钥安全管理 | 有两种手段: 1)把密钥和算法放在一个独立的服务器,对外提供加密和解密服务,应用系统通过调用这个服务,实现数据的加解密 2)将加密算法放在应用系统中,密钥则放在独立服务器中 | |
信息过滤与反垃圾 | 文本匹配 | 主要解决敏感词过滤的问题,通常采用双数组Trie算法等 |
分类算法 | 对广告贴和垃圾邮件等进行分类 | |
黑名单 | 可通过Hash表实现 对过滤需求要求不完全精确的场景,可使用布隆过滤器代替Hash表 | |
电子商务风险控制 | 风控自动手段: 1)规则引擎 2)统计模型 | 风险有:账户风险,买家风险,卖家风险,交易风险 风控手段:有自动和人工两种 |
参考资料:《大型网站技术架构:核心原理与案例分析》