《大型网站系统与Java中间件实践》试读
第二章主要是讲网站的演化过程,即怎么样从一个小网站演化成一个大型网站的架构变化。
1. 大型网站的定义,大数据量和大访问量具备两者才能算大型网站。
2. 演化过程
2.1 单机阶段
一台服务器兼顾了web服务器和数据库服务器
2.2 双机阶段
将数据库服务器跟web服务器拆分,做到分摊负载,这个阶段基本属于web服务负载有多大,数据库服务负载就有多大。
2.3 web服务器集群
当高并发时web服务器明显表现不足,这时候需要将web服务器进行复制,即web服务器集群,通过负载均衡来进行访问的负载平摊,但由此产生session问题,后面详细说明。
2.4 数据库读写分离
当访问量提高时数据库的压力也会变大,一般写入操作少但是写操作带来的锁表对占据主导的读操作影响很大,严重影响网站的吞吐,所以进行数据库的读写分离。读写两库一般使用主从复制进行数据同步,不免有同步延迟发生。
2.5 存储读取的优化方案
为了弥补高并发时读取的延迟,采取各种弥补方案,如:
- 通过搜索引擎建立关键表字段的索引优化站内的各种搜索
- 缓存方案,加快读操作。这里又分数据缓存和页面缓存。数据缓存,顾名思义就是将热数据缓存起来,通过各种过期算法进行数据更新;页面缓存,即将产生的动态页面进行缓存,未命中时通过web服务器生成并渲染页面再将新产生的页面缓存待下次请求使用。
2.6 分布式数据库
为了满足不断加大的负载,采用分布式数据库,优点在于分布式数据库高并发,高容量及数据冗余容灾。大部分分布式数据库都是key-value形式,常见的一些NoSQL库都是具备分布式这种特点。不足之处在于它对事务的支持比较弱,所以适合弱事务情况。
2.7 主库的拆分
纵向拆分,通过业务区分来对库进行拆分,如用户、商品、交易可以分三个库。
横向拆分,单表拆分成同样结构的多个表,每个表涵盖一部分数据。
以上两种可以综合使用,纵向拆分以后再对业务单表进行横向拆分。分库带来的分布式事务、表链接、表键约束等问题。
2.8 web服务器拆分
根据应用进行拆分,缺点在于公用功能代码的维护。
服务化拆分,即分拆服务应用,所有的服务应用成一个分层,提供给web各种服务,服务层再各自请求各自的业务数据库。
2.9 应用间的通信
经常涉及到应用之间的通信,为了解耦应用而提供通信中间件,并且可以异步调用。
2.10 总结
2.1 属于初级阶段;2.2~2.4属于中级阶段;2.5~2.9属于高级阶段;后期阶段开始整体的安全、容灾、收缩扩容等。
3. 外传
3.1 集群后的session问题
先解释下这个问题的由来,当web服务器集群时,通过前端的负载均衡来引导流量到不同的web服务器,由于承接访问的web服务器可能不是同一台机器导致存储在前一次session中的信息在第二次访问时丢失,由此产生session问题。文章中介绍几种解决方案:
- session sticky, 即负载均衡器将访问规则化,同一台机器的多次访问经过负载均衡后都会被引导到同一台web服务器。缺点:单机故障会导致session信息丢失。
- session replication, 即负载均衡器或者其他程序将集群中的所有web服务器的session进行同步,所有的服务器都保持一样的session信息。缺点:大量的同步占用大量网络带宽。
- session集中存储,有别于2),将所有集群的session集中化管理,减少了带宽占用。
- cookie based, 将session信息保存在cookie中进行传输。缺点:安全性和存储信息量有限。