IT技术博客大学习 共学习 共进步

系统运维

共 606 篇文章

IT 2013-11-01 13:51:46 / 累计浏览 1,209

MogileFS 复制不正常,发现文件少于指定的份数解决方法

这篇文章聚焦于一个MogileFS部署中的棘手故障:安装最新版后文件复制功能异常,副本数始终无法达到设定值。作者通过telnet监控发现replicate进程不断报错退出,日志显示“Child died: 256 (UNEXPECTED)”。 经过深度调试,作者定位到根本原因:Perl的Sys::Syscall模块升级至0.25版本后与新版MogileFS存在兼容性问题,导致底层复制操作失败。文章给出了明确的排查与解决路径:首先使用命令检查模块版本,确认是否为0.25;若是,则通过CPAN回退安装稳定的0.23版本即可恢复正常复制功能。此外,文章还补充提醒了最新客户端对数据库密码的硬性要求。 这是一次典型的、由依赖库升级引发的隐蔽故障排查记录。作者不仅详细描述了故障现象,更关键的是找到了那个“不兼容的精确版本”,并给出了可立即操作的修复命令,为同样遇到此问题的开发者节省了大量排错时间。

IT 2013-10-29 23:04:41 / 累计浏览 1,871

MooseFS之虚拟机惹的祸

这篇讲的是一个生产环境MooseFS集群的惊险故障复盘。国庆后,一台ChunkServer重启导致Master无响应几十分钟,整个集群瘫痪。排查日志发现,海量的“nonexistent chunk”错误日志打印是罪魁祸首。 作者深入源码分析,发现处理逻辑本身多为内存操作,问题出在单线程的Master进程调用syslog写磁盘这个操作上。通过对比线上和测试环境的TPS数据,性能差异达到惊人的65倍。最终锁定根因:运维此前将Master从物理机迁移到了虚拟机,而虚拟机的系统盘直接挂载在性能较差的网络iSCSI设备上,导致磁盘I/O成为致命瓶颈。 文章不仅给出了直接注释日志代码和迁移回物理机的解决方案,更提炼出关键经验:MooseFS Master的单线程架构对磁盘I/O极其敏感,一旦涉及磁盘写入就可能成为性能瓶颈,因此强烈不建议将其部署在虚拟机环境。作者还结合HDFS对比,指出了单线程设计在高并发场景下的局限性,为存储选型提供了直观参考。

IT 2013-10-29 23:04:06 / 累计浏览 1,566

解决HDFS磁盘扫描导致死亡结点的问题

这篇讲的是作者在升级Hadoop至2.0后,处理的一个棘手的生产故障:集群中磁盘数量多的DataNode会周期性地变为“死亡结点”,虽未立刻影响业务,但一次双副本DataNode同时死亡导致了数据丢失。 问题排查的关键突破口在于“6小时”这个固定间隔。作者将它锁定为DataNode的周期性磁盘扫描任务,并通过jstack抓取堆栈发现了隐蔽的根因:在扫描过程中,数据块对比的步骤需要对核心的DataSet对象加锁,而该步骤中一个看似无害的`File.length()`方法调用,在底层会执行磁盘IO操作。在磁盘压力较大时,这个操作会耗时很长,导致DataSet锁被长时间持有,进而阻塞了心跳线程和所有数据传输线程,造成DataNode被NameNode误判为死亡。 解决方法巧妙且高效:将引发IO操作的`getlength`提前到第二步异步的磁盘扫描任务中执行,从而将持锁时间从几十分钟大幅缩短至2秒左右。文章完整还原了从现象观察、假设推翻到利用工具(jstack)锁定真凶的全过程,对理解分布式系统中锁竞争、IO影响以及复杂故障排查思路很有启发。最终,他们将修复补丁提交至了Apache社区(HDFS-5341)。

IT 2013-10-23 12:58:13 / 累计浏览 1,686

使用 lsyncd 同步本地和远程目录

这篇讲的是如何解决文件同步的实时性与服务器资源消耗之间的矛盾。作者从常见的 rsync + cron 方案切入,指出其“定时轮询”的固有局限——间隔设得太短则频繁启动 rsync 增加负担,设得太长则同步不及时。 文章的核心方案是引入基于 Linux inotify 事件驱动的 lsyncd 工具。它不同于 cron 的定时执行,而是像一位尽职的哨兵,持续监测本地目录的变动。一旦捕捉到文件或目录的变更事件(默认触发条件是每20秒或累积1000次写入),便立即触发 rsync 或 rsync+ssh 进行精准同步。这种“按需启动”的模式,从根本上避免了无谓的资源消耗。 作者用清晰的步骤,演示了从安装、手动创建配置目录,到编写 Lua 配置文件(重点指明 source、host、targetdir 三个参数)和设置无密码 SSH 登录的全过程。配置完成后,lsyncd 服务启动即可自动守护同步任务。 最终,文章指出通过简单修改配置文件(将远程同步改为本地目录同步),lsyncd 同样能胜任本地目录镜像备份的任务,提供了灵活的文件同步选项。

IT 2013-10-23 12:57:19 / 累计浏览 23,336

Git subtree 要不要使用 –squash 参数

这篇讲的是,作者在使用 Git subtree 管理多层代码包含关系时,遇到了一个持续困扰的冲突问题,并深入分析了 --squash 参数背后的机制与应对策略。 作者从实际项目(Gregarius 管理 MagpieRSS,后者又管理 Snoopy)出发,指出使用 subtree 的 --squash 参数虽然能让主项目提交历史更清爽,却会在后续更新(subtree pull)时,反复引发需要手动解决的冲突。反之,不用 --squash 虽然更新顺畅,但子项目的历史会“污染”主项目。 文章清晰地剖析了根因:--squash 会合并并消除子项目的历史提交,导致下次合并时 Git 找不到共同的父提交,从而无法自动处理冲突。作者引用并评估了 StackOverflow 上的一种平衡方案:在一个专用分支上进行不带 --squash 的更新以保留历史、避免冲突,然后在合并到主分支时使用 `git merge --squash` 将其压缩为一个简洁的提交。 文章最后总结了两种典型的使用场景:如果只是单向接收子项目更新,任选一种方式均可;如果是拆分大项目(如 Symfony2),则建议避免 squash,主项目主导开发再 split 出子项目发布。作者的实践表明,专用分支方案虽然略增复杂度,但能有效兼顾提交历史的整洁与更新的顺畅。

IT 2013-10-15 13:50:43 / 累计浏览 2,612

【翻译】用 elasticsearch 和 elasticsearch 为数十亿次客户搜索提供服务

这篇讲的是邮件服务商 Mailgun 如何为数百万客户提供对每月数十亿封邮件事件的实时搜索与分析。面对原有日志 API 的功能短板,他们构建了基于 Elasticsearch 和 Logstash 的新后端。 核心方案是将所有邮件事件(如发送、拒绝、打开等)通过 Logstash 从 Redis 接入,存入 Elasticsearch 集群,从而提供灵活的字段过滤与全文搜索。文章详细分享了几个关键实践:为满足不同账户的数据保留需求,他们设计了灵活的索引轮转策略;为了处理复杂的事件数据结构,他们定义了详细的自定义 mapping,并巧妙运用了 not_analyzed 属性和多字段类型来优化查询与聚合统计。 此外,文章还介绍了如何通过一个名为 Vulcan 的双层代理来解决 Elasticsearch 原生缺乏的认证问题,以及如何利用 Graphite 和自研的 Vör 工具监控集群状态。整个方案最终让 Mailgun 控制面板拥有了强大的实时日志分析能力。

IT 2013-10-08 12:31:35 / 累计浏览 2,472

CentOS 上的 LNMP 一键安装工具 Centmin Mod

这篇讲的是在CentOS系统上部署LNMP(Nginx, MySQL/MariaDB, PHP)环境时,可以使用的一键安装工具Centmin Mod。作者从观察到许多新手用户四处“求教程”出发,指出LNMP安装本身并不复杂,手动配置过程反而更有学习价值。但对已经熟悉Linux的用户而言,一个集成化的工具确实能提供很大便利。 文章详细介绍了Centmin Mod这款工具。它由早期的Centmin脚本改良而来,一个显著特点是使用了MariaDB来替代传统的MySQL。文中也提到,这与Google、Red Hat等巨头的技术迁移方向是一致的。通过下载、解压并运行一个简单的Shell脚本,用户就能进入一个清晰的交互式菜单。 这个菜单不仅提供了核心的“一键安装”选项(过程大约10-30分钟),还集成了大量运维管理功能,比如为新域名添加Nginx虚拟主机配置、安装或升级PHP加速器(如XCache、APC)、调整SSH端口、关闭SELinux,甚至安装FFMPEG。这使得它不仅仅是一个安装器,更像一个针对CentOS优化的LNMP环境管理套件。对于希望快速搭建环境并拥有后期维护便利性的CentOS用户,它提供了一个省时省力的选择。

IT 2013-10-08 12:27:36 / 累计浏览 1,952

使用 SysRq 键安全重启挂起的 Linux

这篇讲的是,当一台 Linux 服务器(比如 NFS 文件服务器)完全卡死——能 ping 通但无法通过 SSH 或本地终端登录时,在万不得已需要重启前,如何避免数据丢失和文件系统损坏。 问题的根源在于,Linux 为了性能会将大量数据暂存在内存缓存中,而非实时写入磁盘。如果此时强制断电重启,这些尚未落盘的数据就会丢失,导致不一致或损坏。文章的解决方法是利用 Linux 内核的“Magic SysRq”机制。这个机制很特别,它工作在系统服务层之下,只要系统还能响应键盘中断,就能通过一组特定的按键组合执行底层操作。 作者详细介绍了标准的安全重启序列:Alt + SysRq + R-E-I-S-U-B。这六个字母并非随意组合,而是一套严谨的操作流程:先让键盘进入原始模式(R),然后温和地终止除初始化进程外的所有进程(E、I),接着将内存缓冲区强制同步到磁盘(S),再将文件系统重新挂载为只读(U),最后安全重启(B)。每一步之间还需留出适当的等待时间。 对于紧急情况,文章也给出了一个实用简化版:通常只用 Alt + SysRq + S(同步磁盘)和 Alt + SysRq + B(重启)。在按下 S 键并看到同步完成的提示后,再按 B 键,就能在数据安全的前提下完成重启。这确实是在系统看似完全无解时,一个能挽救数据和系统的关键技巧。

IT 2013-10-08 12:26:34 / 累计浏览 2,938

系统自动化配置和管理工具 SaltStack

作者从团队实际运维经验出发,对比了Puppet、Fabric与SaltStack这几款工具。他指出,Puppet擅长系统初始化和配置管理,而Fabric更适合执行批量临时任务,二者功能有别。但如果选择SaltStack,则可以统一覆盖两者功能,从而减轻工具链的复杂度和人力、时间成本。 文章重点介绍了SaltStack的核心优势:它采用ZeroMQ消息队列,通信速度远超Puppet/Chef;整个工具由Python编写,对Python技术栈的团队更友好,更接近其“能力圈”。它通过Salt Master(主控)和Salt Minion(受控)的架构进行集中管理与下发。 随后,文章详细演示了从安装到使用的关键步骤,包括在Ubuntu/CentOS上部署主控与客户端、建立信任关系,并通过命令行示例展示了如何快速执行远程命令。更重要的是,它展示了如何通过定义状态文件(.sls)来实现类似Puppet的配置管理功能,例如自动安装软件包(vim、Glances)并管理配置文件,真正实现了“一键式”的状态强制执行。 这种将配置管理与任务执行融合的“一专多能”工具选型思路,对需要简化技术栈的团队应该很有启发。

IT 2013-09-23 23:11:31 / 累计浏览 5,075

让进程在后台可靠运行的几种方法

这篇讲的是如何在 SSH 断开或终端关闭后,让进程继续可靠运行的经典方法。文章从一个常见痛点出发:在远程执行耗时任务时,网络波动或误关终端会导致任务中断。作者围绕如何规避 HUP(挂断)信号,对比了多种解决方案。 核心方法包括:最常用的 `nohup`,让进程忽略 HUP 信号;使用 `setsid` 或 `(cmd &)` subshell 技巧,让进程在新会话中运行,从而脱离原终端。文章特别指出了一个关键差异:`nohup` 启动的进程父进程仍是原终端,而 `setsid` 启动的进程父进程会变为 init(PID=1),从根源上隔绝了信号影响。 对于已经提交的任务,文章也介绍了补救措施:通过 `Ctrl-Z` 挂起、`bg` 后台运行,最后用 `disown` 命令将其移出作业表,使其不再受 HUP 信号影响。这些方法各有简单的操作示例,非常适合临时任务或未预先规划的场景。 总的来说,文章系统梳理了从预防到补救的完整工具链,帮助你在不同情境下灵活选择,确保关键进程不会意外中断。

IT 2013-09-23 23:10:39 / 累计浏览 2,433

DRBD远程实时双机热备系统配置完全手册

这篇文章详细记录了作者重新搭建并配置DRBD远程实时双机热备系统的全过程。出发点很简单:几年前配过的环境已无法使用,于是决定完整走一遍流程,并将每一步骤记录分享。 内容以两台虚拟机为基础环境,从安装Linux系统、配置网络,到添加虚拟硬盘并分区作为镜像源,再到DRBD软件的安装与关键的配置文件(drbd.conf)编写,形成了一个清晰的操作链条。作者不仅给出了具体命令和系统输出,还穿插了如提前创建虚拟机快照等实用经验提示。 整个过程不空谈原理,而是通过一个实际可复现的案例,展示了如何构建一个数据实时同步的节点对。对于想了解或动手实践DRBD部署的读者,这篇手册提供了一个从零开始、步骤完整的配置蓝图,能够帮助读者快速建立对DRBD基础部署流程的认知。

IT 2013-09-23 13:54:28 / 累计浏览 3,474

关于sqlite的事务的使用

SQLite以读性能出色著称,但写入性能有时会让开发者头疼。这篇来自作者实践经验的文章,就从一个具体问题切入:批量插入500条小记录居然需要20多秒,异常缓慢。 问题的根源是什么呢?作者通过strace工具追踪系统调用发现,高达88.73%的耗时(超过27秒)都花在了`fdatasync`系统调用上,调用次数多达2064次。这正是因为SQLite默认的“每次写入都落盘”的安全策略所致,频繁的磁盘同步成为了性能瓶颈。 文章给出的解法很直接:使用事务。将多次写入操作包裹在一个事务中,使得数据能够一次性批量提交。优化效果立竿见影:`fdatasync`调用从2064次骤降至12次,整体耗时从27.6秒猛降到209毫秒,性能提升了百倍以上。 作者也进一步探讨了相关话题,比如无法批量操作时可选用的nosync版本,以及面对超大数据量时分批提交事务的考量。这篇文章的价值在于,它用非常实证的数据,清晰展示了SQLite写入慢的核心原因以及事务优化带来的巨大提升。

IT 2013-09-15 22:36:04 / 累计浏览 2,873

Nginx与Gzip请求

这篇讲的是Nginx如何处理客户端发来的Gzip压缩请求。作者从移动端同事的需求出发——为了节省流量和提升传输速度,需要让服务端解压缩客户端发送的Gzip数据。但Nginx自带的Gzip模块都是处理响应(Response)的,对于请求(Request)的解压缩并无直接支持。 文章详细探索了两种可行的技术方案:一是使用lua-zlib库直接解压;二是通过LuaJIT的FFI接口封装系统的zlib库来实现。作者不仅给出了具体的代码示例,还贴心地解决了在Linux环境下可能遇到的动态库加载路径不匹配的问题。最后,文章在PHP后端架构下进行了测试,对比了两种方案的性能,发现lua-zlib的效率反而略高于理论上更优的FFI方案。 核心结论是,借助OpenResty和Lua的强大扩展能力,可以在Nginx的access阶段灵活处理特殊的压缩请求,为异构系统(如PHP后端)解压数据,是一个高效且实用的解决方案。

IT 2013-09-07 15:23:36 / 累计浏览 2,009

数据的存储介质-磁盘的硬件特性

这篇技术文章深入剖析了机械硬盘的硬件特性,从基础构造讲到性能原理,非常适合需要理解存储底层机制的开发者。 作者从磁带机讲起,解释了磁盘如何通过电机旋转盘片、磁头移动寻道来实现随机访问,这个演进过程讲得清晰易懂。文章重点剖析了几个关键点:硬盘如何以“块”(通常为512字节)为单位进行读写,以及在异常断电时,系统如何通过在启动时清理未完成的数据块来保证数据的原子性,这是单机存储保证一致性的经典思路。 更硬核的部分在于对性能指标的辨析。文章厘清了 IOPS(每秒读写次数)、吞吐量(MB/s)和延迟之间的关系,并指出它们适用的不同场景:数据库更看重影响 IOPS 的寻道时间,而大文件存储则更追求吞吐量。作者还用“飞机运旅客”的比喻,巧妙地说明了适度增加延迟可以提升整体吞吐量的原理。 最后,文章总结了机械硬盘技术成熟、顺序读写性能好的优势,以及因机械结构导致随机访问性能下降的固有劣势。

IT 2013-09-07 15:22:50 / 累计浏览 3,393

数据的存储介质-磁盘的RAID

RAID作为存储领域的基石技术,其“分而治之”与“冗余复制”的核心思想,至今仍深刻影响着分布式存储系统的设计。这篇文章从数据存储的两个基本要素——通信管道与介质出发,清晰地拆解了RAID技术诞生的根本动因:通过合理组织多块磁盘,来突破单盘在IOPS与数据安全性上的瓶颈。 文章对几种经典RAID模式(RAID 0/1/5/1+0)的阐述并非简单罗列,而是抓住了它们的核心逻辑与权衡。例如,指出了RAID 0的并行读写优势、RAID 1的镜像成本,以及RAID 5通过XOR校验在冗余与空间效率间的折衷。特别值得玩味的是,作者点明了RAID 0+1与RAID 1+0在故障场景下的关键差异,解释了为何后者是更优的选择,并自然引申到GFS、HDFS等现代文件系统其实都采用了“先复制、再切分”的类似策略。 更深入一层,文章探讨了在单机环境下实现RAID时所面临的、类似于CAP问题的原子性写入挑战。它揭示了RAID卡如何利用“内存缓存+电池/SSD备份”这一巧妙而务实的方案来打破数据一致性的逻辑循环,既保证了性能,也解决了可靠性难题。文中对盘柜及新网络协议(如FC、iSCSI)的提及,则拓宽了读者对RAID物理实现形式的认知。 整体而言,这篇文章将RAID技术置于更广阔的存储演进史中,不仅讲清了“是什么”和“为什么”,更通过与分布式系统的类比,帮助读者理解了这一传统技术历久弥新的底层逻辑。

IT 2013-09-07 15:22:07 / 累计浏览 2,875

数据的存储介质-固态存储SSD

这篇讲的是SSD固态硬盘的性能内幕。作者抛开基础科普,直击几个核心痛点:为什么不同品牌的SSD读写速度差距巨大?为什么解决了磁盘寻道问题后,4K随机写仍是性能瓶颈?而所有问题的答案,最终都指向了一个关键角色——FLASH控制器。 文章从NAND闪存的底层特性说起,解释了SLC/MLC的区别、以及闪存“必须整块擦除”的特殊操作。正是这些硬件限制,导致了“写入放大”现象。作者指出,各家控制器处理垃圾回收、磨损均衡和写入策略的算法差异,直接造就了性能上的天壤之别。对于随机写瓶颈,文章分析了块回收跟不上写入请求时,延迟会从250微秒陡增至2250微秒的残酷现实。 最后,文章探讨了控制器放在专用芯片还是共享主机CPU上的不同路线之争,并展望了随着控制器算法优化和闪存成本下降,SSD将在高性能存储领域全面取代机械硬盘的趋势。读完能让人明白,SSD的水,远比“无机械结构所以快”要深得多。

IT 2013-09-02 13:30:13 / 累计浏览 3,670

关于Rsyslogd 的一些配置 (高性能、高可用 rsyslogd)

这篇讲的是作者公司日志传输服务器因带宽调整引发的日志堵塞实战。他们遇到的情况是,业务通过PHP syslog接口写日志时被“卡住”了,根源在于rsyslog默认配置追求“不丢任何数据”,但当传输链路异常时,队列堆积反而拖垮了业务。 排查发现,原有配置仅有基础传输逻辑,进程、队列、传输效率等关键参数全部使用了默认值。这种配置在理想环境下能运行,一旦出现网络波动或突发流量就暴露出问题。文章分享了如何通过调整队列参数来破解困境:例如定义`$MainMsgQueueFilename`和`$MainMsgQueueMaxDiskSpace`来控制磁盘队列大小,利用`$QueueHighWatermark`触发磁盘存储,并通过`$MainMsgQueueDiscardMark`与`$MainMsgQueueQueueDiscardSeverity`配合实现有策略的消息丢弃,避免业务被阻塞。 作者还附上了关键配置的截图和几份深入阅读的官方文档,特别是关于rsyslog队列机制的那篇。此外,文末也提及了RELP(可靠事件日志协议)等更健壮的传输方案,以及社区开发的syslog-safer工具作为补充。这是一次从故障现象到配置调优的完整经验梳理,对于使用rsyslog的日志架构很有参考价值。

IT 2013-08-26 23:04:20 / 累计浏览 2,150

闲扯Nginx的accept_mutex配置

这篇闲扯文章深入探讨了Nginx中一个常被忽略却影响吞吐量的配置——accept_mutex。文章从它的基本作用说起:启用时,新连接到达只会唤醒一个worker来处理,从而避免“惊群问题”;禁用时则所有worker都会被唤醒,虽可能导致性能损耗,但Nginx作者Igor Sysoev指出,由于Nginx的worker进程通常较少(几十个),惊群影响其实有限。 文中对比了启用与禁用accept_mutex的场景:启用更像“主动喂小鸡”,在资源稀缺时(如连接数少)高效且稳定;禁用则像“撒粮让鸡抢”,当访问量大时能提升整体吞吐量,尽管可能增加上下文切换(可通过sar -w观察)。作者引用Igor Sysoev的解释,强调这与Apache(动辄上百进程)不同,Nginx因进程少而更灵活。 基于这些分析,文章最终建议:对于高流量网站,关闭accept_mutex是值得考虑的优化选择,以平衡惊群风险与系统性能。整体从具体配置出发,用生动比喻和权威引用,提供了清晰的实践指导。

IT 2013-08-21 13:26:08 / 累计浏览 4,808

Linux内核协议栈对于timewait状态的处理

这篇文章从一次生产环境的运维问题切入,详细剖析了Linux内核从2.6.18升级到2.6.32后,系统TIME_WAIT状态连接数显著增多的根因。作者的核心工作是对两个版本内核的代码进行diff,精准定位到了`net/ipv4/inet_timewait_sock.c`文件中的一处关键变更。 问题的核心在于`inet_twdr_hangman`函数里,一行负责轮转回收槽位的代码`twdr->slot = ...`的位置被移动了。在旧版本中,无论当前槽位(slot)的timewait块是否被完全清理,该自增操作都会执行;而在新版本中,它被放入了一个条件分支,仅当当前槽位被成功清空时才执行。这个看似微小的时序调整,改变了内核回收timewait块的调度逻辑,最终导致了回收变慢和积压。 文章不仅给出了结论,更通过分析`inet_timewait_death_row`数据结构与`inet_twdr_hangman`的定时回收机制,完整还原了问题发生的底层路径。对于需要理解TCP连接生命周期管理,或是面临类似内核升级后网络连接数异常的工程师来说,这篇深入源码实现的排障手记提供了非常具体的思路和技术细节。

IT 2013-08-21 13:09:24 / 累计浏览 1,949

SSDB 配置文件

这篇讲的是如何理解和定制 SSDB 的配置文件。文章开篇就点明,默认附带的配置文件无需修改即可运行,但若需高度定制,了解其配置项就很有必要。 配置文件本身是层级 key-value 的静态格式,通过 TAB 缩进来表示结构,一目了然。文章逐一拆解了核心配置段:`work_dir` 指定了存放数据和日志的工作目录;`server` 段控制监听的 IP 与端口,出于安全考虑,可以将 IP 绑定为仅本机访问的 `127.0.0.1`;`replication` 段用于设置主从复制,明确了从服务器如何同步数据;`logger` 段管理日志级别、输出文件以及支持的大小轮转策略。 最值得关注的是 `leveldb` 段的配置。文章特别指出,`cache_size` 参数直接影响性能——适当增大缓存能提升读性能,但过大的缓存反而会拖慢写速度。这种基于实际使用场景的调优建议,对管理员来说非常实用。 总的来说,这篇文章将看似枯燥的配置文件讲解得清晰明了,不仅解释了“是什么”,还点出了“为什么”和“怎么调”,无论是初次接触 SSDB 的开发者,还是需要优化部署的运维人员,都能从中快速找到自己需要的配置要点。