服务端
文章平均质量分 89
小屋子大侠
这个作者很懒,什么都没留下…
展开
-
redis6运行架构-多线程处理流程
redis6运行架构图redis6新特性中加入的最大的特性就是加入了多线程来处理网络的读写从而来提高响应性能,本文就简单的剖析一下redis6的运行的机制,学习一下redis6的多线程机制是如何在事件驱动中执行的。下图就是redis6的主题的运行的逻辑。redis6任务分类在redis6中以事件驱动的工作流程中主要包括了三种类型的任务执行。事件驱动处理程序任务,即网络IO的读写事件通过epoll来触发执行。定时任务,同样也是随着epoll的触发来判断进行任务的执行。事件任务,即在第一步事件驱原创 2022-04-21 17:09:19 · 1102 阅读 · 1 评论 -
pika主从同步原理
pika主从同步主要为了分析探索一下pika是如何实现主从同步的,pika的主从同步的原理与redis的同步方案还不相同,本文主要是为了分析其主从同步的相关流程(pika基于3.4版本)。pika主从同步原理主从同步的原理,主要是通过在启动的时候启动了两部分的线程来进行的。auxiliary_thread线程pika_rm中的pika_repl_client线程池和pika_repl_server线程池先逐个分析一下两个部分线程的工作的流程。auxiliary_thread线程在pika原创 2022-04-01 15:05:12 · 1375 阅读 · 0 评论 -
pika在codis中的探索
背景面对kv类型数据在公司的存储量越来越大,以及在性能响应不敏感的情况下,利用原生的codis方案来存储数据的方案,成本也越来越高,在这种场景下,急需一种替代方案能够有效兼顾成本与性能。故引入了pika来作为codis的底层存储,来替换成本较高的codis-server,并围绕pika的方案进行了一系列的设计改造。codis的原理设计codis项目主要分为codis-fe、codis-dashboard、codis-proxy和codis-server这四个组件。codis-fe主要是方便统一管理多原创 2022-01-30 18:27:43 · 2451 阅读 · 0 评论 -
runc原理概述
runcrunc作为容器的运行时,现在作为独立的项目来进行发展,runc提供一套简单的容器运行环境,包括进程的命名空间、cgroups和文件系统权限等管理的功能,runc是基于oci标准的产物,可以让大家都通过统一的接口来进行运行时的操作。其本质的管理工作也是最主要的几个重要的函数clone,unshare和setns等重要的操作函数。runc原理流程runc作为运行时,即在提供了挂载目录、运行权限等运行参数的情况下将容器启动运行,真正的作为一个运行管理的工具使用,一些例如镜像、日志配置等待交互清理功原创 2021-12-24 19:05:45 · 4127 阅读 · 0 评论 -
flannel原理初探针对0.1.0版本
flannelflannel是针对k8s设计的三层的网络解决方案。在k8s中为了使pod之间能够使用一种偏平的网络架构,从而完成跨Pod的网络通信。官网给的原理图如下:flannel 使用TUN/TAP 设备,并使用 UDP 创建覆盖网络来封装 IP 数据包。 子网分配是在 etcd 的帮助下完成的,它维护覆盖到实际 IP 的映射。从以上的原理图也可知大概的流程是是怎么操作的。其中具体是一个什么流程呢,本文就根据flannel的0.1.0版本的源码进一步学习。flannel流程-基于Backen原创 2021-11-11 10:57:52 · 790 阅读 · 0 评论 -
rkt简单概述
rkt项目rkt项目最早跟随k8s使用的运行时的组件,并且也入选过cncf的沙箱项目,但是在最后的使用中还是被抛弃了,其中主要的是croi-o和containerd两个项目的接受度更高,并且社区活跃度越来越低,最终停止维护。虽然停止维护但是也可以是一个很好的案例来学习一下rkt项目的设计思路与思想。主要的学习资料就是官网提供的 运行原理 与架构。rkt原理梳理rkt 的主要界面是一个命令行工具 rkt,它不需要长时间运行的守护进程。 这种架构允许 rkt 就地更新,而不会影响当前正在运行的应用程序容器原创 2021-10-22 15:27:56 · 4464 阅读 · 0 评论 -
redis分析-内存碎片动态回收概述
内存碎片动态回收在redis4版本中,新加入了内存碎片动态回收特性,该特性支持动态的将内存碎片进行回收,该功能的主要是运行redis压缩一些小空间和未利用的空闲空间,从而允许内存回收。通常情况下出现内存碎片是每一个内存分配器都会碰到这个问题并且占用额外资源,平常情况下只需要重启服务就可以降低内存的碎片率,或者将所有数据都先迁移走然后等数据删除完成之后再重新迁移回来。因为如上的原因redis提供了一种在服务运行中也可以内存整理的方法。基本流程是当碎片率超过一个比率之后,redis会通过jemalloc的原创 2021-10-13 11:33:11 · 539 阅读 · 0 评论 -
golang实践LSM相关内容
LSMLSM(log-structured merge-tree)是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高出很多,在计算机科学中,日志结构的合并树是一种具有性能特征的数据结构,这使得它对于提供对具有高插入量的文件(例如事务日志数据)的索引访问很有吸引力。与其他搜索树一样,LSM树也维护键值对。LSM树以两个或多个单独的结构来维护数据,每种结构都针对其各自的底层存储介质进行了优化;数据在两个结构之间批量有效地同步。在日志的写入过程中通过批量顺序写会原创 2021-08-12 15:33:07 · 834 阅读 · 0 评论 -
golang-实现自己的事件驱动
golang实现自己的事件驱动众所周知,go中的异步操作都已经封装在了运行时的过程中,有关socket的网络的异步操作都封装到了go的netpoll中,从而简化了编程形式。本文也就根据evio库总结而来。golang跨平台库如何编写golang的跨平台库,现在主流的方式如下:evserver│ go.mod│ main.go │└───show│ │ show.go│ │ show_darwin.go│ │ show_linux.go通过创建原创 2021-07-30 17:39:09 · 1950 阅读 · 1 评论 -
codis3数据迁移探索
背景在测试codis的过程中,由于现网使用的codis的每个集群的量相对较大,为了确保在codis的升级过程中能够紧急处理突发的一些问题故熟悉一下codis有关的基本原理。codis的逻辑codis3相对于codis2性能各方面都有一个比较大的提升,性能提升较大的改造。例如将信息同步从zk中解耦出来,将dashborad的功能跟偏向于一个master管理功能,将迁移的最小的锁的粒度缩小到slot上,在迁移slot的过程中通过设置状态来完成迁移工作,并且在迁移的过程中通过问询的方式来开始以整个迁移的流程原创 2021-04-23 16:07:53 · 449 阅读 · 0 评论 -
邮件服务器SMTP概述
邮件服务器最近由于涉及到邮件服务器相关内容的工作,并且需要进行部分的协议转发的工作故了解一下邮件服务器的协议。当前选择应用较为广泛的SMTP的邮件协议。SMTP协议概述SMTP全称是Simple Mail Transfer Protocol,最近的协议定稿是rfc5321,根据文档的描述,基础的设计方案如下;通过SMTP客户端发送邮件信息到一个或者多个SMTP服务端,并记录发送的状态结果。SMTP客户端一旦确定目标的方式域,确定要向其复制副本的SMTP服务器的身份一条消息将被传输,然后执行该传输。原创 2021-02-26 11:15:15 · 4190 阅读 · 0 评论 -
分布式链路追踪zipkin
分布式链路追踪分布式链路追踪最早由谷歌的Dapper论文中提出的,提供提供简单易用的API来记录不同系统之间的调用的链路及耗时情况,从而提供各个系统的性能分析的依据。Dapper论文概述Dapper对分布式跟踪系统提出了一系列的要求如,性能低损耗,分布式跟踪系统对服务的性能损耗应尽可能做到小的影响,特别是对性能要求较高的业务。应用级别的透明,对于应用的开发者,需要对代码的侵入性要小,尽量提供开箱即用的工具提供给应用开发者使用,例如将跟踪系统封装到公共组件中去等。延展性要好,即可以方便的拓展。原创 2020-11-26 17:50:33 · 882 阅读 · 0 评论 -
分布式多层次限流概述
分布式限流分布式限流常见于对外提供服务的API,例如阿里云的语音服务接口等。对于这类的服务一般常见于资源消耗比较大,服务相对比较敏感,而且某些提供的限流功能要满足多层次的限流功能,比如一分钟一次,一小时十五次,一天三十次这种功能,相对于当前常见的分布式限流方案有采用zk、etcd等组件来实现的,优点就是分布式限流过程中对于使用方来说保证了高可用,也有使用redis来实现的,在redis的实现方案中如果需要保证高可用可考虑redis的哨兵功能来实现(如果集群模式下要保持访问的客户端的时钟一致),本文就基于r原创 2020-11-20 13:38:52 · 322 阅读 · 0 评论 -
限流设计
限流设计限流在日常的服务可以防止突发的流量将系统完全打垮,在日常的业务中,有些服务需要保持一定的稳定性,这种稳定性可以降低提供服务的响应速度,或者在系统资源在比较紧张的时候,为了避免宕机限制一定的访问速度,这就是常见的限流的场景。简单的限流实现常见的限流的实现方式,有如下两种;漏桶方式,即每一个请求都对应一滴水,在开始的时候都是满的,然后桶每隔一段时间就往外楼一滴水,当获得这滴水的时候,才可以处理请求,如果没有获得则等待或放弃处理。令牌桶方式,令牌桶即指以匀速向桶里面添加令牌,服务的时候需要从桶原创 2020-10-27 11:26:03 · 331 阅读 · 2 评论 -
docker依赖的技术探索
参考资料《自己动手写docker》http://www.sel.zju.edu.cn/?p=556docker原理探索docker用于开发应用,交付应用,运行应用的一种开源的软件。docker主要是通过操作系统层的虚拟化,来打包运行程序所需的依赖环境的一种容器化的技术, 相对于通过虚拟化硬件的方式而已,docker具有轻量级、快速高效的特点。随着docker云原生的火爆,再也憋不住来探索一下docker到底是通过什么技术特点来实现的,故简单整理了一下查询的资料。docker的技术特点在Lin原创 2020-07-17 15:09:31 · 404 阅读 · 0 评论 -
Redis的rdb格式学习
rdb格式背景在redis中,rdb格式是经过压缩之后,保存redis的数据的一种格式,该格式主要就是通过一定的压缩算法,将redis服务端中的内存数据落盘到文件中,本文主要就是分析一下该协议的具体格式,并解析一下。rdb格式rdb的格式的详细格式可参考 官网,其中最主要的格式如下所示,----------------------------# RDB is a binary format. There are no new lines or spaces in the file.52 45 44原创 2020-07-07 16:35:46 · 1008 阅读 · 0 评论 -
词法分析浅析
参考资料《自制编程语言基于C语言》《自己动手写编译器、连接器》《自己动手构造编译系统编译、汇编与链接》《编译原理 第二版》词法分析词法分析主要就是将源码分解成每一个定义的token,通过词法解析分析出哪些是关键字,哪些是标识符,哪些是字符串等等,词法分析是编译的第一阶段,通过生成token来为接下来的语法分析做铺垫。在实际的分析过程中,词法分析其实也还包含了其他的一些如符号表相关的维护,但是由于当前只是熟悉一下词法分析的概念所以就只是实现了一个token的生成过程。获取字符if字符串else原创 2020-05-12 18:15:24 · 779 阅读 · 0 评论 -
模板引擎-模板引擎渐进进化
模板渲染在web开发的过程中,现在比较多的开发方式都是前后端分离开发的方式来进行的,这样让前后端的开发更加解耦、前后端解耦开发的效率会比较高。在一些简单的场景或者项目要求比较简单的情况下,模板渲染的方式来渲染前端页面的方式,会是一个比较简单快速的方式来实现前端的展示,特别在一些监控系统或者压测工具中,前端基本上都是通过一个简单的页面渲染,来进行数据的展示例如openfalcon的dashbora...原创 2020-04-28 17:55:59 · 177 阅读 · 0 评论 -
Redis源码分析:过期key删除与设置key的过期时间
Redis中设置key过期时间与过期key的处理流程在Redis中,可以再设置值的时候就设置该Key的过期时间,也可以通过在expire命令来设置某个key值的过期时间,并且在了解完设置过期时间之后,来查看一下Redis的过期key的处理流程。本文先来了解一下Redis的过期键的相关流程。Redis设置key的过期时间通过set设置过期时间/* SET key value [NX] [XX...原创 2020-03-02 17:16:32 · 750 阅读 · 0 评论 -
Redis源码分析:AOF策略与时间触发任务
时间周期性任务与AOF策略周期性任务在分析启动流程与服务端处理的过程的时候,描述过有关时间任务的处理过程,在Redis内部事件驱动的过程中,有通过时间来进行事件的触发与处理机制,本文会先分析一下主要的时间驱动的任务会完成大致哪些工作。在分析完了时间任务之后,再继续分析一下Redis的AOF机制,该机制就是为内存的数据提供了一种数据更安全的方式来尽可能的保证运行中的Redis的数据在服务器突然掉电...原创 2020-02-06 17:47:46 · 823 阅读 · 0 评论 -
Redis源码分析:服务器端处理过程
服务器端处理过程在前面我们大致分析了Redis的服务器端的启动流程,Redis服务端主要就是依据单线程的反应器模式来设计的,并且在处理的事件过程中主要分为时间事件和连接响应事件。本文就根据客户端发送一个请求进来,来查看服务器端是如何工作的。服务器端的工作流程本文主要描述连接响应事件,即客户端新进来的连接、响应客户端发送的数据和将处理结果发送给客户端三种形式。客户端新进来的连接在启动的概述...原创 2020-02-04 00:33:53 · 632 阅读 · 0 评论 -
Redis源码分析:基础概念介绍与启动概述
Redis源码分析基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容。仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是《Redis设计与实现》一书,浏览学习该书之后,觉得相关内容还是觉得抽象的高度比较高,故对照着代码再阅读学习一下。Redis的数据结构官网上的数据结构的介绍二进制安全的字符串,二进制安全的意思大家可以自行查阅定义,在...原创 2020-01-31 18:51:16 · 253 阅读 · 0 评论 -
Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述
nginx源码分析nginx-1.11.1参考书籍《深入理解nginx模块开发与架构解析》核心数据结构与内存池概述在Nginx中的核心数据结构就是ngx_cycle_t结构,在初始化的过程中就首先初始化了ngx_cycle_t结构,无论是master或者worker进程都初始化了该结构,本文就会分析该结构中的相关作用与成员;本文也会对Nginx的内存管理进行相关的分析,Nginx的内存管...原创 2019-04-11 16:08:00 · 427 阅读 · 0 评论 -
Nginx源码分析:惊群处理与负载均衡
nginx源码分析nginx-1.11.1参考书籍《深入理解nginx模块开发与架构解析》Nginx的惊群处理与负载均衡概述当Nginx工作在master/worker模式下时,就会涉及到多个子进程共同接受请求并处理请求,由于在早期版本的Linux内核中,当多个子进程监听同一个端口的时候,此时当新连接请求进入的时候,多个子进程会被唤醒,但是能处理的新进的连接就这有一个子进程处理,导致其他...原创 2019-04-12 11:33:01 · 405 阅读 · 0 评论 -
Nginx源码分析:启动流程
nginx源码分析nginx-1.11.1参考书籍《深入理解nginx模块开发与架构解析》nginx简介Nginx的作为服务端软件,表现的主要特点是更快、高扩展、高可靠性、低内存消耗、单机支持10万以上的并发连接和热部署等优点。Nginx是一般运行模型master-worker,启动多个worker来处理请求,一般master进程不会对用户提供服务,只用于管理真正提供服务的wroker进...原创 2019-04-09 16:44:58 · 360 阅读 · 0 评论 -
Nginx源码分析:epoll事件处理模块概述
nginx源码分析nginx-1.11.1参考书籍《深入理解nginx模块开发与架构解析》事件处理模块概述Nginx的搞笑请求的处理依赖于事件管理机制,本次默认的场景是Linux操作系统下的epoll,Nginx基于该事件管理机制实现事件管理机制,本文就主要分析一下Nginx的具体的操作流程。事件处理的流程在前文的分析中,最终worker子进程工作的时候就是通过,ngx_proces...原创 2019-04-15 15:23:20 · 387 阅读 · 0 评论 -
redis源码分析(beta版本)-redis实现的概述逻辑
redis概述redis作为一个高性能的kv数据库,基于c语言实现,数据主要基于内存存放,所以查询效率较高,并且支持较多的数据类型有字符串、字典、列表与集合等数据结构。另外redis叶支持持久化的日志,支持集群等特性,这些内容并不在本文的概述中,本文只是概述早期版本的redis的基本实现思路。redis的架构概述早期版本的redis,该版本的协议还是telnet协议,支持的数据类型只有str...原创 2019-06-21 17:44:36 · 333 阅读 · 0 评论 -
PLY库-实现最简单的sql语法的数据库
本文通过PLY实现一个简单的sql库本文主要简述一下,有关语法解析的库的使用,并使用改实例编写一个简单的模仿最基本的sql语句的数据库,本文代码仅供示例参考。语法解析与上下文语法解析是一个比较大的内容,早起比较成熟的有lex与yacc,该工具相对比较成熟,详细的资料大家可以自行查阅资料,在编译中使用较多的是上下文无关文法主要的是BNF,大家有兴趣可查阅sql语句的BNF文档,标准的sql的文...原创 2019-07-18 16:40:41 · 1039 阅读 · 0 评论 -
sqlite-1.0.0源码执行的基本流程概述
sqlite-1.0.0原理概述sqlite是一款嵌入式的轻量级的数据库,首个版本诞生于2000年,该数据库遵守ACID的关系数据库管理系统,SQLite不是一个cs架构的数据库引擎,而是被集成在用户程序中,SQLite实现了大部分的SQL标准。本文主要概述sqlite-1.0.0版本的启动的简单流程。sqlite-1.0.0的源码sqlite源码目录主要包括了源码目录src,vdbe....原创 2019-07-22 17:20:48 · 1490 阅读 · 6 评论 -
lemon的简单使用
lemon概述lemon是LALR(1)的用于c或c++的解析器与生成器,与大名鼎鼎的bison与yacc做类似的工作,但又不是简单复制它们的功能,lemon使用了设计了不同的语法格式来减少编码的错误,lemon还使用了比yacc和bison更快的更复杂的解析引擎,它既可重入又线程安全。lemon的简述官方文档可知,首先要编译lemon.c文件,并且需要配置同级目录下lempar.c文件,此...原创 2019-07-23 11:40:32 · 2548 阅读 · 0 评论 -
Nginx源码分析:master/worker工作流程概述
nginx源码分析nginx-1.11.1参考书籍《深入理解nginx模块开发与架构解析》Nginx的master与worker工作模式在生成环境中的Nginx启动模式基本都是以master/worker为主进行启动运行,通过master/worker的工作方式可以利用多核系统的并发处理能力,master主要就是负责与worker进程进行通信,控制并负载每个worker进程的连接处理以达...原创 2019-04-10 12:15:19 · 495 阅读 · 0 评论