BAT架构师分享之:大型网站技术架构

早期的网站为了节省成本一般会设计成集中式系统,应用程序、数据库等都部署在一台服务器上。 但随着业务的快速度发展,逐渐出现瓶颈,按一定原则**(应用拆分、服务拆分、数据拆分、应用解耦)**,向分布式系统转型,涉及到以下环节改造。

主要环节

  • 业务拆分:将整个网站业务拆分成不同的应用,每个应用独立部署维护,应用之间通过RPC或消息队列通信。
  • 集群化(应用服务器;基于RPC的微服务应用等)
  • LVS负载均衡,负责将请求转发给不同业务集群
  • 反向代理服务器,常用的如Nginx
  • 应用服务器,servlet容器,如tomcat
  • 应用和数据服务分离,分别部署在不同的服务器
  • 后端应用合理分层,通常分为表现层或网关层、业务逻辑层、数据持久层
  • 缓存。分为两种:本地缓存;分布式缓存
  • CDN化。静态内容部署到CDN,就近获取,加速网站响应。
  • 数据库读写分离。数据库采用主从热备,应用服务器在写数据时访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库。
  • 分库分表,引入分布式数据框架
  • 引入NoSQL,支持海量数据存储
  • 借助elastics search等开源搜索引擎
  • 异步化,系统解耦。
  • 缩短业务流程,加快网站访问速度
  • 消除并发访问高峰

架构五要素:

  • 高性能
  • 可用性(Availability)
  • 伸缩性(Scalability)
  • 扩展性(Extensibility)
  • 安全性

1、高性能

性能的测试指标主要有:

  • 响应时间:指应用执行一个操作需要的时间
  • 并发数:指系统能够同时处理请求的数目
  • QPS:指单位时间内系统处理的请求量
  • 系统性能计数器:描述服务器或者操作系统性能的一些数据指标

性能优化,根据网站分层架构,可以分为三大类:

  • Web 前端性能优化
  • 减少 http 请求
  • 使用浏览器缓存
  • 启用压缩
  • CSS 放在页面最上面,JavaScript 放在页面最下面
  • 减少 Cookie 传输
  • 应用服务器性能优化:主要手段有 缓存、集群、异步
  • 多线程(设计为无状态,使用局部对象,并发访问资源使用锁)
  • 资源复用(单例,对象池)
  • 数据结构
  • 异步操作(消息队列,削峰作用)
  • 多台应用服务器组成一个集群共同对外服务,提高整体处理能力。
  • 使用 CDN,将网站静态内容分发至离用户最近的网络服务商机房,使用户通过最短访问路径获取数据。可以在网站机房部署反向代理服务器,缓存热点文件,加快请求响应速度,减轻应用服务器负载压力
  • 应用服务器端,可以使用服务器本地缓存和分布式缓存(网站性能优化第一定律:优化考虑使用缓存优化性能)
  • 代码层面,也可以通过使用多线程、改善内存管理等手段优化性能。
  • 数据库服务器端,索引、缓存、SQL 优化等性能优化手段
  • NoSQL 数据库通过优化数据模型、存储结构、伸缩特性等
  • 存储服务器性能优化
  • 机械硬盘 vs. 固态硬盘
  • B+ 树 vs. LSM 树
  • RAID vs. HDFS

2、高可用

高可用的网站架构:目的是保证服务器硬件故障时服务依然可用、数据依然保存并能够被访问,主要手段数据和服务的冗余备份及失效转移

  • 高可用的应用:显著特点是应用的无状态性
  • 通过负载均衡进行无状态服务的失效转移
  • 应用服务器集群的 Session 管理
  • 高可用的服务:无状态的服务,可使用类似负载均衡的失效转移策略,此外还有如下策略
  • 超时设置
  • 异步调用
  • 服务降级
  • 限流
  • 高可用的数据:主要手段是数据备份和失效转移机制
  • 失效确认
  • 访问转移
  • 数据恢复
  • 冷备:缺点是不能保证数据最终一致和数据可用性
  • 热备:分为异步热备和同步热备
  • 数据一致性(Consisitency)
  • 数据可用性(Availibility)
  • 分区耐受性(Partition Tolerance)
  • CAP 原理
  • 数据备份
  • 软件质量保证
  • 自动化测试
  • 预发布验证
  • 灰度发布
  • 网站实时监控
  • 警报系统
  • 自动优雅降级
  • 用户行为日志采集(服务器端和客户端)
  • 服务器性能监控
  • 监控数据采集
  • 监控管理

3、伸缩性

大型网站需要面对大量用户的高并发访问和存储海量数据,不可能只用一台服务器就处理全部用户请求,存储全部数据。网站通过集群的方式将多台服务器组成一个整体共同提供服务。所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。

衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来的服务器无差别的服务。集群中可容纳的总的服务器数量是否有限制。

对于应用服务器集群,只要服务器上不保存数据,所有服务器都是对等的,通过使用合适的负载均衡设备就可以向集群中不断加入服务器。

对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,进而导致集群中大部分缓存数据都无法访问。虽然缓存的数据可以通过数据库重新预热,但是如果应用已经严重依赖缓存,可能会导致整个网站崩溃。需要改进缓存路由算法保证缓存数据的可访问性。

关系数据库虽然支持数据复制,主从热备等机制,但是很难做到大规模集群的可伸缩性,因此关系数据库的集群伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群。

至于大部分 NoSQL 数据库产品,由于其先天就是为海量数据而生,因此其对伸缩性的支持通常都非常好,可以做到在较少运维参与的情况下实现集群规模的线性伸缩。

概括起来伸缩性的分为如下几个方面:

  • 应用服务器集群的伸缩性设计
  • 轮询(Round Robin, RR)
  • 加权轮询(Weighted Round Robin, WRR)
  • 随机(Random)
  • 最少链接(Least Connections)
  • 源地址散列(Source Hashing)
  • DNS 域名解析负载均衡
  • 反向代理负载均衡(在 HTTP 协议层面,应用层负载均衡)
  • IP 负载均衡(在内核进程完成数据分发)
  • 数据链路层负载均衡(数据链路层修改 mac 地址,三角传输模式,LVS)
  • 分布式缓存集群的伸缩性设计
  • Memcached 客户端(包括 API,路由算法,服务器列表,通信模块)
  • Memcached 服务器集群
  • 分布式缓存的一致性 Hash 算法(一致性 Hash 环,虚拟层)
  • 数据存储服务集群的伸缩性设计
  • 关系数据库集群的伸缩性设计
  • NoSQL 数据库的伸缩性设计

4、可扩展

系统架构设计层面的“开闭原则”,构建可扩展的网站架构

  • 利用分布式消息队列降低耦合性
  • 分布式消息队列
  • 事件驱动架构(Event Driven Architecture)
  • 利用分布式服务打造可复用的业务平台
  • 分布式服务框架设计(Thrift,Dubbo)
  • 可扩展的数据结构(如 HBase的 ColumnFamily 设计)
  • 利用开放平台建设网站生态圈

5、网站的安全架构

XSS 攻击和 SQL 注入攻击是构成网站应用攻击最主要的两种手段,此外还包括 CSRF,Session 劫持等手段。

  • 攻击与防御
  • Error Code
  • 表单 Token
  • 验证码
  • jsonp请求的,Referer 校验
  • SQL 注入
  • html 危险字符转义
  • XSS 攻击:跨站点脚本攻击(Cross Site Script)

对js转义,使其失去执行功能,只作为纯字符串展示

  • CSRF 攻击:跨站点请求伪造(Cross Site Request Forgery)

防范:httpOnly;增加token校验;通过Referer识别。

  • 网站安全漏洞扫描
大型网站架构演化 大型网站软件系统的特点 大型网站架构演化发展历程 初始阶段 应用服务和数据服务分离 使用缓存改善网站性能 缓存类型 本地缓存 分布式缓存 缓存产品 redis 业界主流 memcached 解决问题 数据库访问 使用应用服务器集群改善网站的并发处理能力 问题: 负载均衡情况下session状态的保持? 解决方案: 基于DNS的负载均衡 反向代理 ngix JK2 数据库的读写分离 问题: 读库与写库的数据同步 解决方案: 不同的数据库都有自己的数据库的主从复制功能 使用反向代理与CDN加速网站响应 反向代理产品 ngix 使用分布式文件系统和分布式数据库系统 使用no-sql和搜索引擎 站内搜索 lucene nutch 分词器 no-sql库 mongodb hadoop 业务拆分 web service restful 分布式服务 大型网站架构演化的价值观 核心价值:随网站所需灵活应对 驱动力量:网站的业务发展 网站架构设计误区 一味追随大公司的解决方案 为技术而技术 企图用技术解决一切问题 大型网站架构模式 架构模式 分层 分割 分布式 分布式应用和服务 分布式静态资源 分布式数据和存储 分布式计算 集群 缓存 CDN 反向代理 本地缓存 分布式缓存 异步 冗佘 冷备份 主从分离,实时同步实现热备份 灾备数据中心 自动化 发布过程自动化 ant maven. 自动化代码管理 svn cvs github 自动化测试 loadrunner hudson. 自动化安全测试 自动化部署 自动化报警 自动化失效转移 自动化失效恢复 自动化降级 自动化分配资源 安全 密码和手机校验码 数据库中的密码加密后存 -> 不可ni -> md5 加密 子主题 1 验证码 防止机器登录 对于攻击网站的XSS攻击,SQL注入,进行编码转换 对垃圾信息,敏感信息进行过滤 对交易转账等重要操作根据交易模式和交易信息进行风险控制 Sina微博的应用 大型网站架构要素 性能 可用性 伸缩性 扩展性 安全性 瞬时响应:网站的高性能架构 网站的性能测试 不同的视角 用户的视角 开发人员的视角 运维人员的视角 性能测试指标 响应时间 并发数 吞吐量 性能测试方法 性能测试 负载测试 压力测试 稳定性测试 web 前端性能优化 浏览器优化 减少http请求 使用浏览器缓存 启用压缩 css上,js下 减少cookie传输, 静态资源使用独立域名访问 CDN加速 反向代理 应用服务器性能优化 分布式缓存 缓存的原理 合理使用缓存 频繁修改的数据 没有热点的访问 数据不一致和脏读 缓存可用性 缓存预热 缓存穿透 缓存架构 jboss cache为代表的需要更新同步的分布式级缓存 以memcached为代表的不互相通信的分布式缓存 异步操作 使用集群 代码优化 多线程 资源复用 单例 对象池 数据结构 垃圾回收 存储性能优化 固态硬盘 RAID与HDFS 万无一失:网站的高可用性 高可性的度量与考核 度量 考核 高可用的网站架构 高可用的应用 高可用的服务 高可用的数据 CAP原理 数据备份 失效转移 高可用网站的软件质量保证 网站发布 自动化测试 预发布验证 代码控制 自动化发布 灰度发布 网站运行临控 临控数据采集 临控管理 永无止境:网站的可伸缩性 网站架构的伸缩性设计 不同功能进行物理分离实现伸缩 单一功能通过集群规模实现伸缩 应用服务器集群的伸缩性设计 http重定向负载均衡 DNS域名解析负载均衡 反向代理负载均衡 ip负载均衡 数据链路层负载均衡 负载均衡算法 分布式缓存集群的伸缩性设计 memcached分布式缓存集群的访问模型 memcached分布式缓存集群的伸缩性挑战 分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql数据库的伸缩性设计 随需应变:网站的可扩展性 构建可扩展的网站架构 利用分布式消息队列降低系统耦合性 事件驱动架构 分布式消息队列 利用分布式服务打造可复用的业务平台 web service与企业级分布式服务 大型网站分布式服务的需求与特点 分布式服务框架设计 可扩展的数据结构 利用开放平台建设网站生态圈 固若金汤:网站的安全架构 网站应用攻击与防御 XSS攻击 反射型 持久型 防御方法 消毒 httponly 注入攻击 SQL注入攻击 攻击前提 获取数据库结构的方法 防御方法 消毒 参数绑定 OS注入攻击 CSRF攻击 防御方法 表单token 验证码 referer check 1. 网络流量统计 2. 防盗链 error code html注释 文件上传 web应用防火墙 modsecurity NEC的 siteshell 网站安全漏洞扫描 信息加密技术及密钥安全管理 案例: CSDN 信息加密技术分类 单项散列加密 对称加密 非对称加密 密钥安全管理 将密钥和算法放在一个独立的服务器上,对外提供加密和解密服务 密钥放在独立服务器中,算法放在应用程序中。 信息过滤与反垃圾 文本匹配_敏感词过滤 正则表达式 trie树 双数组trie树 多级Hash表 信息降噪 分类算法_内容识别 黑名单 电子商务风险控制 风险 账户风险 买家风险 卖家风险 交易风险 风控 人工 自动 规则引擎 统计模型 案例 网购秒杀系统架构 网购秒杀系统架构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值