- 博客(311)
- 问答 (1)
- 收藏
- 关注
原创 TCP笔记详解
文章目录一:为什么要传输层二:寻址三:运输层的两个协议1.UDP协议(1).UDP协议的特点(2) UDP的首部格式(8字节)2.TCP协议(1)TCP的特点(2)套接字(3)TCP报文段的首部格式(4)TCP的建立连接(5)TCP连接的释放(6)TCP的可靠传输(7)TCP的流量控制(8) TCP的拥塞控制一:为什么要传输层既然IP协议能够把源主机发送出的分组按照首部中的目的地址交送到目的主...
2020-03-14 22:38:39
769
原创 四:MVCC 深度解析:三事务并发全流程
读不阻塞写,写不阻塞读:SELECT 不需要任何锁,直接读取对应版本,写操作不影响正在进行中的 SELECT。这是高并发 OLTP 场景的基础。COMMIT/ROLLBACK 极快:无论修改多少行,COMMIT 只写 CLOG 的几个 bit;ROLLBACK 同样只写 CLOG,数据页面不变。崩溃恢复简单:通过 WAL 重放就能恢复一致性,不需要回滚未提交事务的数据页(因为数据页中未提交事务的修改可以通过 CLOG 识别后忽略)。
2026-03-18 14:30:54
600
原创 三:页结构与剪枝
快照(Snapshot)是 PostgreSQL 在某一时刻对"哪些事务已提交"的一张快照记录,它定义了当前查询"能看到什么数据"。快照不是数据的物理副本,而是由几个数字组成的轻量结构。Read Committed 隔离级别:每条 SQL 语句执行前重新获取快照Repeatable Read / Serializable 隔离级别:事务内第一条语句获取快照,整个事务共用页剪枝是 PostgreSQL 的一种轻量级、单页范围内的清理机制。
2026-03-18 11:19:07
570
原创 二:行记录结构深度解析
PostgreSQL 行记录的设计哲学是将 MVCC 完全内嵌在每一行,以 Append-Only 的方式写入数据,用 xmin/xmax/ctid 在行头部维护完整的版本信息。特性原因COMMIT 极快只写 CLOG 的 2 bitROLLBACK 极快只写 CLOG,不回滚数据页读不阻塞写读操作找旧版本,写操作写新版本,互不干扰需要 VACUUMAppend-Only 导致旧版本堆积,必须定期清理所有索引地位平等索引与堆表完全分离,叶子都指向 TIDUUID 主键无负担。
2026-03-18 10:25:54
574
原创 高可用:Keepalived 配置文件详解
定义"如何检测 MySQL 是否健康"以及"检测结果如何影响本节点的选举优先级"。# 要执行的脚本路径# 脚本返回 0 = 正常,返回非 0 = 故障# 每隔 2 秒执行一次检测interval 2# 单次脚本执行超时时间(秒)# 超时视为失败,建议设为 interval 的 2 倍以上timeout 5# 连续失败 2 次,才触发 weight 扣分(防止偶发抖动误切换)fall 2# 连续成功 1 次,即恢复正常状态rise 1# 检测失败时,将本节点优先级降低 30 分。
2026-03-16 17:40:53
327
原创 高可用:mysql主备keepAlived+vip
实现简单:纯开源组件,配置成本低,运维人员容易上手切换快:正常情况下 5~10 秒完成故障切换,业务影响时间短无需改造应用:应用只需更改数据库连接地址为 VIP,无其他改动成本低:不需要额外的商业软件或云服务。
2026-03-16 16:42:14
287
原创 十三:InnoDB 锁机制
死锁是指两个或多个事务互相持有对方需要的锁,陷入永久等待的状态。经典死锁场景:事务 A 事务 BBEGIN;BEGIN;WHERE id=1;-- 持有 id=1 的 X 锁WHERE id=3;-- 持有 id=3 的 X 锁WHERE id=3;-- 申请 id=3 的 X 锁,等待 B...WHERE id=1;-- 申请 id=1 的 X 锁,等待 A...-- 死锁!A 等 B,B 等 A,永远无法推进业务场景推荐方式理由普通读取快照读(普通 SELECT)
2026-03-16 14:13:24
305
原创 十二:InnoDB MVCC(多版本并发控制)
通过隐藏列(trx_id + roll_pointer)将同一行数据的历史修改串成版本链,读操作在执行时生成 ReadView,根据活跃事务列表判断版本链上哪个版本对自己可见,从而实现无锁的并发读。隐藏列:每行数据携带"最后修改者"(trx_id)和"指向历史版本的指针"(roll_pointer),是版本链的基础设施。版本链(Undo Log 构成):保存数据的所有历史版本,是 MVCC 的"时间机器",让读操作可以回溯到任意历史时刻。ReadView。
2026-03-16 11:11:00
466
原创 十一:InnoDB Undo Log(回滚日志)
事务执行顺序:操作1(UPDATE amount) → 生成 Undo Log #0操作2(UPDATE status) → 生成 Undo Log #1操作3(INSERT id=3) → 生成 Undo Log #2操作4(DELETE id=2) → 生成 Undo Log #3ROLLBACK 时,逆序撤销:undo_no=3 → 撤销 DELETE:清除 id=2 的删除标记↓undo_no=2 → 撤销 INSERT:物理删除 id=3↓。
2026-03-16 10:24:37
367
原创 十:InnoDB Redo Log-一条事务完整生命周期例子
学习 MySQL 时,我们经常听到这些概念:Buffer Pool、Redo Log、Undo Log、脏页、Checkpoint、LSN……它们单独看都能讲清楚,但放在一起就容易混乱:它们到底在什么时候工作?谁先谁后?崩溃了数据为什么不丢?执行一条,假设 id=1 这条记录原来的 amount 是 200。从 BEGIN 到 COMMIT,从内存到磁盘,从正常流程到崩溃恢复,我们一步一步拆解,把每个细节都讲清楚。思路一:用顺序写代替随机写脏页刷盘是随机 I/O,速度慢;
2026-03-16 10:12:23
785
原创 九:InnoDB Redo Log(重做日志)
在 Redo Log 写入磁盘之前,InnoDB 会先将其写入内存中的Redo Log Buffer(重做日志缓冲区)。Redo Log Buffer 是一段连续的内存空间,内部由若干 512 字节的 Block 构成,通过-- 默认:16777216(16MB)参数默认值调优建议1生产环境保持1;对数据安全要求低的场景可设216MB有大事务或高并发写入时,适当增大至 64MB ~ 256MB48MB生产环境建议 512MB ~ 4GB,依据写入速率评估2。
2026-03-16 09:51:51
462
原创 八:InnoDB Buffer Pool
磁盘页 ──加载──→ Buffer Pool(缓存页)│↓ ↓ ↓Free链表 LRU链表 Flush链表(空闲页) (冷热分区) (脏页管理)│(热数据│冷数据)Free 链表管理可用缓存页。哈希表实现 O(1) 定位缓存页。LRU 链表通过 young/old 分区解决缓存污染问题。Flush 链表管理脏页,实现异步刷盘。多实例 + Chunk提升并发能力并支持动态扩容。掌握这些底层机制,才能在生产环境中做出正确的参数调优决策,让 MySQL 发挥出最佳性能。
2026-03-16 09:24:19
596
原创 七:EXPLAIN 深度解析与 SQL 优化实战指南
EXPLAIN是 MySQL 提供的查询执行计划分析工具,它能告诉你 MySQL打算怎么执行这条 SQL,而不是实际去执行它。是否走了索引,走了哪个索引扫描了多少行数据是否产生了临时表、文件排序JOIN 的驱动表顺序是否合理-- 基本用法-- MySQL 8.0 支持 EXPLAIN ANALYZE(真实执行并返回实际耗时)-- 格式化输出(树形结构,更直观)
2026-03-13 16:41:55
439
原创 六:InnoDB 表空间深度解析
InnoDB 存储体系│├── 物理存储层│ ├── 页(16KB) ← 最小 IO 单位,B+Tree 的节点│ ├── 区(1MB) ← 64个连续页,磁盘分配的基本粒度│ └── 段(逻辑) ← 每索引2个段:叶子节点段 + 非叶子节点段│├── 表空间类型│ ├── ibdata1 ← 系统表空间,只增不减│ ├── *.ibd ← 独立表空间(强烈推荐开启)│ ├── undo_00N ← Undo 表空间(8.0 独立,支持收缩)
2026-03-13 10:41:55
398
原创 五:数据目录深度解析,每个文件都在做什么
MySQL 5.7 为每一张表创建一个.frm文件,存储表的结构定义,包括:列名、数据类型、约束(NOT NULL、DEFAULT等)、索引定义等。your_db/├── users.frm ← users 表的结构├── orders.frm ← orders 表的结构└── products.frm ← products 表的结构无论表使用 InnoDB 还是 MyISAM 引擎,都有.frm文件。它由 MySQL Server 层管理,与具体存储引擎无关。.frm。
2026-03-13 09:36:57
379
原创 五:MySQL 索引使用优化指南:何时建、怎么建、怎么用
场景示例是否能用索引全值匹配✅匹配最左前缀WHERE a=1或✅范围查询✅前列精确+后列范围✅ORDER BY(方向一致)✅GROUP BY(列顺序一致)✅跳过最左列WHERE b=2(跳过 a)❌索引列参与函数运算❌排序方向不一致❌。
2026-03-12 11:15:49
493
原创 四:InnoDB 聚簇索引与二级索引深度解析:从页到 B+ 树
聚簇索引(Clustered Index)数据行本身和索引存储在一起,数据就按照主键的顺序物理排列在磁盘上。每张表有且仅有一个聚簇索引默认以**主键(PRIMARY KEY)**作为聚簇索引如果没有主键,InnoDB 会选一个唯一非空列代替,再不行就隐式创建一个rowid列与之对应的非聚簇索引(也叫二级索引/辅助索引),索引和数据是分开存的,索引里只存"去哪里找完整数据"的指针。当查询的列在二级索引中找不全时,InnoDB 需要拿着从二级索引中获取的主键值,回到聚簇索引。
2026-03-12 11:01:31
399
原创 三:理解Innodb数据页结构
InnoDB 以**页(Page)**为单位与磁盘交互,默认大小为16KB。即使只查一行数据,InnoDB 也会把整个 16KB 的页加载进 Buffer Pool即使只修改一个字段,刷盘时也是以整页为单位写入磁盘内存和磁盘之间的 I/O 粒度,始终是页,而不是行-- 查看当前页大小(单位:字节)-- 默认输出:16384(即 16KB)页类型十六进制值说明数据页(索引页)0x45BF存储 B+ 树叶子节点和非叶子节点的行数据Undo 日志页0x0002。
2026-03-06 11:11:53
420
原创 二:mysql行格式
用户定义的列按照建表时的列定义顺序① NULL 值不占用空间NULL 值只在"NULL 值列表"中用 1 个 bit 标记,在真实数据区域不占用任何字节。这正是 NULL 与空字符串''-- '' 是一个长度为 0 的字符串,在真实数据区占 0 字节,但变长字段长度列表中有记录 -- NULL 在真实数据区不占字节,只在 NULL 值列表中占 1 bit② 定长列与变长列的存储定长列INTBIGINTCHAR使用定长字符集时等):直接按固定字节数存储,无需额外记录长度变长列VARCHARTEXT。
2026-03-06 10:28:04
440
原创 一:mysql字符集与比较规则(为什么你的连接总是乱码)
写入路径:客户端(OS编码) → [character_set_client] → [character_set_connection]→ [列字符集] → 存储读取路径:存储 → [列字符集] → [character_set_results] → 客户端(OS编码)统一用utf8mb4:字符集层面,服务器、数据库、表、列全部统一为utf8mb4,一劳永逸连接要设置SET NAMES:确保与应用程序一致比较规则要想清楚:根据业务需求选择是否区分大小写(_civs_bin。
2026-03-06 09:48:55
378
原创 一:基本概念和快速了解
PostgreSQL 的历史可以追溯到 1986 年,起源于加州大学伯克利分校(UC Berkeley)由 Michael Stonebraker 教授主导的 POSTGRES 项目。该项目的目标是研究下一代关系型数据库管理系统,探索面向对象和规则系统等新特性。发展时间线:PostgreSQL 的开发由全球志愿者社区维护,核心团队称为 PostgreSQL Global Development Group(PGDG),每年发布一个主版本,支持周期为 5 年。PostgreSQL 凭借以下核心优势,成为众多企
2026-03-04 11:20:11
401
原创 ARM机器gcc11源码编译实践
优化措施时间节省说明60-70%跳过三阶段自举50%+只编译C/C++20-30%禁用多架构支持-j2并发编译30-40%相比单线程使用SSD2-3倍相比SD卡累计效果:相比默认配置,总时间可减少70-80%。从源码编译GCC是一个耗时但有价值的过程。通过本文介绍的优化方法,即使在资源受限的ARM设备上,也能在可接受的时间内完成编译。充足的准备:磁盘空间、swap、依赖正确的配置:禁用bootstrap、限制语言合适的并发:-j2 平衡速度与稳定性使用screen:防止中断。
2026-01-30 08:48:05
934
原创 linux内核模块编译
失败:如果提示 No such file or directory 或者链接是红色的(断链),说明 linux-headers 安装失败或版本不匹配。如果显示它是指向 /usr/src/linux-headers-xxx 的软链接,且目标目录存在,说明环境没问题。不需要运行 cp /boot/config-xxx .config。不需要运行 make modules_prepare。不需要运行 make menuconfig。直接使用系统已经配置好的环境来编译模块。
2025-12-22 15:30:21
214
原创 Linux 内核开发入门:从环境配置到 Hello World 实战
对于从事高性能网络开发(如 3A 系统、网关)的工程师来说,用户态(User Space)的优化往往有极限。当我们需要极致的性能时,我们就必须踏入**内核态(Kernel Space)**的领地。Linux 内核模块(Loadable Kernel Module, LKM)是进入这一领域的敲门砖。它允许我们在不重新编译整个操作系统内核的情况下,动态地向内核添加功能。本文将带你从零开始编写一个“Hello World”内核模块,并着重解决老旧内核版本无法下载开发依赖这一常见痛点。环境。
2025-12-18 17:06:34
900
原创 Linux 网络发包的极致之路:从普通模式到 AF_XDP ZeroCopy
特性普通模式 (send)核心路径完整协议栈协议栈 (部分绕过)驱动直通驱动直通sk_buff 分配✅有(重)✅有(重)❌无❌无CPU 数据拷贝✅1次(用户->内核)❌0次(映射)✅1次(UMEM->驱动)❌0次(纯DMA)协议栈/流控全套 (L2-L4 + Qdisc)部分 (Qdisc)无无典型性能 (单核)< 1M pps10M+ pps适用场景业务应用 (Nginx/Redis)传统发包器 (TrafficGen)通用高性能网关极限发包测试、防火墙。
2025-11-28 13:05:47
423
原创 Linux 网络收包的进阶之路:从普通 socket 到 AF_XDP 零拷贝
特性普通模式 (recv)核心路径完整协议栈协议栈入口截胡驱动层截胡 (Pre-skb)DMA 直达用户内存sk_buff 分配✅有(重)✅有(重)❌无(轻量 xdp_buff)❌无CPU 数据拷贝✅2次(内核+用户)✅1次(内核内)✅1次(驱动->UMEM)❌0次(纯DMA)协议栈开销全套 (L2/L3/L4)部分 (L2)无无典型性能 (单核)< 1M pps硬件要求无无支持 XDP 的驱动支持 ZC 的网卡。
2025-11-28 12:59:52
463
原创 linux启动揭秘
在旧版本 Linux 中,硬件信息写死在 C 代码里。Linus Torvalds 曾发火称其为“垃圾代码”。于是引入了设备树。定义:它是一份硬件清单(文本文件.dts-> 编译为.dtb内容:它不包含逻辑,只描述**“有什么”和“在哪里”**。例如:有一个 LED,接在 GPIO 5,地址是 0x1000。例如:有一个 网卡,中断号是 28。定义:它是软件逻辑(C代码)。内容:它描述**“怎么用”**。例如:如何操作寄存器让灯亮,如何处理网卡的数据包。接口。
2025-11-28 02:10:16
1010
原创 MetricsQL快速上手
MetricsQL 是 VictoriaMetrics 推出的时间序列查询语言,兼容 PromQL 语义,并提供更强的函数集、更高的性能优化与便捷的表达式扩展。
2025-10-13 16:40:26
1040
原创 victoriesmetircs时序库数据查询series、labels、values、export
用于根据标签匹配器查询符合条件的全部时间序列元数据(仅标签集合),不返回具体数值数据。适用于指标探索、标签值分析和查询调试场景。
2025-10-13 16:20:09
731
原创 victoriesmetircs时序库数据查询query、query_range
基于特定时间点对 MetricsQL 表达式求值,返回离该时刻最近的单个数据点。
2025-10-11 14:14:24
770
原创 victoriesmetircs时序库数据写入
方式吞吐量CPU消耗适用场景InfluxDB 协议⭐⭐⭐⭐⭐低生产环境高频写入JSON⭐⭐⭐⭐中业务系统直连、灵活数据Prometheus⭐⭐高兼容Prometheus生态CSV⭐⭐⭐中批量导入历史数据。
2025-10-11 11:08:03
955
原创 victoriesmetircs时序库简介
一套为“指标场景”定制的高性能时序存储引擎,从数据模型、写入路径到查询执行,胜在结构清晰、成本可控与可运维性。
2025-10-11 10:45:37
849
原创 victoriesmetircs时序库快速上手与使用
Instant Query 在给定时间点对 MetricsQL 表达式求值。返回结果是匹配到的时间序列列表,每条序列仅包含一对 (timestamp, value)。是一个 HTTP API 端点,它执行一个给定的 MetricsQL 查询,并在一个固定的时间窗口内,以固定的时间间隔(称为“步长”)重复计算该查询。结果是一个时间序列数据集,每个序列由一系列(时间戳,值)数据点组成。在 Grafana 中绘制 CPU 使用率、内存消耗、请求 QPS 等指标的历史变化曲线。
2025-10-09 11:37:08
1388
原创 同步、异步、阻塞、非阻塞以及nginx、go协程举例
维度Go Goroutine 表现底层机制同步 / 异步代码级看像异步(go 关键字)runtime 并发调度实现阻塞 / 非阻塞API 看是阻塞的(易用)runtime 用非阻塞 I/O 模型调度,避免卡住线程I/O 模型对开发者透明内部使用 epoll/kqueue/IOCP3. 常见疑点Goroutine 阻塞会不会卡住整个程序?不会,只会阻塞当前 Goroutine,runtime 会自动切换到其他 Goroutine 执行。为什么 Go 的同步阻塞写法性能也很高?因为底层是。
2025-09-15 14:00:00
765
原创 Nginx 高性能 Web 服务器部署与配置实战指南
Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也可以作为邮件代理服务器。它具有占用内存少、并发能力强等特点,被广泛用于负载均衡、静态资源服务和 API 网关等场景。
2025-09-15 13:30:00
200
原创 从编程语言到机器可执行,发生了什么?
C 语言典型的静态编译型语言,预处理 → 编译 → 链接 → 执行编译和链接阶段问题(缺库、符号丢失)在运行前就会报错Java编译到字节码,运行时由 JVM 负责加载和链接在运行时也能动态加载类Python动态解释执行,编译字节码过程对用户透明链接在运行时进行,极其灵活。
2025-09-11 19:56:17
754
原创 网结构本地
组网专线(Private Network Leased Line)是运营商根据企业需求,通过物理或逻辑隔离的专用链路,将企业不同地域的网络节点(总部、分支、IDC 等)互相连接,形成一个统一的企业专用网络,不经过公网传输,安全性高、延迟低。总部与分支互联异地灾备数据同步跨区域办公、ERP/CRM 系统访问视频会议、VoIP 电话。
2025-09-03 08:58:33
1176
原创 第六章:健壮Go应用之代码组织与架构模式
社区推荐的目录结构提供了可维护、可扩展的基础骨架分层架构让代码职责清晰、可替换性强整洁架构用依赖倒置保障核心业务不受外部细节影响将internal、接口和依赖注入结合,是 Go 中落地这些架构原则的关键对于中大型项目,配合go.mod 分模块与CI/CD,可以实现工程可扩展性与团队协作的平衡。
2025-09-01 17:23:39
748
原创 第六章:健壮Go应用:工程实践与生产就绪之测试
单元测试:关注函数或方法的正确性,建议采用表格驱动写法,简洁可维护。基准测试:发现性能瓶颈,配合-benchmem了解内存分配情况。Mock 技术:隔离外部依赖,提升测试稳定性和速度。高级策略:并行测试、覆盖率分析、CI/CD 集成、性质测试等,可以进一步为项目质量保驾护航。
2025-09-01 17:19:33
813
空空如也
多线程生产者消费者bug,感觉比较困难,求帮助
2022-04-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅