0. Golang Tutorial
Goroutine
在 java/c++ 中我们要实现并发编程的时候, 我们通常需要自己维护一个线程池, 并且需要自己去包装一个又一个的任务, 同时需要自己去调度线程执行任务并维护上下文切换, 这一切通常会耗费程序员大量的心智;那么能不能有一种机制, 程序员只需要定义很多个任务, 让系统去帮助我们把这些任务分配到 CPU 上实现并发执行呢?
goroutine 的概念类似于线程, 但 goroutine 是由 Go 的运行时(runtime)调度和管理的;Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU; 它在语言层面已经内置了调度和上下文切换的机制
在 Go 语言编程中你不需要去自己写进程, 线程, 协程, 你的技能包里只有一个技能–goroutine, 当你需要让某个任务并发执行的时候, 你只需要把这个任务包装成一个函数, 开启一个 goroutine 去执行这个函数就可以了, 就是这么简单粗暴;
用法
只需要在调用函数的时候在前面加上 go 关键字, 就可以为一个函数创建一个 goroutine;
一个 goroutine 必定对应一个函数, 可以创建多 ...
1.design_purpose
什么是分布式系统?
一个分布式系统, 从物理上说是 用户 -network- 多台服务器主机 形成的一个特殊的系统
如果对这个模型进行抽象, 其实就是 单个terminal 和 多个 process 之间的通信,
其中, 这些 process 空间上分离, 通过网络进行通信, 不应该存在明显延迟, 并且命运不同(一台主机挂了不应该影响其他主机)
从上面的抽象系统目标, 我们还可以更加抽象出分布式系统的设计目标:
High availability: 整体的分布式系统应当永远可用
Low latency: 用户请求的响应时间应当足够低
Scalability: 系统支持同时服务多个用户
…
银行后端为例
分布式系统设计的困难可以分为以下几个难点:
concurrency: 多个 process 之间的并发控制, 但是之间的网络不可靠,
主机状态不可靠
inconsistency: 数据交换一定会存在可见延迟
ambiguity: 一个存款请求需要等待下游主机反馈
ACK, 但是如果没有收到, 如何判断是哪一步出了问题? 存款是否成功?
channel 管道实现的同步
rendez ...
1. Database Management System
DBMS (Database Management System)
A software package designed to store and manage databases. Often loosely called
a database.
传统的数据管理, 往往是结合 csv
格式文件来将数据存储起来, 并且允许通过各种约束条件查找,
但是假设存在一个学生数据库系统, 包括 姓名, 年龄, id,
成绩等字段, 如果原始数据的存储方式是分成两个 文件, 一个存储 姓名到 id
的映射, 另一个存储 id 到成绩的映射, 那么采用传统的 c++ 等语言来查找数据,
会存在很多问题, 例如, atomic 的操作, 很难在确保 performance 的前提下能保证
consistency
因此, 为了避免上述问题,
需要一个软件系统来管理数据的存储和访问,确保有以下设计目标:
Data Independence: 即客户端需要看到的只是数据的逻辑结构而非实际存储结构
Efficiency
Centralized Management
Security adn integri ...
6. 网络控制指令
tc 流量控制
qdisc
qdisc (队列规则 queueing discipline) 是 Linux 中用于管理网络流量的机制;它允许用户定义如何处理和调度网络数据包, 我们可以将其看作一个具有一定规则的队列; 当tc处理网络包时, 会将包入队到qdisc中, 这些包会根据指定的规则被内核按照一定顺序取出
例如执行 ip l 的时候, 可以看到一些类似的信息:
12341: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: enp1s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether d4:6d:50:cf: ...
Paxos
Paxos 共识算法
在 90 年代 Lamport 大师提出了 一种基于消息传递且具有高度容错特性的共识(consensus)算法
注意这里的 共识算法 并不是 一致性算法 (consistency algo), 二者的区别在于:
一致性算法: 主要关注数据的一致性, 确保所有节点(node/replica)在某个时间点看到相同的数据状态;
副本之间看到的值是否一样
如何解决多个副本间的写入冲突(如 last-write-wins, vector clocks)
共识算法: 多个节点就某个单一值(如某次写入, 谁是leader)达成一致的过程
分布式系统中的 节点就"某个值"进行投票与确认
通常用于 领导选举, 分布式日志, 状态同步
如 Paxos, Raft, PBFT(Practicle Byzantine Fault Tolerance Algo)
共识算法是实现强一致性的一种机制, 但不是一致性算法的全部
强一致性: 无论何时, 所有用户读取某个数据项时, 都能看到最后一次成功写入的值
分布式系统中的节点通信存在两种模型: 共享内存 ...
网络分区错误与容错机制
Paxos 共识算法
在 90 年代 Lamport 大师提出了 一种基于消息传递且具有高度容错特性的共识(consensus)算法
注意这里的 共识算法 并不是 一致性算法 (consistency algo), 二者的区别在于:
一致性算法: 主要关注数据的一致性, 确保所有节点(node/replica)在某个时间点看到相同的数据状态;
副本之间看到的值是否一样
如何解决多个副本间的写入冲突(如 last-write-wins, vector clocks)
共识算法: 多个节点就某个单一值(如某次写入, 谁是leader)达成一致的过程
分布式系统中的 节点就"某个值"进行投票与确认
通常用于 领导选举, 分布式日志, 状态同步
如 Paxos, Raft, PBFT(Practicle Byzantine Fault Tolerance Algo)
共识算法是实现强一致性的一种机制, 但不是一致性算法的全部
强一致性: 无论何时, 所有用户读取某个数据项时, 都能看到最后一次成功写入的值
分布式系统中的节点通信存在两种模型: 共享内存 ...
Kernel Bypass 与 eBPF 框架
Kernel-Bypass 内核旁路技术
主要是为了解决超大并发下内核态与用户态之间的性能问题, 技术代表有 DPDK, eBPF等
随着移动互联网的发展, 云架构中复杂的服务治理已经将C10K的问题发展到C10M(单机并发 1000 万);一个大规模集群内, 面对东西向规模性的Gbp/s数据流量, 关键节点的挑战是用户态协议栈和多核并发问题
这个时候Linux 网络协议栈进行的各种优化策略, 基本都没有太大效果;网络协议栈的冗长流程才是最主要的性能负担
内核瓶颈限制
基于系统内核的数据传输会面临如 中断处理, 内存拷贝, 上下文切换, 局部性失效, CPU亲和性, 内存管理等等影响, 在高并发的场景下这些机制是非常大的瓶颈所在;
如图所示, 可以知道 L1, L2 层级的 cache 并不会在不同的 core 之间共享, 但是, L3
层级是允许不同 core 之间共享的, 也就是说在进行 switch context 操作的时候, L1 L2 层级的 cache 会发生 cache miss, 这无法避免, 并且在 超高并发的背景下, 上下文切换是非常频繁的, 因此 缓存 mis ...
Xen 与 KVM 的 hyprvisor 讲解
虚拟机主要包括四个方面的模拟, cpu, 内存, 中断, io
虚拟机模拟的原理最重要的就是陷入 (trapping) 模拟, 也就是当虚拟机执行一些敏感指令时会陷入kvm, 由kvm负责模拟, 完成后返回客户机
当前主流 (2025) 的虚拟化发展趋势是 Xen -> KVM
Xen 虚拟化基本原理
是一个直接运行在计算机硬件之上的用以替代操作系统的软件层, 它能够在计算机硬件上并发的运行多个客户操作系统(Guest OS)
Xen对虚拟机的虚拟化分为两大类, 半虚拟化 (Para virtualization, PV) 和完全虚拟化 (Hardware VirtualMachine, HV);
半虚拟化 PV
允许虚拟机操作系统感知到 自己运行在Xen Hypervisor上而不是直接运行在硬件上, 同时也可以识别出其他运行在相同环境中的客户虚拟机
为了调用系统管理程序(Xen Hypervisor), 要有选择地修改操作系统, 然而却不需要修改操作系统上运行的应用程序
完全虚拟化 HV
又称"硬件虚拟化", 简称HVM, 是指运行在虚拟环境上的虚拟机在 ...
5. sed 指令
Overview
sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
Usage
1sed [-hnV][-e <script>][-f <script file>][text file]
Arguments
-e<script> / --expression=<script> : 直接在命令行中指定要执行的脚本 (script, not file) 来处理文本文件
-f<script file> / --file=<script file> : 从指定的脚本文件中读取 sed 脚本
-n / --quiet / --silent : 抑制默认输出行为,只输出经过处理的行
Action
a 新增,a 的后面可以接字符串,内容会出现在当前的下一行
c 替换,c 的后面可以接字符串,内容会替换 n_1 到 n_2 之间的所有行
d 删除,删除当前行, 不接任何字符串
i 插入,i 的后面可以接字符串,内容会出现在当前的上一行
p 打印,打印当前行, 不接任何字符串,通常和 -n 选项一起 ...
