如果感觉文章中的图片不清楚可以查看下面链接:
原图VISIO:
https://note.youdao.com/share/?id=7a495e3fba485308f30d700a88ab5689&type=note#/
原图PDF地址:
https://note.youdao.com/share/?id=35600647bd0177daf74252ca9ce45b77&type=note#/
后续会把原图文件同步到Github上面上去。暂时谢分享在有道云上。
1:分布式系统介绍
1.1 什么事分布式系统
1.1.1 分布式系统的定义
是一组联网计算机上的组件,组件之间通过消息传递来通信并协调行动。
1.1.2 分布式系统的意义
单机的缺陷:
- 升级单机处理能力的性价比越来越低。
- 单机处理能力存在瓶颈。
- 单机不能满足稳定性和可用性的考虑。
1.2 分布式系统的基础知识
1.2.1 组成计算机的5要素
输入 + 输出 + CPU + 内存 + 外存
1.2.2 线程和进程
进程是CPU资源分配的最小单位。
线程是CPU资调度的最小单位。线程属于进程,一个进程内的多个线程共享进程的内存空间,而多个进程之间的内存空间是相互独立的。
- 互不通讯的多线程模式
- 基于共享容器协同的多线程模式
生产者和消费者模型。
- 基于事件协同的多线程模式
- 多进程模式
1.2.3 网络通信基础和知识
1.2.3.1 OSI与TCP/IP
1.2.3.2 网络IO实现方式
- BIO 阻塞式IO
- NIO 非阻塞式IO 基于事件驱动采用Reactor模式
- AIO 异步IO
1.2.4 如何把应用丛单机扩展到分布式
1.2.4.1 输入设备的变化
人机交互的输入设备 + 系统间调用者
1.2.4.2 输出设备的变化
人家交互输出设备 + 系统间响应者
1.2.4.3 控制器的变化
1.2.3.4 运算器的变化
1.2.3.5 存储的变化
1.2.5 分布式系统的难点
1.2.5.1 缺乏全局时钟
节点时钟不一致,分布式锁
1.2.5.2 面对故障独立性
多个节点故障,怎么定位
1.2.5.3 处理单点故障
集群,单点做备份,降低垫底故障的影响范围
1.2.5.4 事物的挑战
两阶段提交 最终一致 BASE CAP Paxos
2 大型网站及架构演进过程
2.1 大型网站的特点
高并发 + 海量数据
2.2 大型网站的架构演进
2.2.1 Java技术单机构建的网站
最基本的单体应用 应用服务器和数据库服务器部署在一台机器上
2.2.2 数据库与应用分离
将数据库服务器和应用服务器部署在不同的机器上
2.2.3 应用服务器集群
因为HTTP协议是无状态的,Session有关联用户和服务器的状态
需解决Session的问题
- Session Sticky
根据Session Id在负载均衡器做路由,同一个Session Id总是路由到同一台服务器。
缺点:
1:一台服务器宕机,那么机器的会话数据全部丢失。
2:会话表示是应用层的信息,那么负载均衡服务器需要在应用层进行数据解析,开销比较大。
3:负载均衡服务器变成了一个有状态的节点。
- Session 复制
增加会话同步机制,把会话数据同步到其他服务器上面。
缺点:
1:同步Session数据增加网络带宽的开销。
2:同步会导致每台服务器有集群的数据,导致Session数据的内容占用会很严重。
3:Session数据集中存储
将Session数据存储在存储服务器上。
缺点:
1:读写Session数据引入了网络操作,相对于读取本地数据来说,存在延时和不稳定 但是我们服务器通讯在内网,所以问题不大。
2:存储集群出现问题,就会影响我们的应用。
4:基于Cookie
把Session的数据存储在Cookie里面,
缺点:
1:Cookie长度限制。
2:安全性,依赖于客户端维持状态。
3:性能影响,带宽消耗:每次HTTP请求增加带宽消耗。
2.2.5 数据压力变大,读写分离
2.2.5.1 数据库读写分离
数据库主从同步,更新操作连接主库数据源,查询操作连接从库数据源
2.2.5.2 搜索引擎是一个读库
2.2.5.3 缓存
- 数据缓存
- 页面缓存
2.2.6 引入分布式存储系统
2.2.7 数据库瓶颈
2.2.7.1 专库专用,数据垂直拆分
将不同的业务数据拆分到不同的数据库中。
不能关联查询。
2.2.7.2 数据水平分表
主键一致性
2.2.8 应用面对新挑战
数据拆分,业务越来越大,项目很难修改
2.2.9 消息中间件
异步和解耦