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. 无论是 FORWARDOUTPUT,都是在路由判断之后发生的,最有一个节点是 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%