Skip to content

分布式 和 cap理论

分布式

分布式计算:两个或者多个软件共享信息,这些软件可以运行在同一台机器上,也可以通过网络连接起来共同实现计算

分布式系统:解决集中式 架构的性能瓶颈问题
核心:可扩展性, 通过对服务和存储的扩展,提高系统的处理能力

服务:  软性:专门某种语言 提供运行服务的
			php---> apache nginx
			java ---> tomcat
			硬性: 硬件服务器
通过对多态服务器的系统工作,完成高并发和大数据量的任务

分布式的特点:
	分布式系统 不出现单点故障  或  服务和存储无状态的特点:
	单点故障: 在系统中 ,一台机器出现问题,导致整个系统无法正常工作
	无状态:无状态的服务器可以满足系统需求,部分机器宕机 不影响全部 随时扩展
问题:
	节点之间通信  网络分区故障 数据不一致****

cap理论

一个分布式系统:只能同时满足  一致性  可用性 和 分区容忍性  其中的两项
	一致性: 所有节点 同时 看到的数据是相同的,更新操作和返回客户的结果是一致的
	可用性: 任意时刻,读写操作都是成功的 即服务一直可用
			系统稳定性>99.9
			sla 服务水平协议  99.95%  故障时间 每月只能由 0.05% 时间
	分区容忍性:当部分节点消息丢失,出现分区故障,分布式系统仍然能正常运行

小结: 在分布式系统中,系统是层层拆分的,p(分区)固定的, cp应用模型是cp架构和ap架构的
	  保证 a 和 c 稳定性

高并发

并发: 一个时间段内, 有多少进程在执行,由于时间对于计算机来说,是非常短暂的,人看起来 是同时执行的,所以我们认为是一起发生  并发
	  同一时刻有多少进程在同时执行   1微秒内

注意:如果只有一个cpu 是无法实现并行的,同一时刻 只能执行一个进程,如果执行多个进行,必须切换多个cpu ,可以同时开启多进程,这种称之为并行

高并发:可以在同一时间段内 处理大量的请求,10万请求/秒

node的高并发 和 分布式集群(线程 和 进程)

进程

cpu承担运算, 操作系统是管理者,应用程序运行在操作系统之上的 一个具有独立功能的程序在一个数据集上依次动态执行的过程,是操作系统进行资源分配和调度一个独立单位 由程序(描述功能),数据集合(程序执行所需的数据和工作区),进程控制块(包含进程的描述信息和控制信息,唯一标识)

特证:
	动态性: 产生和消亡过程
	并发性:
	独立性: 独立单位
	结构性: 程序 数据 控制块

启动一个程序,同时可能启动一个以上的进程

线程

线程是一个单独执行的任务吗,不会另外消耗多余的资源了
	线程之间可以共享资源
	线程可以创建和销毁另外一个线程
	线程可以并发执行

线程和进程的五个阶段: 创建 就绪 运行 阻塞 终止

区别:

一个进程有多个线程  线程是进程一个任务
进程之间是相互独立的,同一个进程下的线程是共享空间,线程可以相互创建和销毁
进程 是操作系统分配资源的最小单位  线程是程序执行的最小单位(线程只是一个任务)

线程切换速度 比进程快得多

多线程:

多进程:操作系统同时运行多个程序
多线程:在同一个程序中 有个任务在顺序轮流执行
多进程:操作系统能够同时运行多个任务
多线程:在同一个程序中 又多个线程在运行

主线程

它可以产生其他子线程
通常主线程一般最后完成执行  重要功能 关闭各种子线程

为什么使用多线程

线程启动和退出比较快,资源消耗比较少
线程调用更多的核心的硬件和软件对象

多线程优势

占据时间较长的程序任务交给后台执行
在一个等待型的任务中, 用户输入 文件读写 网络收发消息 .... 线程资源消耗比较少
所有的应用软件中,线程都是占有重要作用的

多线程缺点

线程过多,也会大量消耗资源   合理应用
由于线程可以互相创建---》 可能会形成阻塞  死锁

node特性

单线程

node中js主线程与其他线程(i/o线程),是无法共享状态的
node单线程优势:不用管其他线程  避免死锁  避免线程切换带来的资源消耗
缺陷: 无法高效利用 多核cpu   ,有可能引起cpu阻塞  , 一点出问题导致整个程序退出

利用多核cpu

第一种:使用child_process的核心模块cluster,child_process和net组合应用
	  在一台多核服务器上 创建多个进程,使用fork来充分利用每一个核心(处理好进程之间的通信)

第二种:将物理机划分为多态单核的虚拟机 通过pm2等工具,管理多态单核虚拟机形成的集群

cpu时间轮转  使用pm2工具 绕开坏点,执行正常的服务器的程序

异步I/O

node 具有异步I/O特性的  当遇到I/O请求的时候,node会分配给他一个线程,置于后台运行了
node去执行主线程上的其他任务,I/O返回的时候,node把返回传输出去

事物驱动

主线程通过event loop事件循环 触发线程运行 这是node支持高并发的重要原因

分布式node架构

node集群

nginx(调度和负载均衡)--》node集群---》redis同步数据和状态

redis是操作内存的,读写速度非常快,但实际上 ,不可能让redis 过多的内存资源 数据管理 会添加mysql进行的

减轻内存的负担,项目运行中后期,需要对数据查询和分析的时候,mysql的优势很明显了(sql数据库)
注:短时间内 更新大量数据的时候,优先考虑redis 以达到快速存取的目的

nginx 是流量接入层: 对所有流量进行处理
	流量缓冲,分流和转发
	超时检测  建立链接超时  读取用户数据超时  后端响应超时  关闭链接超时.....

	在集群中 又坏点,隔离 修复 直到正常位置
	建立连接池和保存链接会话

	流量接入层----》 负载层 ---》根据时机情况发送到各台node机器上

提供的服务:
	文件上传下载
	线上配置各种环境
	设置定时任务
	镜像服务
	通信....

node 集群层

编写和执行node代码,为用户提供后端服务
与数据交互,包括redis mysql 等数据库
管理和监控机器状态

数据库层

创建数据和数据结构,方便node程序 增删改查各种数据
部署redis  且想node提供响应数据接口

apache tomcat .....

node集群层的使用

单核运行

多线程操作

单台机器上 如何让node 使用多核得cpu

node 但进程
  	32位操作系统  512M内存
  	64位 		 1G

node中cluster模块  主进程和n个worker进程,由主进程控制和协调 worker进程得运行

注意:
  	新建得链接 需要主进程完成,再有主进程把tcp链接 分配给worker完成