大型网站及架构的演进过程
读书笔记《大型网站系统与java中间件实践》。
一般来讲,我们所说的系统主要分为两个功能,一个是计算,一种个存储。系统的演进也是围绕着这两个功能进行。
存储
最简单的存储,最常用的存储系统就是数据库了,主要是关系型数据库。
读写分离
针对数据库的操作,主要是读操作和写操作,可能对于很多系统来说读的比重比写的比重占的更多。在数据库读操作到达一定的压力后,就需要将读和写进行分离,即在一个单独的数据库上进行写操作(读和写在同个事务的时候,读还是要跟写在同个数据库上),另外一个或多个数据库进行读操作。读写分离就会涉及到数据库数据的复制,可能会存在一定的延迟。
搜索引擎
有时候针对读的数据并不一定要放在关系型数据库中,可以将主库的数据同步到一些搜索引擎上,比如solr,es等,可以提高查询效率以及灵活性。
缓存
读操作也可以是读缓存,速度可能会更快一些,这里要考虑缓存的命中率问题,以及缓存的更新策略。
分表分库
在业务和数据量比较大的时候,只是读写分离可能也不能满足要求了,尤其在写操作量比较大的时候,这个时候要考虑数据库的拆分。
垂直拆分
垂直拆分的意思主要是业务拆分,比如用户相关的数据和订单相关的数据拆分到不同的数据库中,缓解在一个数据库中的压力。
水平拆分
水平拆分是针对同一个表进行拆分,同一个表的数据拆分到不同的数据库中,需要考虑唯一键的生成规则,比如MySQL主键自增就不适用了。
计算
计算主要是在应用服务器上的计算,最开始可能只是在一台电脑上部署一个服务。
集群
当只有一个服务的时候随着业务的增长可能很快就不能满足要求了,这时候一般的做法是增加应用的服务,在多台服务器上部署同样的代码,通过负载均衡(可以是硬件也可以是软件)将客户的请求分发到不同的服务上去。这时候要考虑会话的问题,有几种解决方式。
- 针对同一个会话的请求都分发到同一个服务器上去,需要对负载均衡做处理。
- 每个服务都去拷贝一份用户的会话,增加了服务器的存储压力。
- 针对会话集中存储。
- 使用cookie存储会话。受限于cookie的大小限制,另外就是不安全。
业务拆分
不同的业务拆分成不同的服务,比如用户相关的业务单独一个服务,订单相关的业务单独一个服务。