IT技术博客大学习 共学习 共进步
首页 / 忘我的追寻
IT 2016-03-17 00:07:26 / 累计浏览 1,460

Linux文件系统基础之inode和dentry

这篇讲的是Linux文件系统中两个最核心的元数据结构——inode和dentry,以及它们如何协同工作来构建我们熟悉的文件目录。 作者从虚拟文件系统VFS的抽象层入手,解释了为什么需要这些结构来统一管理底层不同的实体文件系统(如ext4)。文章指出,inode是内核中文件对象的唯一标识,它存储了权限、属组、数据块位置等所有静态元数据,但刻意不包含文件名。而文件名与inode的映射关系,则由目录项dentry在内存中动态建立和维护。 通过阅读文件路径时内核的解析过程,文章清晰地展示了dentry如何通过内存中的树状结构,高效地缓存和还原出文件系统的目录层次。这种设计将稳定的磁盘结构与灵活的内存缓存分离,是Linux文件系统高性能的关键。 理解了inode和dentry,文章最后点明,文件链接的奥秘也迎刃而解:软链接拥有独立的inode和内容,而硬链接仅仅是为同一个inode在目录项中新增了一条名字映射,并通过引用计数管理生命周期。整篇文章从底层原理出发,把看似复杂的文件系统机制拆解得条理分明。

IT 2016-02-29 23:49:04 / 累计浏览 2,400

Jetty 8长连接上的又一个坑

这篇讲的是 Jetty 8 长连接处理中一个隐蔽的“坑”:超时断开机制只在数据传输阶段生效,一旦数据进入服务端处理环节,就不再检测空闲。作者从 `SelectChannelEndpoint` 类的核心代码入手,解释了连接如何通过 `setCheckForIdle` 和 `notIdle` 方法被标记为“空闲”或“非空闲”,从而控制超时判断。 问题的关键点发生在请求数据收集完毕、即将提交给后端 Servlet 处理的瞬间。在 `AsyncHttpConnection` 的 `handle` 方法中,代码在调用 `_asyncEndp.setCheckForIdle(false)` 后,可能会因为复杂的处理流程和异常路径,导致该标志位未能按预期复位。这使得在后端业务逻辑执行期间,select 线程依然在监测连接的“空闲时间”,一旦处理耗时超过阈值,连接就会被错误地断开——即便业务数据正在处理中。 文章通过代码走读,精准定位了这个因状态管理不严谨导致的并发陷阱。对于使用 Jetty 8 进行长连接服务的开发者来说,理解这一机制尤为重要,尤其是在设计耗时较长的异步处理逻辑时,需要格外注意避免此类意外断连。

IT 2016-02-10 23:09:10 / 累计浏览 2,420

跨域访问和防盗链基本原理(二)

这篇文章深入拆解了Web前端跨域访问的核心原理,重点对比了两种主流解决方案:JSONP与CORS。作者从跨域访问的定义切入,清晰区分了浏览器Referer请求与脚本发起请求在安全性上的根本差异——后者可能被恶意利用截获数据,因此成为需要重点管控的技术问题。 文章详细剖析了JSONP的工作机制:它巧妙地利用了浏览器允许加载外部脚本的特性,通过客户端预先定义函数、服务端返回调用该函数的脚本代码来传递数据。作者也客观指出了JSONP的局限:只能发起GET请求、依赖客户端与服务端的特定配合,且数据必须是JSON格式。 随后,文章将视角转向更现代的CORS方案。这里作者解释了其核心是服务端通过设置HTTP响应头(如Access-Control-Allow-Origin)来显式授权跨域访问。浏览器在正式发送请求前,会通过OPTIONS预检请求与服务端协商权限,这一流程使得跨域访问的控制权更规范地回归到了服务端。文中配有的流程图,清晰地展示了这一交互过程。 最后,文章简要提及了服务器代理、修改域标识等其他方案,但明确指出JSONP与CORS构成了当前跨域访问实践的两大基石。整体上,文章从原理到实践,系统地梳理了这一前端关键技术点的演进与现状。

IT 2016-02-10 23:07:10 / 累计浏览 2,720

跨域访问和防盗链基本原理(一)

这篇讲的是防盗链的基本原理。作者从网页资源的加载过程切入,指出浏览器呈现一个完整页面需要发起大量GET请求,其中既包括本站资源,也可能包含非本站托管的外部资源。当网站A未经允许直接引用网站B的图片等资源,并从中获益时,就构成了“盗链”,这会消耗B站的流量。 文章核心对比了两种请求情况:直接访问页面时不会携带来源信息,而浏览器加载页面内的外部资源时,会自动在HTTP请求中加入`Referer`头,明确标示出请求的来源页面。资源服务器正是通过检查这个头域,来判断请求是否为本站或允许的来源。 对于非授权来源的请求,服务器可以拒绝提供资源,返回错误图片或提示信息,从而有效防止盗链。文章通过抓包截图直观展示了请求过程,清晰阐述了如何利用`Referer`机制实现基础防护,并为后续讨论跨域访问问题做了铺垫。

IT 2016-02-09 23:35:05 / 累计浏览 3,500

微信朋友圈技术之道

这篇讲的是微信朋友圈在面临十亿级日发布、百亿级日浏览的海量压力时,如何保障系统稳定与性能的核心架构。 微信朋友圈负责人陈明分享了其背后的技术之道。面对移动互联网汹涌的峰值流量(如春节期间流量达平日5倍),系统通过一套自动化的服务优先级策略进行应对:优先保障支付与点对点消息,然后是群聊,最后才是朋友圈。在核心架构上,朋友圈采用“写扩散”模型——用户发布内容时,会将数据副本写入每个好友的时间线表。这种看似“重”的写入,换来了极其简单可靠的读取(只读自己的时间线),大幅降低了读失败的可能性。 文章还揭示了朋友圈数据依赖的四个核心表(发布、相册、评论、时间线)及其水平扩展方式,并详细阐述了多层级容灾设计。从同城多园区无感切换,到全球多数据中心的跨地域同步,微信甚至为适应高延迟、高丢包的跨国公网环境,自研了类TCP协议以保证数据同步的效率与安全。 整个分享从数据背景、架构选型到容灾细节,清晰展示了一个超大规模社交系统如何在性能与可靠性之间做出权衡与设计。

IT 2016-02-07 14:41:36 / 累计浏览 2,820

SSL多域名绑定证书的解决方案

这篇讲的是如何在一个服务器上,为多个不同的域名部署HTTPS服务。传统上,一张SSL证书通常绑定一个域名,但在实际运维中,我们常常遇到一个服务器需要同时承载多个域名的情况。文章从这个现实背景出发,梳理了几种主要的解决方案。 最直接的方式是采用虚拟主机技术,为每个域名分配独立的IP地址并绑定各自证书,但这对IP资源要求较高。对于同级子域名,可以申请通配符证书,但它只能匹配二级子域名,无法覆盖更深层级或主域名本身。更灵活的方案是使用支持“使用者可选名字”(SAN)扩展的证书,通过XCA等工具,就能将多个不同的域名都写入同一张证书中。 如果必须为每个域名单独签发证书,那么SNI(服务器名称指示)技术就成了关键。它允许服务器在SSL握手阶段就识别出客户端请求的域名,从而返回正确的证书,实现“单IP、多证书”。文章指出,这项技术已获得主流浏览器和Web服务器的支持,为灵活部署HTTPS提供了坚实的基础。

IT 2015-12-13 22:04:23 / 累计浏览 3,100

TLS 握手优化详解

这篇讲的是随着HTTPS成为主流,如何优化TLS握手带来的性能开销。作者从TLS握手需要消耗两个RTT(往返时间)的痛点出发,详细拆解了False Start优化技术——它允许客户端在握手尚未完全结束时就提前发送加密的应用数据,从而将握手延迟从两个RTT压缩至一个。文章还深入分析了证书链的优化策略,指出证书过长或中间证书缺失会导致额外开销,并推荐了使用ECC证书来显著减小证书体积。通过Wireshark抓包图,文章直观展示了这些优化前后的对比效果。对于正在部署HTTPS的开发者来说,这些关于握手流程和证书配置的实践细节,能有效帮助他们在不牺牲安全性的前提下提升连接速度。

IT 2015-07-21 23:39:31 / 累计浏览 1,900

一些LVS实验配置、工具和方案

这篇讲的是作者在LVS环境下验证的一种不中断业务的RealServer升级方案。核心目标是在不中断前端服务的情况下,对后端真实服务器进行维护或重启。 作者选用了LVS的DR(直接路由)模式进行实验。文章详细列出了网络规划,包括两台RealServer和一台Director Server的IP分配。关键在于具体的配置实践:在Director上,通过ipvsadm工具设置VIP和采用加权轮询调度算法;在RealServer上,则通过脚本在本地绑定VIP并设置ARP抑制,这是DR模式正常工作的基础。 作者验证的流程是:通过脚本控制,让需要升级的RealServer自动从LVS集群中移除,待维护完成并检查健康后,再自动重新加入集群。整个过程对客户端保持透明,实现了业务不中断。文章提供了可用的脚本片段,将配置步骤代码化,方便读者参考和复现。对于需要在生产环境中安全维护LVS节点的运维人员来说,这个实验记录提供了一套切实可行的操作思路和工具参考。

IT 2014-12-28 23:56:39 / 累计浏览 3,980

NAS解决方案实现多媒体文件共享播放

这篇讲的是,如何用家里闲置的台式机,自己动手搭一个家庭影音中心,让笔记本、平板也能像访问本地硬盘一样,流畅播放电脑里的高清大片。 作者从日常存储空间不足的痛点出发,尝试了HTTP、FTP等流媒体方案,但都不够完美。最终,他利用Windows系统自带的SMB文件共享功能,将台式机改造成了家用NAS。 文章的核心在于一步步打通整个共享链路。服务端需要确保Server、TCP/IP NetBIOS Helper等关键服务处于开启状态,正确设置网络属性的NetBIOS选项,并为想共享的文件夹配置好访问权限。客户端则可以映射网络驱动器,直接获得一个类似本地磁盘的盘符。 配置完成后,作者发现直接播放1080P视频仍有卡顿。根因在于顺序读取时对瞬间传输速率要求过高。通过在共享设置中勾选“启用缓存以提高性能”选项,问题得到解决,播放变得流畅。 这个方案不仅限于Windows设备间互联,通过安装相应的应用,类Unix系统或其他终端也能访问这个共享服务。它把一台普通电脑变成了家庭的多媒体文件枢纽,实用性很强。

IT 2014-11-30 23:23:24 / 累计浏览 12,280

如何使用1M的内存排序100万个8位数

这篇讲的是如何在仅有1MB内存的约束下,对100万个8位整数进行排序的经典算法难题。问题最初源于Stack Overflow,看似无解——毕竟100万个数直接存储就需要超过1MB的空间。文章介绍了一种巧妙的解法核心:不直接存储排序后的每个数字本身,而是利用它们已排序这一特性,转而记录相邻数字之间的差值。由于这些差值平均很小,理论上可以用大约7位(bit)来表示一个差值,总计约0.875MB,从而在1MB内存内完成编码存储。实现上采用了高效的归并排序,并利用算数编码或哈夫曼编码对差值进行压缩编码。作者还分享了完整的339行实战代码,并提到了其他程序员的不同解题思路,展现了算法在极端约束下化不可能为可能的魅力。

IT 2014-11-30 23:22:44 / 累计浏览 1,880

基于DRBD的高可用NFS解决方案分析

这篇讲的是如何用 DRBD 和 NFS 搭建高可用文件共享方案的一次实践与踩坑。作者从分析 NFS 协议(特别是 NFSv4 对迁移和故障恢复的定义)出发,设计了一个方案:底层用 DRBD 实时镜像块设备,在其上建立文件系统,再通过 NFS 共享,期望在主机故障时能实现业务无感知的切换。 按照这个思路,作者搭建了测试环境,模拟在线业务时进行 DRBD 倒换、NFS 重启和 IP 漂移。理论上,NFS 协议的“grace time”机制应该能处理服务端重启,让客户端用旧的文件句柄重新连接时依然能定位文件。 但实际测试结果是:客户端报出“NFS句柄无效”的错误。作者分析指出,关键问题在于 DRBD 镜像的块设备在两台主机上各自挂载后,生成的 inode 分配并不一致。尽管文件系统数据完全一样,但 NFS 服务端是通过宿主文件系统看到共享目录的,当发生切换后,对端无法正确解析客户端原有的、基于旧 inode 信息构造的文件句柄,导致访问失败。文章最后也坦诚了验证未能完全成功,并提出了后续可以从 NFS 源码层面探索直接共享 DRBD 设备内容的思路。

IT 2014-11-30 23:22:09 / 累计浏览 7,460

存储基础知识之——硬盘接口简述

这篇文章梳理了从经典的IDE到现代FC、iSCSI等七种主要硬盘接口技术的演进与区别。文章指出,IDE(即并行ATA)因性能和速率的局限,已随SATA(串行ATA)的兴起而退役。SATA目前是消费级市场的主流选择,其接口速率已迭代至第三代。 在企业与高性能领域,文章则对比了SCSI体系及其继任者。SCSI-3虽能提供160MB/s带宽并支持多设备,但其并行架构已发展为串行的SAS接口,后者不仅提供更高的传输速率(如第二代SAS达6Gbps),还通过点对点连接简化了部署,并能兼容SATA设备。更为关键的是,文章详解了如何通过网络化突破本地存储的物理限制:iSCSI技术将SCSI命令封装于TCP/IP协议中,利用现有网络实现远距离、大规模的存储区域网络(SAN);而光纤通道(FC)则以其高速(可达16Gbps)、低延迟和长距离传输(最远10公里)的特性,成为构建高性能企业级SAN的核心选择。 整体来看,这篇文章从接口的物理形态、传输协议到应用场景,系统性地梳理了存储连接技术的关键差异,为理解存储系统架构和选型提供了清晰的脉络。

IT 2014-11-30 23:21:13 / 累计浏览 2,780

Openstack Swift简介

这篇讲的是 OpenStack 的核心对象存储服务——Swift 的设计哲学与实现原理。它要解决的核心问题,是如何在相对廉价的标准硬件上,构建出一个能承载海量非结构化数据的高可用、可无限扩展的存储系统。 文章深入解析了 Swift 的几个关键设计。为了解决海量数据的寻址难题,它采用了一致性散列技术,并通过一个名为“Ring”的独特数据结构,将数据均匀映射到物理设备上,在增减节点时大幅减少数据迁移。更精妙的是其一致性模型:Swift 在 CAP 理论下选择了“最终一致性”,通过 Quorum 仲裁协议(默认配置3副本、写需2个成功)来平衡可用性与一致性,以适应读写频繁的互联网场景。其清晰的数据模型(账户/容器/对象)和对称、无单点的系统架构,则进一步支撑了其多租户和横向扩展能力。 整体来看,文章从背景原理到架构细节,清晰地勾勒出了一个用软件层面的精巧设计(如一致性散列、Quorum协议)来弥补硬件简陋、并最大化可用性与扩展性的经典分布式系统范例。

IT 2014-11-30 23:19:01 / 累计浏览 2,740

关于Python的闭包和后期绑定

这篇讲的是Python开发者常掉进去的一个坑:如何正确理解闭包与后期绑定。作者从“Python程序员的10个常见错误”中引出话题,通过汇总维基百科、《Java编程思想》等不同来源对闭包的定义,最终聚焦于一个核心点——闭包是一个包含了变量和其绑定环境的完整整体。 文章用一个经典的代码例子来阐明问题:用列表推导式生成一系列lambda函数,期望它们分别捕获不同的值,但实际调用时却都输出了最后的结果。这里的关键就在于Python的“后期绑定”特性——闭包中引用的变量,在函数被调用时才去环境中查找其值,而不是在定义时。因此,所有lambda函数捕获的都是同一个变量`i`,在循环结束后它的值是4。 理解这一点,能帮助我们避免这类因延迟求值导致的诡异bug。文章不满足于给出定义,而是通过具体代码剖析了概念在实践中的真实表现,对厘清闭包机制很有帮助。

IT 2014-11-30 23:18:03 / 累计浏览 4,480

OpenStack Swift源码导读之——业务整体架构和Proxy进程

这篇文章深入剖析了OpenStack Swift对象存储的业务整体架构与Proxy进程的实现细节。作者从Swift的源码目录结构入手,清晰地解读了proxy、account、container、object等各业务进程的职责划分。 重点在于Proxy进程的业务处理逻辑。文章指出,理解其基于PasteDeploy的堆栈式WSGI架构是关键,每一层分工明确,最外层处理异常。Proxy进程通过解析请求URI和方法来识别资源类型,并借助控制器进行分发。其核心路由机制依赖于一致性哈希环,作者通过具体代码段(如get_nodes、get_part函数),展示了如何通过哈希计算将请求映射到特定的物理节点集合。 此外,文章还揭示了Swift在保证数据高可用性方面的设计:通过引用NWR原则(如3写2读),并在make_requests等公用方法中实现“法定人数”判定,确保了分布式环境下写操作的可靠性。整个导读将抽象的架构设计与具体的代码实现相结合,为读者理解Swift内部如何协调请求、定位资源与维护数据一致性提供了清晰的路径。

IT 2014-11-28 23:14:05 / 累计浏览 2,860

云存储中的HTTP鉴权算法分析

云存储的安全高度依赖鉴权机制,传统的HTTP基本认证(Base64编码用户密码)因易被截获和反向解析,已无法满足云环境的安全需求。这篇文章对比了两大主流云平台——AWS S3与OpenStack Swift——为解决此问题所采取的不同鉴权路径。 AWS S3采用了基于请求签名的算法。其核心是每次请求时,客户端将请求元信息与私钥(SecretAccessKey)组合,通过SHA256哈希生成一个签名值随请求发送。服务端用同样方法计算签名并比对。即便请求被截获,攻击者也无法反推私钥,且签名与特定请求绑定并有时效性(15分钟),有效防范了密钥泄露和请求重放风险。 相比之下,OpenStack Swift依赖Keystone服务发放的Token。客户端先用账号密码换取一个有效期Token,后续请求都需携带。服务端每次向Keystone验证Token的有效性。这种方式架构更集中,便于多服务共享鉴权。但缺点也明显:Token泄露风险较高,且每次请求都需额外验证,可能带来性能开销,历史上还出现过Token永久有效的Bug。 两者的选择反映了不同的权衡:AWS S3在每次请求层面实现细粒度、高强度的安全;OpenStack Swift则追求服务治理的便捷与统一,但需在Token生命周期和验证效率上做好管控。

IT 2014-11-28 23:11:42 / 累计浏览 4,520

存储基础知识之——磁盘阵列原理及操作实战

这篇文章从磁盘阵列的物理结构讲起,重点拆解了Linux环境下逻辑卷管理(LVM)的核心概念与实操流程。作者先用通俗比喻厘清了LUN(逻辑单元号)在SCSI寻址体系中的扩展作用,随后将LVM的三个关键层次——物理卷(PV)、卷组(VG)、逻辑卷(LV)——逐一剖析。文章没有停留在理论定义,而是直接进入实战环节:从用fdisk修改分区格式为LVM专用的8e开始,依次演示了如何初始化PV、创建并激活VG、以及最终在VG上创建LV的完整命令链。其中还穿插了管理场景的处理,比如如何为现有VG扩容、安全移除PV等。对于需要灵活调配存储资源的运维或开发人员,这篇文章把从硬件到逻辑层的概念关联和操作路径理得比较清晰,尤其适合想理解LVM实际用途的读者。

IT 2014-11-27 13:00:25 / 累计浏览 5,360

HTTPS、SSL与数字证书介绍

这篇讲的是HTTPS、SSL与数字证书三者如何协同工作,共同构筑起现代互联网通信的安全基石。作者从安全通信的基本需求出发,清晰地拆解了HTTPS(安全的超文本传输协议)的本质——在HTTP和TCP之间加入一个加密层,而SSL(或其升级版TLS)正是实现这个加密层的关键协议。 文章没有停留在概念罗列,而是深入到了实现机制。它通过一个生动的A与B对话场景,形象地演示了SSL/TLS协议的“握手”过程:如何巧妙地结合非对称加密(用于安全地协商密钥)和对称加密(用于高效地传输数据)来平衡安全性与性能。同时,详细阐述了数字证书的核心作用——它如同网络世界的“身份证”,由权威的证书颁发机构签发,用于验证服务器身份并分发公钥,从而防止中间人攻击。 对于证书的信任链,文章也给出了直观解释:客户端(如浏览器)内置了受信任的根证书列表,只有由这些机构颁发的证书才会被信任。整体而言,这篇文章将抽象的安全概念落到了具体的协议交互与文件验证上,是理解HTTPS工作原理的一篇扎实导读。

IT 2014-11-27 12:56:39 / 累计浏览 3,100

构建高可用和弹性伸缩的KV存储系统

KV存储系统在现代高并发应用中扮演着关键角色,但经典的Memcached和Redis在运维中常面临容灾困难、数据复制效率低以及在线扩容复杂等挑战。这篇内容从这些实际痛点出发,深入分析了Redis在持久化、主从复制和集群扩展方面的局限,比如主机宕机可能导致数据丢失、全量复制影响性能,以及扩容需要人工干预等。 针对这些问题,文章提出了一套新的分布式架构设计。该系统由路由、存储、管理和搬迁四类节点组成,通过一致性哈希与虚拟节点实现数据均匀分布,并利用心跳检测和自动切换机制来保障高可用。新方案不仅兼容现有协议,还实现了自动容错恢复、负载均衡和弹性伸缩,试图在保证内存级性能的同时,让运维变得更加智能和可靠。 整体来看,这不仅是对现有技术的梳理,更提供了一个从架构层面系统化解决KV存储可用性与扩展性难题的思路,对从事基础架构或缓存设计的工程师有直接的参考价值。

IT 2014-11-25 22:47:00 / 累计浏览 3,180

每个程序员都应该知道的一些访问时延值

这篇文章分享了一组程序员最好烂熟于心的参考值——从CPU各级缓存、主存、固态硬盘到跨地域网络请求的访问延迟。这组经典数据最早源自谷歌传奇工程师 Jeff Dean 的演示文稿,它用具体数字将抽象的“快”与“慢”量化成了直观的层次。 例如,从L1缓存访问只需几纳秒,而访问一次固态硬盘则需要几万纳秒,一次跨大西洋的网络往返可能要一百多万纳秒。这之间几个数量级的差异,直接决定了我们在设计算法、选择存储方案和搭建分布式系统时的性能天平该如何倾斜。文章作者不仅呈现了数据,还提供了社区整理的精炼版链接,并讲述了关于 Jeff Dean 的著名轶事,让这组数据多了几分传奇色彩。 在编程世界里,凭感觉优化往往事倍功半。而将这些延迟数字内化于心,能帮助你在架构层面做出更明智的判断,比如何时该引入缓存、数据该如何分区、或是如何设计一个能容忍网络延迟的服务。有了这些量化概念,做技术决策时才能心中有“数”。