/images/avatar.jpg

Kiosk Studio (2022)

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 快照。

认识eBPF

eBPF 是从 BPF(Berkeley Packet Filter)技术扩展而来,最初就是为了实现快速包过滤而实现的一门技术,因为可以直接在内核中执行,避免了向用户态复制每一个数据包,从而极大提升了包过滤的性能。后来由于这个思路非常受到欢迎,在各个场景都需要内核态的快速开发,使得BPF不再限于网络栈,而是内核的一个顶级子系统。即成了现在的 eBPF 。

https://img1.kiosk007.top/static/images/blog/ebpf_logo.png

ebpf_logo

Redis为什么这么快?

一提到 Redis ,首先的一个印象就是快!但是之前很少研究过Redis底层的一些实现。之前接触Redis比较少,有一个项目是做限流用到了 Redis,大致原理是记录最近访问过的IP和时间,如果下次再有请求到来匹配IP查找之前是否有过访问,如果有则判断时间差是否小于一小时,小于则禁掉,大于则更新时间戳,如果没有就是第一次访问。