主题
分布式 和 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完成