初入分布式系统
- 分布式系统出现的原因,目前主要有两个
- 解决性能问题,解决单台计算机的并发能力,计算能力
- 解决故障问题,解决单台计算机发生故障(断电,服务中断,电脑宕机)时,保证整个系统仍能够运行
- 相较于分布式系统,在20世纪还流行过集中式系统,集中式系统,就是所有的资源都处在同一台计算机中,集中式系统为应对服务,需要的硬件资源很多(就是很贵),这样做好处是不需要对不同子系统进行协调控制,保证程序运行的稳定性,但坏处是,当故障发生时,该软件服务就变为不可用
- 分布式系统(distributed system),我的理解是分布开来的软件系统,分布式系统首先是一个软件系统,一个完全依赖软件和通用计算机组成的服务,
就是不被物理资源所限制,通过增加计算机数量和软件协同完成一个服务 - 分布式系统的特点除了依赖的计算机多以外,还表现为一个服务,通常对外的接口,或者说服务对接的入口,仅有一个,通过内部协同多台计算机,不需要对接不同的服务器,软件内部自己完成负载均衡,故障处理与恢复,协调不同子系统之间的状态等
- 分布式系统另一大优势在于,即使计算能力仍然不满足现有需求,通过一些简单的操作,继续为分布式系统添加计算机,就可以满足日益增长的需求,称为 可拓展性
分布式系统功能设计
- 分布式系统是非常复杂的,首先分布式系统非常依赖网络,而网络故障、延时等问题就导致整个系统建在一个不稳定的地基上,其次,一个关键问题,如何保证不同的计算机之间的数据(状态)都是一样的(一致性),然后各个计算机之间的关系是怎样的,不同计算机担当的角色一样吗,当性能不够的时候,如何保证新增的计算机能够被整个系统所使用
- 分布式系统对于故障处理的要求较高(高可用),也就是当系统中的一些计算机无法正常提供服务时,如何保证整个系统仍然能够正常运行
解决分布式系统问题的常见思路
- 维护整个系统的数据、状态保持一致?
- 使用分布式锁,即通过网络实现的锁,协调不同计算机并发带来的问题
- 保证系统高可用?
- 单机的数据进行复制备份,保证数据丢失情况下,仍能够保证运行
- 定期检测其他机器的状态,当故障发生时,及时处理
- 如何协调不同计算机进行工作?
- 最简单的方法就是让一台计算机称为大哥计算机,所谓大哥计算机(主计算机),负责收集和管理小弟们的信息,分发任务和接收请求
- 可以手动指定一台计算机作为 主 ,其他作为从属计算机
- 也可以通过算法,自动计算生成主计算机
著名的分布系统理论和算法
这些理论和算法,对一些方案进行深入研究,并给出具体实施步骤,关键在复杂情况发生下时,仍能够保证算法的可行
- Paxos 算法 (一致性算法)
- https://my.oschina.net/u/150175/blog/2992187
- CAP理论
- https://blog.csdn.net/chen77716/article/details/30635543
常见分布式问题
- 分布式系统首先要解决的问题是高并发的问题,这意味着组成分布式系统的每个组件都需要很高的并发
- linux socket 数量是有上限的,需要对最大 socket 数量进行控制
- 任何连接,使用完毕后,要手动关闭,能使得该资源能够快速释放
- TCP 连接,需要经历 listen - connected - close 的过程,其中异常情况下,传输到一半的时候,客户端断开了,此时服务器会出现 close_wait 状态的 TCP,详细请参看 TCP close_wait 异常
- 对每个组件进行压力测试,测试在短时间内,最多能够接受多少连接
- 高并发并不意味着 CPU 资源消耗很大,大多数更依赖 内存 和 网络带宽
- 出现连接崩溃的时候,首先自己不要崩溃,保持冷静,思考可能出现在哪一个环节,不能马上确定问题的时候,首先要划分组件,考虑哪个组件崩溃的可能性
- 利用监控,首先去验证简单且能快速排查的地方,例如计算机硬件系统资源, 进程服务是否正常
top 、netstat、 ps
- 遇到问题,可以先画下图,展示整个系统的工作流程,从中寻找问题