一、大型网站架构演化
- 应用服务器和数据服务器分离
- 当业务量增大后,开始对服务器做分离,应用服务器处理大量业务,更好的cpu,数据库服务器要数据检索和缓存,需要更快的硬盘和更大的内存,文件服务器需要存储大量用户文件,更大的硬盘。
- 二八定律:80%业务集中访问在20%的数据上
- 引入缓存机制,减少数据库的访问压力
- 缓存分2种:缓存在应用服务器上的本地缓存和缓存在专门的分布式缓存服务器上的远程缓存
- 本地缓存访问速度更快,但会和应用程序争用内存。
- 集群改善并发处理能力
- 通过负载均衡调度服务器,将访问请求分发到应用服务器
- 数据库读写分离
- 应用服务器在写数据的时候访问主数据库,主数据库通过主从复制更新机制,同步数据到从数据库,应用服务器即可读数据。通常在应用服务器端使用专门数据访问模块,实现读写分离对应用服务器的分离。
- 使用反向代理和cdn加速网站响应
- cdn:内容分发网络,部署在距离终端用户最近的网络服务商,用户的网络请求总是先到达他的网络服务商那里,在这里缓存一些网站的静态资源。 反向代理:当用户请求到大数据中心,最先访问反向代理服务器,缓存一些静态资源,无需分发给应用服务器,直接返回数据给用户
-
分布式文件系统和数据库系统
- 使用nosql和搜索引擎
- 通过统一数据访问模块访问数据,减轻应用服务器管理多数据源
- 业务拆分
- 根据各业务拆分,独立部署,应用之间通过超链接建立关联。
- 分布式服务
- 控制业务架构,比控制技术架构有时候更重要,改变业务减小并发量。
二、架构模式
- 分层
- 将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统
- 分割
- 根据不同的功能和服务进行分割,封装成高内聚低耦合的模块单元
- 分布式
- 将不同模块部署在不同服务器上,通过远程调用协同合作。
- 好处:可以使用更多计算机,能够处理更大的并发。
- 坏处:服务调用必须通过网络,对性能有影响;服务器多,宕机的概率越大,可用性降低;数据一致性也困难;管理维护困难。
- 几种分布式:
- 分布式应用和服务:将应用和服务模块分布式部署,改善并发,还可以复用共同服务
- 分布式静态资源:网站静态资源(js,css)独立部署,动静分离,可以减轻应用服务器的负载压力
- 分布式数据和存储,分布式计算
三、性能优化
- web前端优化
- 减少http请求(合并css,js);
- 使用浏览器缓存(http头cache-control和expires);
- 启用压缩(服务端进行压缩,浏览器端进行解压缩)
- css放在页面最上面(浏览器会下载完全部css后对页面进行渲染)
- 减少cookie传输
- 应用服务器性能优化
- 缓存:将数据存储在相对较高访问速度的存储介质中。
- 频繁修改的数据,没有热点的访问,数据不一致与脏读,缓存预热,缓存穿透
- 分布式缓存:JBoss Cache为代表的需要更新同步的分布式缓存,memcached为代表的不互相通信的分布式缓存
- 异步操作:在高并发的情况下,直接写入数据库会有压力,引入消息队列,用户请求的数据发给消息队列后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。(由于异步,要修改业务配合数据不实时性)
- 多线程,注意问题:将对象设计为无状态对象,使用局部对象,并发访问资源时使用锁
- 资源复用:减少开销很大的系统资源的创建和销毁。两种模式:单例和对象池
- 存储性能优化
- 机械硬盘:快速顺序读写,慢速随机读写
- SSD硬盘:没有机械装置,数据存储在记忆的硅晶体
- 为了改善数据访问特性,文件系统或数据库系统会对数据排序后存储,所以很多数据库用b+树,LSM树
- RAID(廉价磁盘冗余阵列),HDFS(分布式文件系统)
- RAID0:数据写入磁盘时,分成N份同时写入,不做备份
- RAID1:数据写入磁盘时,将一份数据同时写入两块磁盘
四、高可用性
- 应用服务器集群的Session管理
- Session复制:每台服务器都保存用户的session信息。只能针对小型的集群
- Session绑定:负载均衡器总是将来源同一个ip的请求转发给对应的服务器(无法应对服务器宕机)
- 利用cookie记录Session,cookie存在在客户端,不过受cookie大小等影响 Session服务器,独立部署管理Session
- CAP:数据一致性,数据可用性,分区耐受性
- 数据备份:
- 冷备份,定时复制数据,不能保证实时性。
- 热备份:异步热备份和同步热备份
- 失效转移:失效确认(心跳检测,应用程序访问),访问转移,数据恢复
- 自动化测试,Selenium;
- 预发布验证(特殊服务器,和正式环境是同一个数据中心)
- 代码控制:svn,(分支开发,主干发布) git
- 自动化发布
五、架构伸缩性
(不改变系统软硬件设计,仅仅改变部署的服务器数量,扩大或者缩小服务处理能力)
- 不同功能进行物理分离实现伸缩
- 纵向分离:将业务处理流程上的不同部分分离部署(应用服务器,数据服务器,缓存服务器)
- 横向分离:将不同业务模块分离部署(卖家后台,买家后台)
- 单一功能通过集群规模实现伸缩
- 应用服务器集群伸缩性(负载均衡服务器,http分发),
- http重定向负载均衡,DNS域名解析负载均衡,反向代理负载均衡,ip负载均衡
- 负载均衡算法:轮询,加权轮询,随机,最少连接,源地址散列
- 分布式缓存集群伸缩性
- 数据存储服务器集群伸缩性
- 数据库读写分离,业务分割数据分库。
- (Cobar:分布式数据访问代理)开源的分库插件
- TDDL主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制
六、架构的扩展性
- 利用分布式消息队列降低系统耦合性
- 事件驱动架构:通过在低耦合模块之间传输事件消息,并借助事件消息完成模块之间的合作。
- 利用分布式服务打造可复用的业务平台
- 分布式服务框架
- Dubbo:开源分布式服务框架
七、架构的安全性
- XSS攻击(跨站点脚本攻击)
- 反射型攻击:攻击者诱使用户点击一个嵌入恶意脚本的链接,达到攻击的目的
- 持久性攻击:提交恶意脚本的请求,保存在被攻击web站点,用户浏览就被攻击。
- 防范:
- 消毒:对特殊符号(<>=等)进行转义
- HttpOnly:浏览器禁止页面js访问带有httpOnly属性的cookie
- 注入攻击
- SQL注入:在http请求中恶意注入sql命令,服务器用请求参数构造sql命令,就执行了恶意的sql
- 防范:
- 消毒:通过正则表达式过滤特殊命令
- 参数绑定:使用预编译手段,绑定参数
- CSRF攻击:跨站点请求伪造,以合法用户进行非法操作(在第三方网站直接使用img等标签嵌入攻击的网站,会自动带入cookie信息模拟登陆)
- 防范:
- 表单token:在表单提交的时候加入token随机数
- 验证码:在支付交易等关键页面加入验证码
- Referer check:检查http请求头的referer域中的请求来源
- ModSecurity开源的web应用防火墙
- 采用处理逻辑与攻击规则集合分离的架构模式
- 信息加密
- 单向散列加密:(MD5,SHA)通过对不同输入长度的信息进行散列计算,得到固定长度输出,可以加强加入salt(密钥),用彩虹表破解(常用密码和密文对应关系)
- 对称加密:(DES,RC算法)加密和解密使用的密钥是同一个密钥。如Cookie加密,通信加密
- 非对称加密:(RSA算法)加密和解密使用的密钥不相同,对外界公开的叫公钥,只有所有者知道的叫私钥。如:信息安全传输,数字签名。https传输中浏览器用的数字证书
- 信息过滤和反垃圾
- 文本匹配:解决敏感词过滤的问题。内容短的时候可以使用正则表达式,内容多的情况可以使用trie树,双数组trie算法。对做手脚的信息做降噪预处理,然后在匹配。
- 分类算法:(ARCS算法,贝叶斯分类算法)先将批量已分类的邮件样本输入分类算法,得到分类模型,再利用模型进行识别
- 黑名单:被标记为垃圾的加入黑名单,还可以用于信息去重。数据量过大可以考虑布隆过滤器代替hash表