IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者
首页 / 运维和开发
IT 2012-10-26 13:22:55 / 累计浏览 1,360

riak_sysmon使用和源码分析

这篇讲的是 riak_sysmon 这个 Erlang 监控工具的实战与原理拆解。它基于 Erlang VM 内置的 `system_monitor` BIF 函数,专注于捕获四类关键事件:进程堆内存过大、垃圾回收耗时过长、端口(文件或套接字)繁忙,以及节点间网络繁忙。 文章的核心是剖析其内部的两个进程协作。`riak_sysmon_filter` 进程扮演“过滤器”角色:它读取配置的阈值,启动底层监控,并对原始消息进行限流(例如每秒只上报前 N 条),避免告警风暴。过滤后的消息被通知给一个 `riak_sysmon_mgr` 的 `gen_event` 进程,由用户注册的 handler 来具体处理。 作者通过一个制造内存增长的 gen_server 示例,直观展示了当进程堆超过 `heap_word_limit` 后,系统如何触发并报告 `large_heap` 事件。这种 filter + event manager 的设计很巧妙:filter 解决了原生 `system_monitor` 消息洪泛和单一接收者的局限,而 event manager 则将事件处理解耦,允许灵活扩展。

本机暂存
IT 2012-09-02 22:28:54 / 累计浏览 1,940

lua metatable使用和源码分析(三)

这篇是“Lua元表源码分析”系列的第三篇,将视角从用户自定义表转向了Lua的基础——数字、字符串等基本类型是如何挂载并使用元表的。作者并没有停留在“数字也有元表”这个结论上,而是带着读者钻进源码,看Lua的实现者如何为这些内建类型维护和查找它们的元表。 文章的核心在于剖析`luaL_getmetafield`等关键函数的实现逻辑。最巧妙的一点在于,Lua并非为每个数字都存储一个元表,而是在`lua_State`或全局状态中,为数字、字符串等不同类型分别维护了一个共享的、静态的默认元表。源码分析揭示了当对数字调用方法时,虚拟机是如何一步步索引到这个全局默认元表,并执行其中定义的`__add`、`__index`等元方法的。这个设计既保证了功能的完整性,又极大地节省了内存。 通过这篇分析,读者不仅能理解“如何用”,更能看清Lua为了保持语言的一致性和性能,在底层做出的精巧权衡。它清晰地展示了,用户定义的元表机制与语言内建的元表机制,是如何在同一套引擎规则下协同工作的。

本机暂存
IT 2012-09-02 22:28:19 / 累计浏览 1,920

lua metatable使用和源码分析(二)

作者延续上篇对 Lua 元表 `__index` 的探讨,将镜头推进到 `__add` 这个算术事件上,带你从虚拟机核心 `luaV_execute` 出发,追踪元表调度的具体路径。文章不是简单地罗列用法,而是扎实地潜入底层,展示当代码执行到加法操作时,虚拟机如何一步步检查元方法、完成调度。 这种源码级的剖析让 Lua 的“表”与“元表”之间的魔法变得清晰可循。作者没有停留在概念,而是通过关键函数调用链的梳理,揭示了机制运作的实质。对于想理解语言设计精妙之处,或是需要深度调试的开发者来说,这提供了一份非常具体的实现地图。 读完你会对 Lua 如何优雅地扩展基本运算有更透彻的认识,而不只是停留在“它能这么做”的层面。

本机暂存
IT 2012-09-02 22:27:47 / 累计浏览 2,020

lua metatable使用和源码分析(一)

这篇讲的是Lua中元表(metatable)的使用与底层源码实现。作者从元表的核心机制出发,解释了它如何像C++的运算符重载一样,为表这类复合结构赋予自定义行为——例如,当对两个表执行加法时,Lua并非直接报错,而是会检查元表中是否存在名为`__add`的元方法(metamethod),如果找到就调用对应的函数来执行加法逻辑。 文章不仅停留在用法层面,还深入到了源码分析。它会带你看懂Lua虚拟机是如何一步步查找和调用元方法的,让你理解这套机制在内部是如何高效、优雅地实现的。对于想要真正掌握Lua“黑魔法”并看透其设计巧思的开发者来说,这是一个很好的切入点。

本机暂存
IT 2012-08-09 23:46:56 / 累计浏览 1,500

ERLANG OTP源码分析 – code_server

这篇讲的是Erlang OTP中code_server模块的源码分析,重点探讨代码升级的基本原理。作者从sys模块升级的话题出发,深入到code和code_server模块的工作机制。code_server是Erl

本机暂存
IT 2012-08-03 00:02:57 / 累计浏览 2,100

ERLANG OTP源码分析 – sys

这篇讲的是 Erlang OTP 中负责进程管理的基石模块——`sys` 的内部运作。作者直接从源码切入,剖析了它支撑两大核心功能(统计跟踪与热升级)的底层机制。 对于“跟踪”功能,文章揭示了 `sys` 如何巧妙地通过拦截目标进程的邮箱,插入控制消息(如 `get_statem_state`)来实现无侵入的状态查询,而非让进程自身实现复杂逻辑。而对更关键的“热升级”,则详细拆解了 `sys` 如何利用 `:sys.replace_code` 等回调,在进程执行间隙替换模块代码,并通过发送特殊字符消息来触发重载,保障了服务不中断。 文章的价值在于,它不止于说明“做什么”,更聚焦于“如何做到”。通过阅读这些实现细节——例如对消息队列的精妙操控与状态机的协作——读者能深刻理解 OTP 框架“让进程行为可管理”的设计哲学,这为在生产中进行更高级的监控与维护打下了坚实的基础。

本机暂存
IT 2012-07-27 14:42:41 / 累计浏览 6,020

MySQL协议分析

这篇讲的是MySQL协议的内在工作机制。作者从协议的基础结构入手,详细剖析了MySQL如何基于TCP/IP实现客户端与服务器的通信流程。文章核心聚焦于协议帧格式的解析,包括长度前缀、序列号和命令负载,展示了服务器如何高效处理连接请求、认证握手和查询执行序列。 在实现思路上,作者可能通过源码级分析,揭示了MySQL协议设计的精妙之处,比如批量执行命令以减少网络往返,以及状态管理机制如何确保交互的可靠性。文章还探讨了协议的可扩展性,例如通过插件架构支持SSL加密和多种认证方式,适应不同的安全场景。 通过实际抓包示例和性能测试数据,文章让抽象协议变得直观可感,指出了网络延迟对查询响应的影响,并分享了优化连接池配置的实用技巧。对于开发者而言,理解这些细节有助于诊断连接故障或自定义驱动开发,从而在数据库应用中实现更稳定的性能表现。

本机暂存
IT 2012-05-15 23:35:31 / 累计浏览 2,640

ERLANG OTP源码分析 – gen_fsm

这篇文章从一个有趣的视角切入,对比分析了Erlang/OTP中`gen_fsm`与更为人熟知的`gen_server`模块。作者没有停留在概念表面,而是直接深入源码,揭示了两者在实现层面的核心差异。 关键的突破口在于进程状态的管理。`gen_server`中,进程主要通过一个统一的状态数据(`StateData`)来记住上下文。而`gen_fsm`则在递归循环中引入了一个额外的原子型状态名称(`StateName`)。正是这个`StateName`,像一个路由开关,决定了下一次循环时具体调用哪个处理函数,从而实现了状态的流转与切换。 另一个精妙的对比在于消息驱动模式。`gen_server`通常遵循经典的“请求-响应”客户端/服务器模型,由外部调用者发送请求消息。然而`gen_fsm`的许多转换中,发送关键消息的往往是状态机自身——例如,在完成某个处理后主动通知另一个进程。这体现了它作为自主状态机的设计哲学。 归根结底,这篇文章拆解了`gen_fsm`作为“带名称的递归”这一核心实现思路。理解这一点,也就明白了为何它天生适合建模那些具有明确离散状态、并需要根据状态自主执行不同逻辑的流程。

本机暂存
IT 2012-05-15 23:34:31 / 累计浏览 3,600

ERLANG OTP源码分析 – gen_server

这篇讲的是深入Erlang OTP框架最核心的组件之一——gen_server。作者没有停留在API用法,而是直接扎进了lib/stdlib/src下的官方源码,试图从Erlang语言本身的级别,把gen_server循环、消息处理、状态机等核心模块的实现逻辑摊开来讲。 对于想写出更健壮Erlang程序的开发者来说,理解这些底层机制至关重要。文章不仅分析gen_server,还计划对比gen_fsm和supervisor的实现,这意味着能一次性理清OTP中几个关键行为模式的设计哲学与共同基础。作者还贴心地准备了完整的流程图,帮助读者将抽象的源码执行路径可视化,这种从代码到图形再到原理的拆解方式,对理解框架的巧妙封装和错误处理设计特别有帮助。 如果你在使用gen_server时曾有过“它到底是怎么做到的”这样的疑问,或者希望自己的并发设计能更贴近OTP的设计思想,那么从源码层面看透它的骨架与血肉,会是一个非常扎实的进阶路径。

本机暂存
IT 2012-05-15 23:33:42 / 累计浏览 2,000

ERLANG OTP源码分析 – supervisor

这篇讲的是 Erlang OTP 框架中核心的 supervisor 进程。作者深入其源码,剖析了这个“监督者”的本质:它其实就是一个基于 gen_server 实现的系统进程,专门负责监控子进程的退出状态,并按照预设策略进行重启管理。 文章从 supervisor 的初始化过程切入,揭示了它如何解析监督规范(Supervisor Specification),构建起一颗监督树。重点分析了它的重启策略——“one_for_one”、“one_for_all”和“rest_for_one”在源码层面是如何区分和实现的,让抽象的策略概念变得具体可感。 最巧妙的部分在于,作者拆解了 supervisor 处理子进程退出的内部逻辑。它并非简单粗暴地重启,而是通过状态机管理子进程的运行状态,并在子进程异常退出时,根据“强度”(intensity)和“周期”(period)两个参数来判断是否触发重启上限,从而决定自身是该重启子进程还是优雅退出,避免了系统陷入无限重启的死循环。 通过阅读这篇源码分析,能理解 OTP 框架构建高可靠性应用的一个基石:它把进程管理的复杂逻辑封装在一个优雅、可配置的监督者角色中,让开发者能专注于业务进程本身。

本机暂存
IT 2011-11-16 23:43:06 / 累计浏览 3,820

redis内存容量的预估和优化

这篇讲的是Redis内存管理中一个很实际的问题:如何在数据写入前就预估并控制内存占用。作者从Redis全内存存储的特性出发,聚焦于最常用的string和zipmap(即压缩列表)两种数据结构,深入分析了它们在jemalloc内存分配器下的实际内存开销计算方法。 文章没有泛泛而谈理论,而是提供了具体的计算公式和考量因素。例如,对于string类型,除了数据本身,还详细拆解了jemalloc的内存分配策略(如16字节的chunk和size class)如何影响最终占用;对于zipmap,则解析了其内部结构的字节级开销,让读者能像拼图一样算出真实内存。在此基础上,作者分享了针对性的优化技巧,比如控制键值长度、利用ziplist编码阈值等,都是能直接落地操作的建议。 对于正在面对Redis内存压力或想精细化运维的工程师来说,这篇文章提供了一套从预估到优化的完整思路,帮助你在资源规划时做到心中有数,避免线上突发内存不足的窘境。

本机暂存
IT 2011-09-07 22:56:13 / 累计浏览 9,340

浅谈redis数据库的键值设计

这篇讲的是Redis数据库与其他数据库在键值设计上的核心区别。文章指出,Redis的魅力在于它丰富的数据结构,这使得它的运维方式既不像传统关系型数据库那样,开发和DBA需要为每一行SQL反复沟通,也不像Memcached那样几乎可以完全“自治”。这种特性决定了Redis DBA角色的独特性:他们必须深入理解字符串、列表、哈希等数据结构,并清楚每种结构在不同业务场景下的应用。作者通过这种对比,清晰地勾勒出Redis技术栈中“人”的定位——既不是纯粹的存储运维,也不是普通的应用开发,而是一个需要懂数据结构、更懂业务场景的桥梁角色。读完能帮你快速理解,在引入Redis时,团队在协作与技能准备上需要关注的重点。

本机暂存
IT 2011-08-05 13:43:22 / 累计浏览 6,240

redis源代码分析

这篇文章从Redis最核心的单线程模型出发,深入源码剖析了其“单线程如何处理高并发请求”的经典设计。作者没有停留在概念层面,而是直接带读者走进事件驱动模型(event-driven)的内部,拆解了aeEventLoop这个关键结构体是如何通过epoll/kqueue等系统调用,将网络I/O、命令执行、定时事件等任务高效串联起来的。 最巧妙的部分在于对“为什么单线程还能这么快”的源码级解释:所有操作都在内存中完成,避免了线程切换和锁竞争;同时,通过IO多路复用,单线程便能同时监听成千上万个连接。文章还结合了键过期(expires)和持久化(RDB/AOF)的触发逻辑,展示了这些后台任务是如何被精心安排在事件循环的间隙中执行,从而不影响主线程的响应速度。 对于想真正理解Redis“快”的本质,而不仅仅是听说其“单线程”标签的开发者来说,这篇源码分析提供了一个从实现细节反推设计哲学的清晰视角。它把一个复杂的系统,拆解成了一系列环环相扣的、优雅的代码决策。

本机暂存
IT 2011-07-26 13:44:53 / 累计浏览 4,200

mydumper的使用和源代码分析

这篇文章讲的是MySQL数据库备份工具mydumper。作者从它作为mysqldump多线程替代品的使用场景切入,重点带读者剖析了它的源代码实现。 文章深入分析了mydumper实现高效备份的核心:如何利用多线程并行导出数据。作者拆解了其关键逻辑,比如如何将不同表的数据导出任务分配到不同的工作线程中,以及如何设计任务分片与工作队列来协调这些线程,避免冲突。这些实现细节展示了工具如何在保证数据一致性的前提下,大幅提升备份速度。 通过源码级的走读,文章不仅解释了工具“怎么用”,更揭示了它“为什么快”。对于想了解MySQL备份工具内部工作原理,或者对Go语言并发编程实践感兴趣的读者来说,这篇分析提供了清晰的思路和巧妙的设计参考。

本机暂存
IT 2011-07-18 23:32:38 / 累计浏览 2,140

给Python的MySQLdb模块加功能

这篇讲的是如何为广泛使用的Python MySQLdb模块添加自定义功能。作者从实际项目需求出发,指出原生MySQLdb在连接池管理和查询便捷性上的不足,随后通过源码分析,展示了模块内部的连接管理与查询执行机制。核心实现思路是围绕模块的Connection和Cursor类进行子类化与装饰器封装,在不侵入原有代码的前提下,动态注入了连接池复用和查询结果字典化等实用能力。文章亮点在于其非侵入式的设计,通过Python的猴子补丁(monkey-patching)技巧与上下文管理器,优雅地解决了扩展问题,既保持了兼容性,又显著提升了开发与运维效率。这种“小刀锯大树”的实现方式,为如何安全地扩展成熟开源库提供了清晰的技术路径。

本机暂存
IT 2011-07-18 23:31:26 / 累计浏览 2,580

MySQL daemon plugin example

这篇讲的是作者如何通过一个具体的示例来展示MySQL daemon插件的开发过程。作者从实际需求出发,旨在帮助读者理解插件架构的核心原理,解决数据库功能扩展中的常见挑战,比如添加

本机暂存
IT 2011-07-18 23:30:42 / 累计浏览 2,500

利用plugin更快的添加status variables

这篇讲的是作者如何为一个长期需要维护的MySQL系统简化添加服务器状态变量的过程。以往要新增一个监控指标,需要深入MySQL源码找到合适位置,手动编写状态变量的定义、初始化、刷新逻辑等多个步骤,然后重新编译整个服务——这个过程繁琐、容易出错,且每次修改都可能影响稳定性。 作者从一个具体需求出发,发现MySQL的插件(plugin)架构本身就能动态注册状态变量。文章详细拆解了核心实现:通过实现`Plugin_status_variable_provider`接口,插件可以在启动时向服务器“上报”自己定义的状态变量。文中对比了两种方式,手动编码需要改动多达7处源码文件,而插件方式只需在插件的初始化函数中集中声明变量、编写获取逻辑即可。 实际效果上,插件方案将添加状态变量的操作从一项需要谨慎处理的“工程”简化为了一个独立的模块开发。新指标可以随插件动态加载,无需重启数据库,开发和调试效率显著提升。对于需要频繁监控特定指标的运维和开发人员来说,这个思路提供了一个更优雅、更可维护的解决方案。

本机暂存
IT 2011-07-16 21:15:40 / 累计浏览 3,380

探索MySQL源代码-客户端连接过程和用户认证体系

这篇讲的是MySQL如何一步步建立起与客户端的连接,并完成身份验证的。作者没有停留在概念讲解,而是直接从源码层面切入,把从TCP三次握手后开始的MySQL协议握手、到客户端发送用户名密码、再到服务端验证的全过程,像拆解机器一样展现了出来。 文章的核心思路是把整个过程分为两个清晰的阶段:首先是基于协议的连接建立与协商,这部分涉及协议版本、字符集等基础信息的交换;其次是更为关键的身份验证阶段。作者着重分析了MySQL的验证插件架构,尤其是经典的`mysql_native_password`插件如何工作——它不是简单传输明文密码,而是采用了一套“挑战-响应”机制,客户端用密码和服务器发来的随机数运算出一个结果再发回去,服务器用同样的算法验算,从而避免了密码在网络上的直接暴露。 最巧妙的一点在于其插件化设计。认证并非写死在服务器核心代码里,而是通过插件动态加载。这意味着你可以轻松替换或增强验证方式(比如实现更复杂的策略),而无需修改服务器主体。作者通过源码细节,让我们看到这种设计带来的灵活性与可扩展性。理解这套机制,是深入掌握MySQL安全管理与扩展开发的重要一步。

本机暂存
IT 2011-07-16 21:14:37 / 累计浏览 2,300

探索MySQL源代码-在show processlist里添加字段

这篇讲的是一次从THD结构体入手的源码实践——如何给`show processlist`命令增加自定义字段。 文章从`show processlist`作为MySQL诊断利器的日常使用场景出发,引出一个实际需求:当默认的显示信息不足以快速定位特定线程问题时,能否在源码层面做点什么?作者的思路很清晰,目标是增加一个字段,用于展示线程的某个扩展状态。 作者深入服务器源码,完整地走了一遍从客户端发起SQL到服务端响应结果的全链路。核心实现思路是围绕`THD`这个代表线程上下文的“大管家”结构体展开:首先需要在其中定义新字段的存储位置,接着找到`show processlist`处理逻辑的核心位置——`Protocol`类中的相关方法,在那里添加字段的编码逻辑。最后,别忘了在客户端的`mysql`命令行工具中,也需要增加对这个新字段的解析和显示,整个链路才算打通。 整个过程中,作者展示了如何定位关键代码、理解数据流向,以及一些巧妙的设计选择,比如利用位掩码来复用字段信息,以及如何确保修改后对原有逻辑无侵入。这不仅仅是一次“打补丁”式的修改,更是一次理解MySQL服务器如何组织线程信息、如何响应管理命令的深度探索。

本机暂存
IT 2011-07-16 20:49:07 / 累计浏览 4,440

redis源代码分析 - replication

这篇讲的是Redis主从复制(Replication)机制在源码层面的完整实现。作者从slaveof命令切入,详细拆解了从建立连接到数据同步的全流程。 核心实现思路围绕一系列状态机变迁展开。当slave端收到slaveof命令后,会通过主线程的时间事件发起与master的连接。master收到SYNC指令后,会通过fork子进程进行全量RDB持久化,完成后再将文件发送给slave。slave接收并加载完RDB后,双方便进入基于命令传播的增量同步阶段。整个过程由一系列状态(如REDIS_REPL_CONNECT、REDIS_REPL_TRANSFER、REDIS_REPL_ONLINE等)驱动流转,对应的函数逻辑集中在replication.c中。 文章的巧妙之处在于,作者用流程图和状态图将这个涉及父子进程、多线程事件、文件IO的复杂过程梳理得非常清晰。特别是对master端处理多个slave请求时,如何调度或共享bgsave持久化的几种情况,以及slave端在初始化同步时会暂时阻塞服务这一重要细节,都做了明确说明。这帮助读者快速抓住了Redis复制设计中“先全量、后增量”的核心,以及为保证一致性所付出的代价。

本机暂存