大型网站系统与java中间件实践笔记 _ 曾宪杰
1. 分布式系统介绍
-
IO区别:
- BIO: 阻塞IO.
- AIO:java7引入,在有通知时表示相关操作已经完成。
- NIO:在有通知时表示可以进行操作。
-
LVS架构的优缺点:
- 优点:请求方和处理方都不需要关注对方的地址,只需要知道LVS的地址即可。
- 缺点:造成单点危机,LVS成为了可能引发瓶颈的点。而且增加了网络的开销,还有一定的延时,因为,所有的请求都会通过LVS进行转发。
- 解决方案:需要做LVS的热备份,但是在切换的时候,当时未完成的请求还是会受到影响。
-
分布式session
-
Session Sticky:
1. 处理方式: session保存在固定的服务器上,通过负载均衡器保证同样的session的请求每次都发送到同一个服务器上处理。
2. 缺点:
1. 若服务器宕机,用户需要重新登录。
2. 会话标识是应用层的信息,那么负载均衡器要将同一个会话的请求都保存到同一个web服务器上,就需要进行应用层(第七层)解析,这个开销比第四层的交换大。
3. 负载均衡器变成了一个有状态的节点,要将会话保存到到具体的服务器的映射。消耗内存,且容灾会很复杂。 -
Session Replication:
- 处理方式:通过服务器之间同步session,保证数据的正确性。
- 缺点:
- 同步session数据造成网络带宽的开销。session存在变化,就得同步。
- 每台Web服务器都需要保存所有的Session数据,导致占用的内存很严重。
-
Session数据集中处理
- 处理方式:不同的web服务器从同样的地方获取session。
- 缺点:
- 网络开销,需要去单独的服务器获取session数据。
- 需要注意单点问题,保证服务器的稳定性。
-
Cookie Based
- 处理方式:通过Cookie来传递session数据。
- 缺点:
- Cookie长度限制。
- 安全性,Session是服务端的数据,而cookie是保存在客户端的,容易被破解,哪怕对session数据进行加密。
- 性能影响:每次http请求和响应都得带有session数据。
-
2. 大型网站的架构演进
- 数据库读写分离
- 专库专用,数据垂直拆分。根据业务拆分成不同的数据库,不把所有业务的表都存放在一个数据库中。
- 垂直拆分之后,数据水平拆分。
- 垂直拆分的是不同的表到不同的数据库中;水平拆分是同一个表拆分到不同的数据库中。
3. JAVA中间件
- 多线程:
- synchronize保证了synchronize块中变量的可见性,而volatile保证了所修饰属性在不同线程之间的可见性。
- wait, notify, notifyAll都需要放在synchronize块中。
4. 数据访问层
-
分库分表:
- 方法:
- 水平拆分:根据一定的规则把同一业务单元的数据拆分到多个数据库中。
- 垂直拆分:根据不同的业务拆分到不同的数据库中。
- 带来的隐患:
- 单机的ACID打破了,需要分布式事务的介入。
- 一些复杂的join操作无法使用了。
- 无法使用数据库的自动增长序列。
- 数据查询需要跨表操作。
- 方法:
-
分布式事务:
- 两阶段提交:第一阶段都看是否准备是否可以提交;第二阶段即提交或是回滚。
-
跨库join
- 把原来的join操作改为多次的数据库操作;例如,查询用户的商品信息,可以先查询出用户的id,然后,再根据用户id,去商品库查询数据。
- 进行适当的数据冗余。
-
跨库查询解决:
- 问题:分库分表之后,查询数据需要到各个库中的各个表上获取数据。