目录

大型网站系统与Java中间件实践-笔记-01

第1章 分布式系统介绍

1.1 初识分布式系统

1.1.1 分布式系统的定义

首先分布式系统一定是由多个节点组成的系统,一般来说一个节点就是我们的一台计算机;然后这些节点不是孤立的,而是互相连通的;最后,这些连通的节点上部署了我们的组建,并且相互之间的操作会有协同。

1.1.2 分布式系统的意义

下面三个方面 * 升级单机处理能力的性价比越来越低。 * 单机处理能力存在瓶颈。 * 出于稳定性和可用性的考虑。

1.2 分布式系统的基础知识

1.2.1 组成计算机的5要素

冯 ∘ 诺依曼型计算机的5个组成部分: * 输入设备 * 输出设备 * 运算器 * 控制器 * 存储器——内存和外存

1.2.2 线程与进程的执行模式

一个进程可以有多个线程,一个线程只属于一个进程。

1.2.2.1 阿姆达尔定律

Amdahl’s law: S(N) = 1 / ((1 - P) + P / N) 其中,P指的是程序中可并行部分的程序在单核上执行时间的占比,N表示处理器的个数(总核心数)。S(N)是指程序在N个处理器(总核心数)相对在单个处理器(单核)中的速度提升比。

这个公式告诉我们,程序中可并行代码的比例决定你增加处理器(总核心数)所能带来的速度提升的上限,是否能达到这个上限,还取决于很多其它的因素。

1.2.2.2 互不通信的多线程模式

两个线程,没有交集,各自执行各自的任务和逻辑。

1.2.2.3 基于共享容器协同的多线程模式

有一个队列用于生产和消费,那么,这个队列就是多个线程会共享的一个容器或者是数据对象,多个线程会并发访问这个队列。

需要加锁控制并发。

1.2.2.4 通过事件协同的多线程模式

一个线程需要另一个线程的触发才能执行。

防止死锁。

1.2.2.5 多进程模式

多进程和多线程有比较多的相似之处,也有不同。不同的最大原因是,线程是属于进程的,一个进程内的多个线程共享了进程的内存空间;而多个进程之间的内存空间是独立的,因此多个进程间通过内存共享、交换数据的方式与多个线程间的方式就有所不同。此外,进程间的通信、协调,以及通过一些事件通知活着等待一些互斥锁的释放方面,也会与多线程不一样。

1.2.3 网络通信基础知识

在分布式系统中,组件分布在网络上的多个节点中,通过消息的传递来通信并且进行动作的协调。因此网络通信在分布式系统中非常重要。

1.2.3.1 OSI与TCP/IP网络模型

ISO的OSI网络模型 * Application Layer * Presentation Layer * Session Layer * Transport Layer * Network Layer * Data Link Layer * Physical Layer

TCP/IP网络模型 * Application * Transport * Internetwork * Network Interface

1.2.3.2 网络IO实现方式
1.2.3.2.1 BIO方式

BIO即Blocking IO,采用阻塞的方式实现。也就是一个Socket套接字需要使用一个线程来进行处理。发生建立连接、读数据、写数据的操作时,都可能会阻塞。

1.2.3.2.2 NIO方式

NIO即Nonblocking IO,基于事件驱动思想,采用的是Reactor模式。 在NIO的方式下不是用单个线程去应对单个Socket套接字,而是统一通过Reactor对所有客户端的Socket套接字的事件做处理,然后派发到不同的线程中。

1.2.3.2.3 AIO方式

AIO即AsynchronousIO,就是异步IO。AIO采用Proactor模式。AIO与NIO的差别是,AIO在进行读写操作时,只需要调用相对应的read/write方法,并且需要传入CompletionHandler;在动作完成后,会调用CompletionHandler。

1.2.4 如何把应用从单机扩展到分布式

1.2.4.1 输入设备的变化

将分布式中的某个节点作为输入设备。

1.2.4.2 输出设备的变化

将分布式中的某个节点作为输出设备。

1.2.4.3 控制器的变化

单机系统中,控制器就是CPU中的控制器。在分布式系统中,负载均衡系统就算是一种控制器。

  • 使用硬件负载均衡的请求调用

在集群中,这种方式对于发起请求的一方和处理请求的一方来说,都是透明的,可以称为透明代理。

  • 使用LVS的请求调用

这种方式存在两个不足: * 会增加网络的开销,这个开销一方面指的是流量,另外一方面指的是延迟。 * 这个透明代理处于请求的必经路径上,如果代理出现问题,那么所有的请求都会受到影响。

  • 采用名称服务的直连方式的请求调用

在请求发起方和请求处理方的直接连接外部,有一个“名称服务”的角色,它的作用主要有两个,一个是收集提供请求处理的服务器的地址信息;另外一个是提供这些地址信息给请求发起方。

  • 采用规则服务器控制路由的请求直接调用

在请求发起的机器上,会有对规则进行处理从而进行请求处理服务机器选择的代码逻辑。这个方式与名称服务方式的不同在于,名称服务是通过跟请求处理的机器交互来获得这些机器的地址的,而规则服务器的方式中,规则服务器本身并不和请求处理的机器进行交互,只负责把规则提供给请求发起的机器。

  • Master + Worder的方式

存在一个Master节点来管理任务,由Master把任务分配给不同的Worker去进行处理。

1.2.4.4 运算器的变化

在单机系统中,运算器是具体的电子元件,而在分布式系统中,运算器是由多个节点来组成的。

总结起来,构成运算器的多个节点在控制器的配合下对外提供服务,构成了分布式系统中的运算器。

1.2.4.5 存储器的变化

方案与前面相同,依次是代理、名称服务、规则服务、Master-Worker服务。

1.2.5 分布式系统的难点

1.2.5.1 缺乏全局时钟

很多时候我们使用时钟,它可以区分两个动作的顺序,而不一定要知道准确的时间。这种情况需要交给一个单独的集群来处理。

1.2.5.2 面对故障独立性

在分布式系统中,整个系统的一部分有问题而其它部分正常是经常出现的情况,我们称之为故障独立性。

1.2.5.3 处理单点故障

在整个分布式系统中,如果某个角色或者功能只有某台单机在支撑,那么这个节点称为单点,其发生的故障称为单点故障,也是常说的SPoF(Single Point of Failure)。

一台数据库拆分到多台数据库后,出现故障的次数和总时间会比单台数据库的时候要多。也就是说,我们增加了故障出现的次数和时间,降低了故障的影响面。

1.2.5.4 事物的挑战