大型网站系统与Java中间件实践 试读
试读章节:第2章 大型网站及其架构演进过程
大型网站的特质
海量数据、高并发的访问量、本身业务和系统的复杂度
作者(淘宝技术总监)精炼地诠释了大型网站的特质,很到位
Session共享解决方案
这是分布式系统的第一个坑,作者给出了4种解决方案,听过和做过的区别就是后者可以回忆式地娓娓道来
1. Session Sticky:负载均衡器能够根据每次请求的会话标识来进行请求转发
缺点:
如果有一台 Web 服务器宕机或者重启,那么这台机器上的会话数据会丢失。如果会话中有登录状态数据,那么用户就要重新登录了。
会话标识是应用层的信息,那么负载均衡器要将同一个会话的请求都保存到同一个 Web服务器上的话,就需要进行应用层(第 7 层)的解析,这个开销比第 4 层的交换要大。
负载均衡器变为了一个有状态的节点,要将会话保存到具体 Web 服务器的映射。和无状态的节点相比,内存消耗会更大,容灾方面会更麻烦。
2. Session Replication:Web服务器之间则增加了会话数据的同步
缺点:
同步 Session 数据造成了网络带宽的开销。只要 Session 数据有变化,就需要将数据同步到所有其他机器上,机器数越多,同步带来的网络带宽开销就越大。
每台 Web 服务器都要保存所有的 Session 数据,如果整个集群的 Session 数很多(很多人在同时访问网站)的话,每台机器用于保存 Session 数据的内容占用会很严重。
3. Session 数据集中存储:把 Session 数据集中存储起来,然后不同 Web 服务器从同样的地方来获取 Session
缺点:
读写 Session 数据引入了网络操作,这相对于本机的数据读取来说,问题就在于存在时延和不稳定性,不过我们的通信基本都是发生在内网,问题不大。
如果集中存储 Session 的机器或者集群有问题,就会影响我们的应用。
4. Cookie Based:通过 Cookie 来传递 Session 数据
Cookie 长度的限制。我们知道 Cookie是有长度限制的,而这也会限制 Session 数据的长度。
安全性。Session 数据本来都是服务端数据,而这个方案是让这些服务端数据到了外部网络及客户端,因此存在安全性上的问题。我们可以对写入 Cookie 的 Session 数据做加密,不过对于安全来说,物理上不能接触才是安全的。
带宽消耗。这里指的不是内部 Web 服务器之间的带宽消耗,而是我们数据中心的整体外部带宽的消耗。
性能影响。每次 HTTP请求和响应都带有 Session 数据,对 Web 服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发请求就会越多。
环节数据读压力
读写分离、索引、缓存,都不陌生,倒要看看此书里是怎个实现
采用数据库作为读库:读写分离、主从复制:主库写、从库读
搜索集群(Search Cluster):一种是按照全量/增量划分,一种是按照实时/非实时划分
全量方式用于第一次建立索引(可能是新建,也可能是重建),而增量方式用于在全量的基础上持续更新索引。当然,增量构建索引的挑战非常大,一般会加入每日的全量作为补充。
这个办法确实不错 应该是不断实践和群体智慧
数据缓存 Key-Value
页面缓存 把渲染与缓存的工作结合在一起
讲到页面缓存,我很疑惑为什么作者没有提到varnish
数据库分离
这项淘宝的人总分享 烂大街了 不过确实是淘宝的法宝
专库专用,数据垂直拆分:把数据库中不同的业务数据拆分到不同的数据库中
不同业务的数据从原来的一个数据库中拆分到了多个数据库中,那么就需要考虑如何处理原来单机中跨业务的事务。一种办法是使用分布式事务,其性能要明显低于之前的单机事务;而另一种办法就是去掉事务或者不去追求强事务支持,则原来在单库中可以使用的表关联的查询也就需要改变实现了。
垂直拆分后的单机遇到瓶颈,数据水平拆分:把同一个表的数据拆到两个数据库中
应用系统需要解决 SQL 路由的问题
主键的处理
一些查询需要从两个数据库中取数据,如果数据量太大而需要分页,就会比较难处理了
又一套淘宝特色的分布式道路
服务化和消息中间件解决分布式系统的通信问题