- 博客(14)
- 资源 (2)
- 收藏
- 关注
原创 KV-Engine_设计高可用架构——主从复制 (Master-Slave Replication) 的实现
主从同步可以 关闭 Master 的持久化,只在 Slave 上开启 AOF/RDB,让 Master 专心处理业务,让 Slave 承担繁重的 IO 任务,分析脚本连接到 Slave 进行全量扫描,完全不影响 Master 的响应速度。简单来说,主从同步(Master-Slave Replication) 是一种将数据从一台服务器(Master,主节点)复制到一台或多台其他服务器(Slave,从节点)的机制。最后,我们要实现命令的传播,这是主从同步的核心数据链路,让主设备与从设备数据保持一致,代码如下。
2026-02-01 02:26:17
373
原创 KV-Engine:实现指令流水线与二进制安全协议
收到这 50KB 数据后,并不会处理完第一条就返回,而是在循环中不断地消耗数据、执行命令、移动指针。按空格切分,解析器会把 value中第一个空格后的数据当作多余的参数报错。在批量处理指令的需求里,我们实现了pipeline, Pipeline 允许客户端将多个命令打包,一次性通过。:如果我的 Key 或 Value 里包含空格、换行符甚至是图片数据,简单的文本协议应该就不能用了。:如何一次性发送 几千条指令,让服务器进一个大包,吐出一堆回复,即处理 TCP 粘包。,从而实现了吞吐量的数量级提升。
2026-02-01 01:33:32
321
原创 KV-Engine:详解数据的增量与全量持久化
在之前我们完成了KV存储的基础架构后,包括网络层,协议层,引擎层等,在这之后,我们在实际使用过程中面临一个问题,就是如何记录我们的操作来解决数据安全的问题,内存是易失的,一旦进程退出或者服务器宕机,所有数据将丢失,为了保证数据的持久性,我们是需要将内存中的数据写入磁盘。在本项目中,由于AOF和RDB存储的是RESP协议格式的数据,直接使用我们写好的网络协议栈就行,将文件一次性读入内存buffer,直接让协议即可。另外,有限加载AOF,这里面的数据是更全的,如果没有AOF就加载RDB即可。
2026-02-01 00:10:53
343
1
原创 DPDK协议栈实战-深入内核原理,写用户态的EPOLL
上篇文章中,实现了TCP的三次握手和基本的收发数据。但是,目前的nsocket实现是基于阻塞IO,也就是nrecv会一直卡住直到有数据到来。虽然说绕过了linux内核,但标准epoll就无法管理用户态的TCB,所以就需要自己在用户态写一个EPOLL代码的主要结构为这是一张图片,ocr 内容为:inrcvbufsndbufout。
2026-01-23 14:41:19
574
原创 写一个极简的DPDK用户态协议栈(UDP_TCP)
特性UDPTCP数据模式报文 (Datagram)字节流 (Stream)头部长度字段有 (16位 Length)无 (只有头部长度 Data Offset)数据边界协议层保留边界,不可拆分协议层不保留边界,应用层需处理数据长度来源直接读取 UDP 头部IP总长 - IP头 - TCP头应用场景信是一封封的 (DNS/视频)水是连续流的 (文件/Web)
2026-01-23 12:37:44
648
原创 深入拆解高性能网络架构:从内核瓶颈到 DPDK 实现原理和架构介绍
在标准的Linux网络编程中,一个数据包会从网卡到应用程序,其中,内核使用sk_buffer(socket buffer)结构体来管理数据包,该数据集包含大量的元数据,在各层之间传递时,在高并发场景下,频繁的内存分配和释放消耗大量的CPU周期。小包场景下,同样要跑满某个速率的小包,每秒需要处理大量的小包,传统linux处理一个包的开销是固定的,要申请中断,内存,协议栈路径,会忙不过来,DPDK采用内存池技术预先分配内存,不在动态创建销毁结构体,通过批量处理的方式一次性搬运固定数量的包。
2026-01-23 00:41:39
648
原创 KV-Engine:基于 C 的高性能多模态网络键值存储系统(补充)
(2)实现一个内存池。程序启动时,先向操作系统申请一大块连续内存,将内存切分成不同大小的槽位,大概需要存储一个key时,直接从槽位链表中拿一个合适槽位的空闲块给他,用户删除key时不free给系统,而是把这个开还给原来的槽位链表,供下次复用。上一篇博客我们已经把各层的架构完全实现,实现了业务逻辑的完全解耦,这篇文章对代码中的一些知识点进行补充,并进行测试用例的实现并回答一些面试题。上边补充了存储引擎层的一些知识点,并手动实现了相应的api用于不同的场景,至此,整个KV存储的知识和架构就全部介绍完整了。
2026-01-22 19:00:24
516
原创 KV-Engine:基于 C 的高性能多模态网络键值存储系统
首先是网络层,网络层本质上就是实现数据的收发,从之前学习中可以得知,我们实现了reactor,协程(ntyco),proactor(io_uring)三种设计模式来实现网络数据的收发,因为我们已将业务层(实现收发)与网络IO的解耦,只需要修改相应位置的业务代码即可。至此,我们实现了命令的识别,并根据命令实现不同的任务,结合这两段代码,便实现了协议的处理和识别,我们就可以处理来自客户端的请求并形成响应,协议层便完成了。首先可以很容易的想到,我们只需要在两个收发回调函数中写相应的收发逻辑即可,另外。
2026-01-22 03:13:21
374
原创 深入理解Linux 高性能网络编程:从 Epoll 到 io_uring
异步读取时,用户进程调用异步接口 ( io_uring_submit ),只告诉内核要读fd,读完放到buffer里,这个操作立即返回,之后由内核在后台完成数据读取和拷贝,当数据全部准备好并拷贝到用户buffer后,内核通知进程任务完成,这相当于是一个 Proactor 模型。协程本质上是用户态的线程,当协程调用co_read发现数据未就绪时,它不会阻塞线程,而是让出CPU,将控制权交给调度器。生产者是内核, 内核完成任务后,生成 **CQE ** 放入此队列 ,消费者是用户进程,用户从这里获取结果。
2026-01-22 01:39:32
362
原创 windows异步机制iocp,Reactor 与 IOCP的对比
根据前面所学,io模型中需要完成的任务为IO检测和IO操作,在reactor中,io检测由epoll_wait/select/poll负责,这几个接口只通知事件就绪,比如说读缓冲区有数据了,写缓冲区有空间了这种情况。其中函数返回时,IO操作可能还没开始,是异步IO,IO操作完全在内核里进行,用户线程在等待期间可以处理其他逻辑,知道数据完全准备好。其中IO检测和IO操作全部由操作系统完成,用户线程只需要等待操作完成的通知,此时数据已经存到了用户层所提供的缓冲区中。内核负责检测数据,并将数据写入用户缓冲区。
2026-01-17 23:06:58
366
原创 HTTP 服务器:在reactor模式框架内实现协议层应用
到这里我们可以总结一下,在整个webserver中,epoll担任多路复用的角色,reactor担任事件分发的角色(执行哪些操作,用哪些回调函数),这个架构就是实现了网络io连接进行数据交换的基础,这篇文章在该基础上实现了协议传输,可以与万维网实现多媒体文件的传输。HTTP是一个基于TCP/IP的通信协议,它工作与客户端-服务端架构,浏览器作为HTTP客户端通过URL向服务端发送请求(request),服务端收到请求后做出回应(response)为了保持 Reactor 的通用性,我们将业务逻辑从底层的。
2026-01-08 12:40:09
446
原创 Reactor 模型:基于 Epoll 的事件驱动架构解析
我们可以敏锐的感觉到,这是一个由事件触发任务的一个流程,reactor是将所有要处理的事件注册到一个中心io多路复用器上,同时主线程阻塞在多路复用器上,一旦有IO事件到来或者准备就绪,多路复用器返回并将事先注册的相应IO事件分发到对应服务器中。应用程序不是主动调用某个API完成任务执行,应用程序注册一些待执行的任务,在某个事件发生时,reactor主动调用应用程序注册的接口来执行相应的任务,这些接口就称为回调函数。下面的代码实现事件的注册,accept成功后,调用此函数将新连接加入连接池里。
2026-01-07 23:41:30
401
原创 网络io与多路复用io 一步步优化出高性能网络模型
这个时候就引出了目前linux中实现io多路复用的select poll epoll的三种机制,他们不在一次申请好多线程,而是用一个线程监视多个fd,查看io发生的事件,io的生命周期里是由无数多个事件组成的,在工程上,我们关注的是io的某几个事件而不是io的整个生命周期,所以就有了这三种来观察io事件发生的三种机制。主线程里拿到客户端的连接后,我们创建一个新线程,然后将收发任务扔到新线程里,此时主线程便可以一直接收到客户端的连接,收到连接后将负责的任务扔给新线程,便可以实现io的多路复用。
2026-01-07 22:39:58
622
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅