champly

To be or not to be is up to you

该文档主要是 mit 6.824 课程的笔记以及一些扩展。

Distributed Systems

Drivens and Challenges

分布式系统的核心是通过网络来协调,共同完成一致任务的一些计算机。包括大型网站的存储系统、大数据运算(MapReduce)。在设计一个系统时或者面对一个需要解决的问题时,如果可以在一台计算机上解决,而不需要分布式系统,那就应该用一台计算机解决问题。很多的工作都可以在一台计算机上完成,并且通常比分布式系统简单很多。所以,在选择使用分布式系统解决问题之前,应该充分尝试别的思路,因为分布式系统会让问题解决变得复杂。

分布式系统会让问题的解决变得复杂,引入分布式系统的驱动力主要是:

  • 需要获得更高的计算性能:大量的并行运算、大量 CPU、大量内存、以及大量磁盘在并行的运行;
  • 可以提供容错(tolerate faults)。比如两台计算机运行完全相同的任务,其中一台发生故障,可以切换到另外一台;
  • 有一些问题天然在空间上就是分布式的。例如银行转账,本身就分布在不同的地域,这就需要一种两者之间协调的方法,所以有一些天然的原因导致系统是物理分布的;
  • 构建分布式系统来达成一些安全的目标。比如有一些代码并不被信任,但是有需要和它进行交互,这些代码不会立即表现的恶意或者出现 Bug。你不会想要信任这些代码,所以想要将代码分散在多处运行,这样你的代码在另外一台计算机运行,我的代码在我的计算机上运行,通过一些特定的网络协议通信。所以,我们可能会担心安全问题,我们把系统分成多个的计算机,这样可以限制出错域。
Read more »

该文档主要是《eBPF 核心技术与实战》课程的笔记以及一些扩展。其中代码在ebpf-learn-code仓库中,编译环境都在 Docker 镜像中,也具备 cilium-ebpf 的编译环境。

什么是eBPF

eBPF 是从 BPF 技术扩展而来的,得益于 BPF 的设计:

  • 内核态引入一个新的虚拟机(执行引擎),所有指令都在内核虚拟机中运行;
  • 用户态使用 BPF 字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行。

这就使得包过滤可以直接在内核中执行,避免了向用户态复制每个数据包,从而极大提升了包过滤的性能,进而被广大操作系统广泛接受。而 BPF 最初的名字由最初的 BSD Packet Filter 变成了 Berkeley Packet Filter 。

发展历程

Read more »

Linux 任务调度

task_struct

在 Linux 里面,无论是进程还是线程,到了内核里面,统一都叫任务(Task),由一个统一的结构体 task_struct 进行管理

task

这个结构有点复杂,具体可以看相关 代码。

任务 ID

Read more »

Linux 进程和线程

进程

进程的定义如下:

进程(Process)是指计算机已执行的程序,用户下达执行进程的命令后,就会产生进程。同一个程序可以产生多个进程(一对多),以允许同时有多个用户执行同一个程序,却不会相互冲突。进程需要一些资源才能完成工作,比如 CPU、内存、存储、文件以及 I/O 设备等。

这里说的程序,一般都是 ELF 格式的可执行文件。

ELF

Read more »

Init blog

1
2
3
4
5
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server

Themes

可以在 这里 查看自己喜欢的主题,我使用的是 keep, 这个主题(对移动端也进行适配了的),如果喜欢的话可以根据 这个配置 配置成你想要的样式

Github Setting

使用 Github Actions 自动部署 Hexo 博客, 这个就是我参考的一个文档,其中需要说明的一些点有如下的地方:

Read more »

安全组

当一个网络包进入网卡的时候,首先拿下 mac 头看看是不是当前网卡的。

  1. 如果是,则拿下 IP 头,得到了 IP 之后,就开始进行路由判断。在路由判断之前这个节点称为 PREROUTING。
  2. 如果发现ip是当前网卡 IP,包就应该发给上面的传输层,这个节点叫做 INPUT。
  3. 如果发现 IP 不是当前网卡的,就需要进行转发,这个节点就叫 FORWARD。
  4. 如果ip是当前网卡的 IP,则发送到上层处理。处理完一般会返回一个结果,把处理结果发出去,这个节点称为 OUTPUT。
  5. 无论是 FORWARD 和 OUTPUT,都是在路由判断之后发生的,最有一个节点是 POSTROUTING。

iptables 模块

在 Linux 内核中,有一个框架叫 Netfilter。可以在上面的几个节点放一个hook函数,这些函数可以对数据包进行干预。如果接受就是 ACCEPT;如果需要过滤掉就是 DROP;如果需要发送给用户态进程处理,就是 QUEUE。

iptables 就是实现了 Netfilter 框架,在上面五个节点上都放了hook函数,按照功能可以分为:

Read more »

最近搭建 Kubernetes 集群的时候使用的网络插件是 bridge + host-local

关于cni插件

安装 kubelet 的时候会有一个 kubernetes-cni-version-0.x86_64.rpm 的依赖文件,安装了之后会在 /opt/cni/bin 下面会有各种网络插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# rpm -qpl kubernetes-cni-0.7.5-0.x86_64.rpm
warning: kubernetes-cni-0.7.5-0.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 3e1ba8d5: NOKEY
/opt/cni
/opt/cni/bin
/opt/cni/bin/bridge
/opt/cni/bin/dhcp
/opt/cni/bin/flannel
/opt/cni/bin/host-device
/opt/cni/bin/host-local
/opt/cni/bin/ipvlan
/opt/cni/bin/loopback
/opt/cni/bin/macvlan
/opt/cni/bin/portmap
/opt/cni/bin/ptp
/opt/cni/bin/sample
/opt/cni/bin/tuning
/opt/cni/bin/vlan

所有的 cni 插件在 spec-v0.3.1 之前只实现两个接口 add, del。在 spec-v0.4.0 之后会在 del 之前执行 check ,所以多了一个 check 接口。

版本差异: Container Network Interface Specification

Read more »
0%