- 博客(72)
- 资源 (2)
- 收藏
- 关注
原创 Elasticsearch 核心概念解析:从倒排索引到字段存储
在使用 Elasticsearch 的过程中,很多开发者会遇到一些看似矛盾的设计:为什么 text 字段不能排序?为什么明明存了数据却搜不到 null?_source和store到底什么关系?本文将通过问答式的讲解,结合具体数据示例,帮你彻底搞懂 ES 核心存储与索引机制。倒排索引是 ES 搜索快的根本原因。词项 → 文档ID 的映射表。传统方式(正排):文档 → 词文档1: "elasticsearch入门" → 包含词["elasticsearch","入门"]
2026-04-16 16:58:23
427
原创 Docker vs 虚拟机 vs Go 用户态/内核态:这三组概念
文章摘要: Docker相比虚拟机更快的关键在于架构差异:Docker共享宿主机内核,通过Namespaces和Cgroups实现轻量级隔离,而虚拟机需要完整的Guest OS和Hypervisor层。这种设计使Docker的系统调用直接进入宿主机内核,避免了虚拟机的多层转换开销。文章还揭示了用户态/内核态切换机制对性能的影响,以及Go语言的GMP调度模型如何通过用户态协程(goroutine)减少系统调用和上下文切换。三者共同构成了现代云计算的高效运行基础——Docker提供轻量隔离,内核态处理特权操作,
2026-04-14 20:48:09
341
原创 四表五链:Linux 防火墙的核心框架
本文通过快递中转站的比喻,生动解析了Linux防火墙iptables/netfilter的"四表五链"机制。五链对应数据包必经的5个检查点(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING),四表(raw、mangle、nat、filter)则规定了不同链上的具体操作规则。文章详细阐述了表和链的对应关系,并通过三个典型场景(本机访问、外部访问本机、数据包转发)展示了数据包的处理流程。最后以防火墙规则和Docker端口映射为例,说明这套机制在实际应用中
2026-04-14 20:33:30
384
原创 Linux 常用命令速查手册
本文汇总了Linux系统常用的命令速查表,涵盖系统资源查看、文本处理、磁盘管理、系统信息查询、用户权限管理、进程控制、网络操作、压缩解压以及文件查找等九大类命令。每个命令均列出基本作用、常用示例和记忆技巧,如netstat -tunlp的口诀记忆法、grep参数记忆法等。表格对比了df与du的区别,并提供了tar、awk等复杂命令的核心使用公式。该速查表可作为Linux系统管理员的日常操作参考手册,帮助快速定位所需命令及典型用法场景。
2026-04-14 20:15:48
612
原创 LVS 完全入门:从零理解 Linux 虚拟服务器的三种模式
LVS学习笔记摘要: LVS是Linux内核内置的四层负载均衡器,通过虚拟IP(VIP)将请求分发到多台真实服务器(RS)。它有三种核心模式: NAT模式:LVS作为网关修改IP地址,请求和响应都经过LVS,适用于RS无公网IP的场景,但性能最低。 DR模式(最常用):LVS仅修改MAC地址,RS直接响应客户端,性能最高,要求LVS和RS在同一局域网,需配置ARP抑制。 TUN模式:通过IP隧道实现跨机房转发,性能中等,适用于异地容灾等场景。 关键区别: NAT:三层转发,适合简单场景 DR:二层转发,性能
2026-04-14 17:25:41
400
原创 # MySQL InnoDB 隔离级别与 MVCC 完全解析
MySQL事务隔离与并发控制机制解析 本文系统讲解了MySQL事务隔离级别及其实现原理。主要内容包括: 四种隔离级别对比:从READ UNCOMMITTED到SERIALIZABLE,分析各级别如何解决脏读、不可重复读和幻读问题,其中REPEATABLE READ是MySQL默认级别。 MVCC机制详解:通过版本链(Undo Log)和Read View实现多版本并发控制,解释了RC和RR级别下Read View生成时机的差异,澄清了常见误解。 间隙锁原理:说明InnoDB如何在RR级别下通过间隙锁防止幻读
2026-04-13 14:24:34
428
原创 理解 Go 接口:eface 与 iface 的区别及动态性解析
本文深入解析了Go语言接口的底层实现原理。首先介绍了两种核心数据结构:eface用于空接口,包含类型和值指针;iface用于非空接口,额外存储方法信息。接着解释了接口"动态性"的本质是运行时可以修改其内部指向的类型和值,而非结构本身改变。文章区分了编译时和运行时的职责:编译器负责类型检查,运行时负责创建接口结构和方法调用。最后指出了接口与nil比较的常见陷阱,强调动态类型对判断的影响。理解这些底层机制有助于编写更健壮的Go代码和调试接口相关问题。
2026-04-05 07:18:41
332
原创 内存对齐算法:向上取整到位运算
这篇文章深入解析了内存对齐的核心算法(n + (align - 1)) & ~(align - 1)。通过位运算技巧,该算法高效实现了向上对齐操作,比传统除法方法快10-15倍。关键在于利用2的幂数的特性:其倍数的二进制低位全为0,因此对齐操作可转化为"先加满到下一个边界,再清零低位"的位运算过程。文章详细演示了算法原理、性能优势、实际应用场景(如内存分配、SIMD优化等),并提供了通用宏定义和记忆口诀。这种位运算技巧在底层编程中广泛应用,是提升性能的重要手段。
2026-04-03 16:36:07
391
原创 深入理解页表、TLB 和寄存器:CPU 如何找到你的数据?
本文揭示了CPU如何通过虚拟地址访问内存数据的底层机制。虚拟地址通过页表转换为物理地址,实现内存隔离和管理。页表作为地址映射字典存储在内存中,但直接访问会导致性能下降。TLB(快表)作为页表的高速缓存,能显著加速地址转换过程。CR3寄存器存储当前页表基址,是进程切换的关键。当TLB未命中时,CPU需访问内存中的页表,完成转换后将结果缓存到TLB。这种多级地址转换机制实现了内存安全隔离和高效访问的平衡。
2026-04-02 15:59:13
176
原创 Goroutine 切换:为什么比线程快 10 倍?
本文深入分析了进程、线程和Goroutine三种上下文切换的本质区别。进程切换最重量级(约1000纳秒),需要进入内核态并切换页表;线程切换(约500纳秒)虽然共享地址空间但仍需内核介入;而Goroutine切换(约50纳秒)完全在用户态完成,仅需保存少量寄存器状态,是最轻量级的实现。通过代码验证可见,Go语言可以轻松创建数十万Goroutine,但底层仅需少量OS线程支持,这种用户态调度机制大幅提升了并发性能。
2026-04-02 15:43:13
554
原创 Go Goroutine 与用户态是进程级
Go语言中,goroutine与用户态/内核态的关系存在常见误解。实际上,用户态是进程级的资源,而非每个goroutine独有。一个Go进程的所有goroutine共享同一个用户态地址空间,通过M:N调度模型(goroutine、逻辑处理器P、内核线程M)实现高效并发。这种设计使得Go能够支持百万级goroutine,而无需为每个goroutine创建独立的用户态空间。正确理解这一点对Go并发模型和性能优化至关重要。
2026-04-02 15:25:22
355
原创 深入理解 Go:用户态和内核态
本文深入探讨了操作系统用户态与内核态的核心机制及其在Go语言中的实现。从CPU权限级别(Ring 0-3)切入,解析了系统调用作为用户态进入内核态的唯一通道;详细阐述了内存层次结构,包括寄存器、缓存、内存条和堆栈的运作原理;特别分析了Go语言的独特设计——goroutine栈的动态增长机制和逃逸分析策略。文章通过代码示例展示了Go如何实现高效的内存管理和goroutine调度,其用户态协程切换比传统线程快100倍。最后提供了strace和/proc工具的实际用法,帮助开发者观察系统调用和内存布局。这些底层知
2026-04-02 15:17:36
443
原创 WebSocket 核心:借 HTTP 建联,做自己的通信
WebSocket与HTTP的关系及工作原理 WebSocket和HTTP是两种独立的应用层协议,都基于TCP传输层协议。WebSocket在握手阶段借用HTTP格式(101状态码)通过中间设备检测,随后切换为全双工通信。与HTTP不同,WebSocket支持服务器主动推送,采用二进制帧结构(含opcode区分数据类型),实现高效长连接通信。浏览器限制直接使用TCP是出于安全考虑,而WebSocket提供了受控的双向通信能力。两者各有所长:HTTP适合请求-响应场景,WebSocket则适用于实时交互需求。
2026-03-31 14:05:21
900
1
原创 TCP黏包:为什么你的消息“粘”在了一起?— Nagle算法
TCP黏包问题解析:特性而非Bug TCP黏包现象本质上是TCP流式协议的特性,而非缺陷。当客户端连续发送多条消息时,服务端可能合并接收,导致数据边界混淆。这主要由两个原因造成:发送端的Nagle算法会合并小数据包,接收端的缓冲区可能积压多条消息。 解决方案需在应用层实现消息边界识别,推荐采用"长度前缀法":发送时添加4字节包头记录数据长度,接收时先读包头再按长度读取数据。其他方案如固定长度、分隔符各有优缺点,但长度前缀法在灵活性和效率上表现最佳。 关键结论:TCP保证的是可靠字节流而非
2026-03-31 11:19:11
364
原创 从代码到网线:一个HTTP请求的网络之旅——深入理解五层协议
HTTP请求的完整传输过程涉及五层协议栈的封装与解包。应用层生成原始HTTP请求后,传输层添加TCP头(含端口和序列号),网络层加入IP头(含源/目的IP),链路层封装MAC头和校验位,最终由物理层转为电信号传输。硬件层面涉及CPU、网卡、交换机(基于MAC转发)和路由器(基于IP路由)。整个过程确保数据从应用层逐层封装,经网络设备传输后,在接收端逆向解包还原。
2026-03-31 10:53:52
637
原创 理解 _ “github.com/go-sql-driver/mysql“:Go语言接口编程与init结合的经典案例
本文解析了Go语言中import _ "github.com/go-sql-driver/mysql"这行代码的设计原理。通过分析database/sql包的全局map注册机制,揭示了MySQL驱动如何利用init函数自动注册自己。文章阐述了匿名导入的作用、面向接口编程的精髓(依赖倒置、开闭原则、插件架构),并通过一个日志插件系统的示例加深理解。核心思想是:这行代码实现了驱动自动注册机制,体现了Go语言通过init函数和接口实现松耦合设计的哲学,展示了如何通过全局注册中心和命名查找构建灵
2026-03-18 18:11:58
366
原创 es运维常用命令
本文介绍了Elasticsearch分片问题的诊断与修复方法。主要内容包括:1)使用_cluster/allocation/explain命令分析分片未分配原因;2)通过强制分配空主分片解决.watches索引问题;3)检查集群健康状态、节点磁盘空间和分片恢复进度;4)使用forcemerge优化索引段合并。文中提供了完整的API命令序列,特别是针对分片分配异常时的强制修复方案,并强调了数据丢失风险确认的重要性。这些命令适用于处理Elasticsearch集群中的分片分配问题和索引优化场景。
2025-09-05 16:59:34
1096
原创 如何安全地删除与重建 Elasticsearch 的 .watches 索引
摘要: 当Elasticsearch的Watcher告警功能异常时,核心索引.watches可能出现分片状态UNASSIGNED或数据丢失。通过诊断命令(如_cluster/allocation/explain)确认数据无法恢复后,需强制重建索引。方法一(推荐)使用allocate_empty_primary命令分配空分片,需指定节点ID并明确接受数据丢失(accept_data_loss: true)。操作后验证索引状态应恢复为green。注意:此操作会永久删除所有告警配置,需提前备份或准备重新创建规则。
2025-09-05 14:35:35
490
原创 CentOS 7/8 单用户模式重置 root 密码完整流程
选择默认启动项,按进入编辑模式找到linux16或linux开头的行在行末添加rd.break(确保与已有参数用空格分隔)按或启动。
2025-09-02 16:03:08
668
原创 Alpine Linux 极简安装指南:3分钟搞定系统部署
本文详细介绍了Alpine Linux系统的安装和网络配置流程。安装过程通过setup-alpine命令完成,包含键盘布局、主机名、网络配置(DHCP/静态IP)、DNS、root密码、时区、镜像源选择等12个步骤,重点说明了磁盘分区模式的选择。网络配置部分则介绍了使用setup-interfaces工具配置网卡接口的方法,包括IP地址、子网掩码和网关设置。文中配有操作截图,特别提醒选择正确的磁盘分区模式(如sda sys)以避免数据丢失。该指南适用于需要快速部署轻量级Linux系统的用户。
2025-09-02 15:34:18
904
原创 『10分钟极速上手!』基于 Alpine Linux 的轻量级 K8s 集群部署指南(附一键脚本)
本文介绍了一个基于Alpine Linux的轻量级Kubernetes集群架构及部署方案。该架构分为四个层级:基础设施层(Alpine Linux+containerd)、编排层(Kubernetes核心组件)、集群核心服务层(Flannel CNI+Helm)和应用层(Ingress、cert-manager和Rancher)。各层组件间存在明确依赖关系,上层依赖下层服务正常运行。 部署过程分为三个阶段:基础集群搭建(安装Alpine、初始化K8s)、核心服务部署(安装Helm、Ingress、cert-
2025-09-02 14:54:03
1543
原创 在Alpine Linux上配置Redis使用NFS存储的完整指南
本文详细介绍了在Alpine Linux系统上配置Redis使用NFS存储的完整方案。主要内容包括:环境准备说明、NFS存储的优势(集中管理、备份便利、资源优化)、分步骤配置指南(停止服务、数据备份、权限设置、NFS挂载、自动挂载配置),以及NFS服务器端的权限设置建议。特别强调了挂载NFS前必须停止Redis服务,并解释了数据写入异常的常见原因(挂载点覆盖行为)。最后提供了效果验证方法和常见问题排查技巧,确保Redis数据能正确持久化到NFS共享存储中。该方案特别适用于容器化部署和多实例共享数据的场景。
2025-08-01 14:27:56
635
原创 CephFS 和 SSHFS 挂载指南:从配置到排错
本文对比了CephFS和SSHFS两种远程文件系统挂载方式。CephFS适用于大规模分布式存储,提供高性能企业级解决方案,支持自动化挂载和故障排查;SSHFS则基于SSH协议实现轻量级远程访问,适合个人临时使用。文章详细介绍了两种方式的安装配置步骤、验证方法和常见问题解决方案,并从协议、性能、适用场景等方面进行了对比分析。CephFS适合集群环境,而SSHFS更便于个人快速部署使用。
2025-07-17 10:27:13
530
原创 在 Ubuntu 24.04 中安装 Python 2.7、pip 及 mysqlclient==1.4.6 的完整指南
Ubuntu 24.04安装Python 2.7及mysqlclient指南 本文详细介绍了在Ubuntu 24.04中安装Python 2.7.18、pip 20.3.4和mysqlclient 1.4.6的完整步骤。由于官方已移除Python 2支持,需手动编译安装,并解决依赖问题。关键步骤包括:安装编译依赖、配置Python 2.7源码、安装特定版本pip,以及处理mysqlclient的依赖冲突。常见问题如zlib缺失、mysql_config错误等均有解决方案。注意Python 2.7已停止维护,
2025-07-10 10:43:50
2067
原创 CentOS变Ubuntu后后端程序SO库报错,解决方案+原理分析!
系统更新后应用程序因缺失libssl.so.10库而无法运行。通过ldd和strings命令分析新旧系统环境差异,确认该库及其依赖项libcrypto.so.10已被移除。解决方案建议创建专用目录存放旧库文件,设置LD_LIBRARY_PATH环境变量指向该目录,并详细说明了操作步骤与注意事项。同时解析了ldd、strings命令的工作原理及LD_LIBRARY_PATH的优先级机制,为类似库依赖问题提供技术参考。该方案既能快速解决问题,又避免影响系统其他组件。
2025-06-12 11:56:00
997
原创 Go 语言安装指南:并解决 `url.JoinPath` 及 `Exec format error` 问题
本文提供了Go语言的安装指南,并针对url.JoinPath函数兼容性问题及Exec format error架构错误给出解决方案。主要内容包括:1) 如何正确卸载旧版本并安装与系统架构匹配的最新Go版本(区分AMD64/ARM64);2) 环境变量配置方法;3) 验证安装步骤。重点解决两个常见问题:Go 1.19以下版本无法使用url.JoinPath需升级版本,以及架构不匹配导致的执行错误需重新下载正确版本。文中包含详细的命令行操作和架构检查方法,帮助开发者顺利完成Go环境配置。
2025-06-12 10:47:22
697
原创 KINGCMS被入侵
检测到可疑的Git仓库状态,显示存在潜在的恶意文件修改活动。仓库中发现了被删除和修改的关键文件,包括多个PHP登录页面和jQuery文件。同时存在多个未跟踪文件,如.admin目录、多个可疑PHP文件(包括mysql.php和newfile.php)以及未经授权的安装目录。这些行为可能表明系统已被入侵,攻击者可能植入了后门或恶意脚本。建议立即审查这些文件变更,并检查系统安全性。
2025-06-03 13:54:25
493
原创 解决 Linux Bash 脚本因换行符问题导致的 “bash^M: No such file or directory“ 错误
• `\r` 是回车(Carriage Return),把光标移回行首。1. Windows 换行符(CRLF):`\r\n`(回车+换行)• Windows 继承了 DOS 的 `\r\n` 换行格式。• `\n` 是换行(Line Feed),把光标移到下一行。2. Unix/Linux 换行符(LF):`\n`(仅换行)• 把 `\r` 当作命令名的一部分(变成 `bash\r`)• Unix/Linux 使用简洁的 `\n` 换行格式。• 系统找不到名为 `bash\r` 的命令,于是报错。
2025-05-19 16:31:12
964
原创 将现有 Java 代码转换为 Kotlin 代码
,然后将 Java 代码粘贴到该文件中。Android Studio 随即会显示一条提示,询问您是否要将代码转换为 Kotlin 代码,如图 5 所示。如需将 Java 代码转换为 Kotlin 代码,请在 Android Studio 中打开 Java 文件,然后依次选择。或者,也可以创建一个新的 Kotlin 文件(依次选择。,让系统将来自动进行转换。
2024-05-10 11:33:45
1870
1
原创 [初学安卓]安卓页面跳转android.content.Intent运用
val intent = Intent(this, Main2Activity::class.java)//注释2。
2024-05-10 11:13:06
821
2
原创 Filebeat将csv导入es尝试
1.filebeat 导入csv的资料很少,主要为pipline方式,测试几个失败。一般日志收集可使用logstash,每行的信息会存到message中。结论:filebeat导csv并不方便,建议采用logstash。是一个测试接口,提供pipline的规则和测试数据,返回结果数据。是pipline中的正则匹配模式,以上规则的复杂版。若产生新的数据,会新增一个字段为foo:bar。测试结果pipline配置后,并没生效。,并命名为my-pipeline-id。我简单介绍主流程,详情见上链接。
2024-03-01 12:00:19
1222
原创 hadoop安装的过程中的报错/libhadoop.so.1.0.0
遇到如下错误:14/10/29 16:49:01 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable。Server: ssh: Could not resolve hostname server: Name or service not known 分析原因知,2.报log不能写入。
2024-03-01 11:58:18
1964
原创 php连接hdfs初步探索
webhdfs与httpfs的主要区别在于:webhdfs需要访问集群的所有节点,当读取某些数据时,它直接从该节点传输,而在httpfs中,单个节点的作用类似于“网关”,将是向客户机节点传输数据的单点。所以核心还是hadoop中,原来hadoop对hdfs提供的http的访问模式,只需要对hdfs_site.xml的配置中关于http的访问开启即可。后搜到官网的相关资料,此hdfs.h的文件路径的地址是$HADOOP_HDFS_HOME/include/hdfs.h。而且网上用此拓展人的并不多,暂时舍弃。
2024-03-01 11:57:17
764
x-pack-5.6.4.jar
2019-01-16
x-pack-5.6.2.jar
2019-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅