/images/avatar.jpg

Kiosk Studio (2022)

eBPF超乎你想象

eBPF 是什么? eBPF:过去 50 年操作系统最大的变革!!! 在过去,如果想让应用程序处理网络数据包是不可能的,因为应用程序运行在Linux的用户空间,它是不能直接访问主机的网络缓冲区,这里由内核管理和保护。内核保证了进程隔离,进程只能通过系统调用(syscall)来获取自己的网络数据包信息。 1992 年的 USENIX 会议上,The BSD Packet Filter: A New Architecture for User-level Packet Capture ,第一次提到 BSD Packet Filter (简称BPF)这个概念,这篇论文带来了一个革命性技术。正如其名称他是包过滤相关的技术,其基本原理是用户态定义 BPF 字节码来定义过滤表达式,然后传递给内核,再由虚拟机解释运行。 有了 BPF 之后,应用程序不再需要 syscall,数据包不需要在内核空间和用户空间之间来回交互传递。而是我们将代码直接交给内核,让内核自己执行,这样就可以让代码全速运行,效率更高。 我们使用的 tcpdump 主要通过 libpcap 实现,而libpcap 就是基于 eBPF 。执行下面的命令,导出 tcpdump 所灌入内核的 BPF 程序。如下的 tcpdump 命令,可以直接过滤出IP地址包含 1.1.1.1 和 2.2.2.2 的数据包。 1 2 3 4 5 6 7 8 tcpdump -d 'ip src 1.1.1.1 or ip src 2.

一条MySQL查询语句经历了什么--索引


MySQL 之前已经接触过非常多了,只是将MySQL当作一个 excel 文档,需要取数据了通过命令获取。 但是实际上 MySQL 内部还是有很多奥秘的,一条语句的执行也有很多有意思的设计逻辑。

下面对自己学习的MySQL的执行过程做一个学习记录。通过把MySQL 拆解一下,来对MySQL做更深层次的理解。再遇到一些异常或者问题时,可以直戳本质,更为快速定位并解决问题。

elasticsearch 原理及入门

前言:最近打算将自己的一些服务尽可能的迁移到 k8s 集群里,ELK 就是其中的一个,后面可以的话将本博客的 搜索功能从 algolia 迁移到 自己的ES 里。搜索这个东西的确很有意思的,在没有自己的 OLAP 分析平台之前,ES 的确是最佳选择。值得好好学习一下。 前面已经有文章介绍 k8s 集群的搭建方法和ES的部署方式了。 ubuntu20.04 部署 kubernetes(k8s) Elasticsearch 简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。 快速入门 基本概念 节点 Node、集群 Cluster 和 分片 Shard ElasticSearch 是分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个实例。单个实例称为一个节点(node),一组节点构成一个集群(cluster)。分片是底层的工作单元,文档保存在分片内,分片又被分配到集群内的各个节点里,每个分片仅保存全部数据的一部分。 索引 Index、类型 Type 和 文档 Document 索引是一类文档的结合。而文档是具体的一条数据。对比我们比较熟悉的关系型数据库如下: RDBMS(MySQL) Elasticsearch Table Index(Type) Row Doucment Column Field Schema Mapping SQL DSL 使用 Restful API 交互 elasticsearch 本身使用 Restful API 通过端口 9200进行交互。其基本组成如下

使用eBPF跟踪 SSL/TLS 连接

前面的文章介绍了 eBPF 的入门知识,这篇算是一个实战吧,使用 eBPF 来跟踪 TLS加密连接。TLS 是目前互联网上的一个标准工具了,可用于加密的通信。本文尝试使用 eBPF 技术将加密的密文还原为明文。当然这并不意味着TLS不再安全,想干坏事的人可以在中间代理服务器、网关设备上偷听。因为eBPF 所实现的追踪明文一定是要建立在真正去做ssl 明文转密文写入操作的。 关于eBPF基础知识请查看 认识eBPF 如何使用eBPF进行追踪 简介 BPF 可用于对内核函数、用户态函数进行插桩进而实现观测的需求。当然一个有趣的应用就是跟踪网络流量。虽然TLS 流量通过网卡时是密文的,但是我们可以利用 eBPF在加密前进行跟踪。eBPF 的事件追踪并不局限于 kprobes,uprobes也可以用来追踪应用程序代码到达某个指令时触发 BPF 程序。 TLS Tracing (openssl)" TLS Tracing (openssl) 通过上图,我们可以知道TLS库的数据读写是 SSL_write 和 SSL_read 函数。跟踪这些调用就可以在加密之前或者解密之后的流量。 查询跟踪函数 其实上面的图已经说明了我们要追踪的函数是 SSL_write 和 SSL_read ,但是这里也聊一下这两个函数是如何查找的吧。一般来说,我们可以使用 readelf 命令。输出的结果,排除一些明显和加密过程相关的函数之外,映入眼帘的便是 SSL_read 1 2 3 4 5 $ readelf -Ws /usr/lib/x86_64-linux-gnu/libssl.so |grep -i 'ssl_read' 658: 0000000000032ce0 126 FUNC GLOBAL DEFAULT 15 SSL_read@@OPENSSL_3.

如何使用eBPF进行追踪

eBPF 我们知道了程序的工作原理和编程接口以及事件触发机制。那么我们就可以开始 eBPF 程序的开发和执行过程了。

跟踪类 eBPF 程序主要包含 内核插桩 (BPF_PROG_TYPE_KPROBE)、跟踪点(BPF_PROG_TYPE_TRACEPONT)以及性能事件(BPF_TYPE_PERF_EVENT)等类型的程序,而每类的 eBPF 程序又可以挂载到不同的内核函数、内核跟踪点或者性能事件上。当这些内核函数、内核跟踪点或者性能事件被调用的时候,挂载到其上的 eBPF 程序就会自动执行。

Redis持久化机制

Redis 最常见的一个用处就是当作缓存服务器,将后端数据库中的数据存入内存中,再直接从内存中读取数据是一个非常高效的方式。但是内存存储模式有一个问题,掉电后会丢失数据,所以作为一个数据库来用的话必须考虑一旦服务器宕机,内存中数据的保存。

Redis的持久化机制分为 AOF(Append Only File) 日志和 RDB 快照。