Cloud Computing - Virtual network
VPC
Virtual Private Cloud:构建在云上,相互隔离,用户可以自主控制的私有网络环境
概念
描述
网段
私有网络的内部 IP 区段,通常采用 CIDR 表达
子网
私有网络的下级网络结构,一个私有网络可以划分出多个子网,阿里云将子网称为交换机
路由表
定义私有网络内流量的路由规则,每个子网都必须有一张关联的路由表(自动创建默认路由表)
网关
是对进出私有网络的流量进行把守和分发的重要节点
安全组
私有网络内虚拟机进出流量的通行或拦截规则,相当于虚拟机外层的网络防火墙
VPC 属于局域网,VPC 创建成功后,网段无法修改,至少要创建一个子网(交换机)(网段也不能变更)
可以建立跨可用区的私有网络高可用:让主力集群在一个可用区工作,备用集群在另一个可用区随时待命,按需切换
关键:提前规划 VPC 和各子网的网段在没有 VPC 的情况下创建虚拟机,一般会自动生成 VPC – 生产慎用!
VM
VM 通过弹性网卡(Elastic network interface,ENI)来与 VPC 连接ENI 一方面与 VM 绑定,另一方面则嵌入到某个 VPC ...
Cloud Computing - Cloud disk
概念
云硬盘:云虚拟机可以挂载和使用的硬盘(系统盘 + 数据盘)
将云端磁盘服务称为块存储(Block Storage),与 Linux 中的块设备相对应,可以格式化并施加文件系统
数据持久化 (非易失性存储):最少三副本,高可用,极少发生数据丢失
但不能完全依赖云硬盘的可靠性,应该进行额外的备份
云硬盘和传统硬盘的核心差异:绝大多数的云硬盘都是远程的 – 计算存储分离
在云端,虚拟机的硬盘大概率不在宿主机上,而是在专用的磁盘服务器阵列中
通过云数据中心内部的特有 IO 线路进行连接
IO 优化实例
对云虚拟机和云硬盘之间的网络传输,进行了软硬件层面的优化,进而充分发挥所挂载磁盘的性能
性能
性能指标:IOPS、吞吐量、访问延时等
最终性能受存储介质和容量大小共同影响
等级
存储介质
基于 HDD
性能一般,最高 IOPS 大概在数百左右,但成本低
基于 SSD / HDD
IOPS 在数千左右,通常为默认选项,综合发挥 SSD 的性能优势和 HDD 的容量优势
基于 SSD
IOPS 能够上万,有非常稳定的 IO 能力,用来承载关键业务或者数据库等 IO 密集型应用
基于 高 ...
Cloud Computing - Virtual machine
体系结构
计算存储分离
传统虚拟化
对单一物理机器资源的纵向分割,计算、存储、网络等能力都是一台物理机的子集,可伸缩性有较大局限
云虚拟机
云端有大规模的专属硬件和高速的内部网络
除了核心的 CPU 和内存仍属于同一台宿主机外,硬盘和网络等可以享受云端的基础设施
在可扩展性(硬盘、网卡、公网 IP)和故障隔离方面,有很大优势
名称
阿里云:ECS - Elastic Compute Service
AWS:EC2 - Elastic Compute Cloud
Azure:Virtual Machines
腾讯云:CVM - Cloud Virtual Machine
网络安全组
Network Security Group
网络安全组:一层覆盖在虚拟机之外的网络防火墙,能够控制虚拟机入站流量和出站流量
网络安全组并不工作在 OS 层,是额外的一层防护,非法流量不会到达 OS 的网络堆栈,不会影响 VM 的性能
网络安全组是一种可复用的配置,可以同时应用于多个虚拟机,软件定义网络
网络安全组非常灵活,规则会动态生效
类型规格类型
具有同一类设计目的或者性能特点的虚拟机类别:通用均 ...
Cloud Native Foundation - Go IO
阻塞 IO
阻塞:等待数据就绪
阻塞 + 同步
非阻塞 IO
非阻塞:等待数据就绪
轮询:效率不高
非阻塞 + 同步
IO 多路复用
(集中线程)阻塞 + 同步
当数据就绪后,集中线程会唤醒其他线程,阻塞的仅仅只是一个线程
select / poll
通过传参的形式来轮询 fd 列表,长度有上限(1024)
epoll
通过 mmap 将用户态的内存和内核态的内存进行共享,不再需要传参,解决了 fd 长度受限的问题
基于事件侦听,而非轮询wq: wait queue, rdlist: ready list, rbr: red black tree
Go HTTP:goroutine 与 fd 绑定
异步 IO
非阻塞 + 异步
异步:拷贝数据(Socket 缓冲区 -> 应用缓冲区)的过程也是由 Kernel 来完成
Cloud Native Foundation - Go GC
Heap 管理
Allocator (向 OS 申请)初始化连续内存块作为 Heap
Mutator 申请内存,Allocator 从 Heap 中未分配的区域中分割小的内存块
用链表将已分配内存连接起来
内存块元数据:大小、是否使用、下一个内存块的地址
Collector 会扫描 Heap,将不再被使用的内存设置为 unused
内存分配TCMalloc
TC = Thread Caching
page:内存页,大小为 8k,Go 与 OS 之间的内存申请和内存释放,都是以 page 为单位的
span:内存块,一个或者多个连续的 page 组成一个 span
sizeclass:空间规格,每个 span 都带有一个 sizeclass,标记着该 span 中的 page 该如何使用
sizeclass - 8,16,32,48,64,80 …
object:对象,用来存储一个变量数据的内存空间
span 在初始化时,会被切割成一堆等大的 object
如果 object 的大小为 16B,Span list 1 中的 span 为 8k,该 span 中的 page 会被初始 ...
Cloud Computing - Region + Availability zone
Region
云计算厂商在某个地理位置提供的所有云服务的组合,是厂商对外提供云服务的基本单位和容器
绝大多数的云服务,通常都会按照 Region 进行部署
用户使用的所有云资源,都会隶属于某个 Region,通常在创建资源时确定
每个 Region 都会有个由字母数字构成的 Region 代号(Region ID or Region Code),一般为全局唯一
Region 的设立与分布,体现了云厂商的业务重点和地区倾向
不同 Region 之间的距离,一般为数百公里或以上
Region 的选址思路
人口稠密的中心城市 - 离用户和商业更近
相对偏远的地区 - 维护成本低
选择 Region
地理位置
尽可能地靠近应用所面向的最终用户
混合云架构(本地数据中心与云端互联)
混合云的专线接入,一般以同城或短距离接入为主(控制费用 + 提高线路稳定性)
Region 之间云服务的差异
同一个云在不同的 Region,所能提供的服务和规模可能是不同的
Region 的服役时间,往往与 Region 内云服务的可用性有较大的关联
新 Region - 最新的硬件和云端服务
旧 Region ...
Cloud Native Foundation - Go Scheduling
线程加锁
线程安全
123456789// fatal error: concurrent map writesfunc unsafeWrite() { conflictMap := map[int]int{} for i := 0; i < 1<<10; i++ { go func(i int) { conflictMap[0] = i }(i) }}
锁
Go 不仅支持基于 CSP 的通信模型,也支持基于共享内存的多线程数据访问
Sync 包提供了锁的基本原语
原语
描述
sync.Mutex
互斥锁
sync.RWMutex
读写分离锁
sync.WaitGroup
等待一组 goroutine 返回
sync.Once
保证某段代码只执行 1 次
sync.Cond
让一组 goroutine 在满足特定条件时被唤醒
Mutex12345678910111213141516171819202 ...
JavaScript - Function
闭包
闭包是一个绑定了执行环境的函数,JavaScript 中的函数完全符合闭包的定义
在 JavaScript 中,与闭包对应的概念就是函数
执行上下文
执行上下文:执行一段代码(包括函数),所需要的所有信息
相比于普通函数,JavaScript 函数的主要复杂性来源于其携带的环境部分
版本ES3
Key
Desc
scope
作用域、作用域链
variable object
变量对象,用于存储变量的对象
this value
this 值
ES5
Key
Desc
lexical environment
词法环境,当获取变量时使用
variable environment
变量环境,当声明变量时使用
this value
this 值
ES2018 - Recommend
this value 被纳入 lexical environment
Key
Desc
lexical environment
词法环境,当获取变量或者 this 值时使用
variable environment
变量环境,当声明变量时使用
code eva ...
JavaScript - Asynchronous
Asynchronous
异步编程适用于 IO 密集型应用
异步编程的传统实现方式:Callback
1234567console.log("main start");setTimeout(() => console.log("sync start"), 1000);console.log("main end");// main start// main end// sync start
依次执行多个异步操作:Callback Hell
1234567891011121314151617setTimeout(() => { console.log("Action 1"); setTimeout(() => { console.log("Action 2"); setTimeout(() => { console.log("Action 3"); ...
JavaScript - Event Loop
单线程
JavaScript 的主要宿主环境为浏览器,主要用途是与用户互动和操作 DOM
如果采用多线程模型,会带来复杂的同步问题
从诞生伊始,JavaScript 就是单线程,是其核心特性
为了利用多核 CPU 的计算能力,HTML 5 提出了 Web Worker 标准
允许 JavaScript 创建多个子线程,但子线程完全受主线程控制,且不允许操作 DOM
任务队列
JavaScript 在单线程模式下,所有任务都需要排队
任务分类
同步任务(synchronous)
在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务
异步任务(asynchronous)
不进入主线程,而是进入任务队列的任务
只有任务队列通知主线程,某个异步任务可以执行了,该异步任务才会进入主线程执行
运行机制
所有同步任务都在主线程上执行,形成一个执行栈
主线程之外,还存在一个任务队列
只要异步任务有了运行结果,就会在任务队列中放置一个事件
一旦执行栈中所有的同步任务执行完毕,系统就会读取任务队列中的事件
事件对应的异步任务会结束等待状态,进入执行栈开始执行
主线程不断重复上一步 ...