- 博客(29)
- 收藏
- 关注
原创 8.1.2 TiDB存储引擎的原理
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据 库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布 式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。
2025-08-01 19:08:53
655
原创 8.1.1 不一样的kv存储RocksDB的使用场景
RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一 套能在服务器压力下,真正发挥高速存储硬件性能的高效数据 库系统。这是一个 C++ 库,允许存储任意长度二进制 KV 数据。支持原子读写操作。RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进 行调优,包括直接使用内存,使用 Flash,使用硬盘或者 HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生 产和调试使用。RocksDB 大量复用了 levedb 的代码,并且还借鉴了许多 HBase 的设计理念。
2025-07-31 19:38:10
924
原创 7.3.3 文件系统组件
通常一个完整的Linux系统由数千到数百万个文件组成,文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组。文件系统类型一般可以分为 3 种:基于磁盘的文件系统( Disk-based Filesystem)虚拟文件系统( Virtual Filesystem)网络文件系统( Network Filesystem)a、inode。
2025-07-25 22:03:20
901
原创 7.3.2 内核内存管理运行机制
1、内存管理架构内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面,具体结构如下所示:a、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。b、内核空间:内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。c、硬件:处理器包含一个内存管理单元(Memory Management Uint,MMU)的部件,负责把虚拟地址转换为物理地址。
2025-07-24 21:41:17
640
原创 7.3.1 进程调度机制那些事儿
1、进程有两种特殊形式:没有用户虚拟地址空间的进程叫内核线程,共享用户虚拟地址空间的进程叫作用户线程。共享同一个用户虚拟地址空间的所有用户线程叫线程组。
2025-07-23 19:09:19
816
原创 内核bpf的实现原理
bpftrace能帮我们干什么?1、统计 tcp连接的生命时长、2、统计mysql执行一条sql语句的时间3、统计redis执行命令的时间、 4、对文件进行一次读或者写的时间。常用命令:}'}'}'}'}'}'bpftrace实现:获取到每一个连接的源IP、源端口、目的ip、目的端口。执行方式。
2025-07-21 13:50:52
261
原创 5.6.3 ZeroMQ无锁队列
这中机制使用了一种被称之为CAS(比较和交换)的特殊操作,这个特殊操作是一种特殊的指 令,它可以原子的完成以下操作:它需要3个操作数m,A,B,其中m是一个内存地址,操作将m指向的内存 中的内容与A比较,如果相等则将B写入到m指向的内存中并返回true,如果不相等则什么也不做返回false。back_chunk需要chunk有元素插入的时候才指向对应的chunk。整个chunk的元素都被取出队列才去回收chunk,而且是把最后回收的chunk保存到spare_chunk,然后释放 之前保存的chunk。
2025-07-09 16:48:42
962
原创 5.6.2、ZeroMQ源码分析
简单来说,就是对象A将命令发出到目标对象B所在线程绑定的mailbox,然后poller监听收到命令的信号, 以通知线程处理命令,线程将命令交给对象B如果一个类想要使用线程收发命令的功能,那么这个类就必须继承自object_t。源码中可以看到,object_t 定义了一个uint32_t变量tid,tid(thread id)表示该object_t对象所在的线程,即应该使用哪个线程的 mailbox。
2025-07-08 17:41:55
586
原创 5.6.1 ZeroMQ
1. io_thread 创建时向 poller 注册自己的mailbox fd,以及 this 指针,用于事件回调。2. 在 ctx_t 中,通过 slots [i] = io_thread->get_mailbox ();注册I/O线程的邮箱。然后通过 slots [tid_]->send (command_);可以向该邮箱发送指令。3. 上述 send() 调用的是mailbox 的 send() ,他会向管道 cpipe 写入数据,并发送信号 signaler- >send()。
2025-07-08 16:39:47
830
原创 5.5.2 mqtt broker
retained 消息是指在 PUBLISH 数据包中 Retain 标识设为 1 的消息,broker 收到这样的 PUBLISH 包以后, 将保存这个消息,当有一个新的订阅者订阅相应主题的时候,broker 会马上将这个消息发送给订阅者。启动代理服务:mosquitto -v;(-v 详细模式 打印调试信息 默认占用:1883端口)发布内容:mosquitto_pub -t hello -m world -r。
2025-07-08 15:47:57
575
原创 5.5.1 mqtt的高效使用场景
功能:使用mosquitto库函数前,要先初始化,使用之后就要清除。清除函数;返回值:MOSQ_ERR_SUCCESS 总是功能:使用完mosquitto函数之后,要做清除工作。返回值: MOSQ_ERR_SUCCESS 总是功能:创建一个新的mosquitto客户端实例,新建客户端。参数:①id :用作客户端ID的字符串。如果为NULL,将生成一个随机客户端ID。如果id为NULL,clean_session必 须为true。
2025-06-15 11:24:21
816
原创 5.4.2 workflow 组件实现-
注意:安装上述插件前,先确保 linux 环境下安装 gcc/g++, cmake, clangd;也可以使用 Mark 老师给 clangd-linux16.0.2.zip;把 bin 目录下的 clangd 拷贝到 /usr/local/bin 目录中;把 lib 目录下的内容拷贝到 /usr/local/lib 目录中;
2025-06-13 18:50:48
829
原创 5.4.1 workflow 应用场景
搜狗公司C++服务器引擎,编程范式。支撑搜狗几乎所有后端 C++在线服务,包括所有搜索服务,云输入法,在线广告等,每 日处理数百亿请求。这是一个设计轻盈优雅的企业级程序引 擎,可以满足大多数后端与嵌入式开发需求。特征:快速搭建 http 服务器。可异步访问常见第三方服务:http,redis,mysql 和 kafka。构建异步任务流,支持常用的串并联,也支持更加复杂的 DAG结构。作为并行计算工具使用。除了网络任务,我们也包含计算任 务的调度。所有类型的任务都可以放入同一个流中。
2025-06-13 18:38:28
796
原创 找不到openresty
出现错误,说明系统无法找到 OpenResty 命令。这通常是因为 OpenResty 没有正确安装,或者没有被添加到系统的PATH环境变量中。
2025-06-09 21:40:54
329
原创 Kong 动态负载均衡
Kong 是一款基于 openresty 编写的高可用、易扩展的开源 API Gateway 项目。Kong 支持两种工作模式:一种是不使用数据库;另一种是使用 数据库;可用的数据库为 PostgreSQL、Cassandra(分布式 NoSQL 数据库)
2025-06-01 20:17:51
1045
原创 5.2.1 高性能web网关 Openresty
在 nginx 重新加载配置文件时,运行里面 lua 脚本,常用于 全局变量的申请。例如 lua_shared_dict 共享内存的申请,只 有当 nginx 重启后,共享内存数据才清空,这常用于统计。
2025-05-30 21:53:12
769
原创 Nginx反向代理与系统参数
功能:作为一个webserver,对外部监听的端口,由外界来一个请求(对应一个http的请求),接收完数据后,对于nginx部分每一个进程都一样的,划分到哪一个进程处理,内部就是把http协议解析出来,从而转发到后端的server上面。由于fork()函数创建一个子进程,当链接的时候子进程的fd进行epoll操作,而父进程的fd不会触发。nginx基础组件,线程池,内存池,原子,共享内存,string, list, hash, array。nginx源码 多进程网络,http状态机,多进程网络加锁。
2025-05-29 21:37:45
596
原创 gRPC网络线程模型和应用实践
3. 修改GreeterClient构造函数 注意:stub2_(Greeter2::NewStub(channel))的初始化,这里是Greeter2::NewStub,前往不要写 成Greeter::NewStub(channel)异步处理的epoll方式和同步是类似的,但对于rpc函数的响应提供了更灵活的处理机制,可以将一些耗 时的处理逻辑放到外部的线程池进行处理。3. 完整代码 文件名:greeter_server.cc。以下代码是在原有的greeter_server.cc修改。
2025-05-27 23:04:25
608
原创 4.4.3 grpc for c++使用案例
定义客户端的类,实现两个方法用来发送grpc请求以及接收grpc响应public:elseelseprivate:主要是定义两个方法用来发送grpc请求以及接收grpc响应同样在实现方法的时候可以通过 request 结构里面的 set_ + 成员名 函数设置成员同时通过 request 结构里面的成员名函数获取改成员创建通道 定义客户端的时候初始化通道。
2025-05-03 23:48:21
799
原创 4.4.2 grpc for c++使用案例
手把手写rpc范例流程:1. 编写proto文件2. 根据proto文件生成对应的.cc和.h文件3. server程序继承Service4. client程序使用stub5. 编译server和client程序。IM.Login.proto第二行:包的名字 package Player; 是 Player第五行:grpc服务的名称 service ImLogin 是 ImLogin后面的请求响应结构,无论名字是大写还是小写,最终调用的时候都是小写。在 .proto 文件中定义了数据结构,这些数据结构
2025-05-03 23:36:22
612
原创 protobuf的旧版本清理
编译大型项目(如 Linux 内核、gRPC、OpenCV 等)时,充分利用 CPU 资源。4是手动指定 4 线程(适合 4 核 CPU)。但是云服务器、机器配置低的时候就不要用,因为多线程可能会卡死。,因为gprc需要的查马克版本最低为3.15,如果低于这个版本需要升级。(并行编译),显著提高编译速度(尤其是多核 CPU 的机器)。之后就进入源码路径进行源码编译。找到所有的protobuf。删除后找到它的安装路径。找到google文件夹。make的时候可以使用。然后退出来,之后删掉。
2025-04-23 16:47:50
347
原创 4.3.4-kafka 存储机制
之前的所有 LogSegement 都不能执行写入操作。为了更好理解这个概念,我们将最后一个 LogSegement 称 为。
2025-04-18 22:23:02
617
原创 4.3.2 C++实践 kafka
1、Kafka架构是由producer(消息生产者)、consumer(消息消费者)、borker(kafka集群的 server,负责处理消息读、写请求,存储消息,在kafka cluster这一层这里,其实里面是有很多个 broker)、topic(消息队列/分类相当于队列,里面有生产者和消费者模型)、zookeeper 这些部分 组成。
2025-04-15 17:12:00
1096
原创 4.1.1 消息队列和kafka
消息+队列(MessageQueue,简称MQ)本质就是个队列,FIFO先入先出,只不过队列中存放的内容是message,从而叫消息队列。使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。使用消息队列去解耦消息队列的场景:1、异步处理 2、流量服务 3、服务解耦 4、发布订阅 5、高并发缓冲。
2025-03-31 23:15:10
1113
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人