首页 > 经验 > 关键词  > SegmentFault最新资讯  > 正文

一个萝卜一个坑:短网址开发运维经验总结分享

2013-09-09 10:14 · 稿源: segmentfault

每个萝卜下都隐藏一个坑。

前段时间955短网址日重定向次数最高达400万,主要开销是重定向请求的用户数据储存与分析。分别经历了内存瓶颈、IO 瓶颈后,高峰期达到 CPU 上限,几乎榨干了机器,下文是经验总结分享。

前置条件

由于短网址很难盈利,硬件特别寒碜,带着镣铐跳舞反而别有风味,当然,人力投入,技术方面也不能和其他大网站比,所以如果要拍砖请轻下手——哎哟。

我们采用的硬件: 盛大云微型,1G内存,单核共享型 CPU。 后期追加了一个同等配置的内网机器做 MongoDB replSet。

Startup 硬件成本:

既然项目本身基本没法带来收益,要生存就只能充分压榨硬件,大胆使用新技术。根据国内云的计费方式,一般收费的维度是

内存:使用异步模式代替同步多进程。

带宽:2M双线,301并不需要太多的带宽开销

硬盘:云硬盘,按容量收费

CPU:单核

由此我们做了对应的技术选型:

Nginx:无需多说了吧?

Tornado:Facebook 开源的 python异步微框架

MongoDB:性能好,热数据少内存开销也少

Redis:事实上 MongoDB 写入的 IO 开销太大

nodejs(with coffeescript):后期新增,node.js 是天生的异步

supervisord:监控进程

来照张相——咔嚓

开发与运维

既然目前项目投入的开发和运维都只有我一个人,那就可以美其名曰:DevOps 啦。听上去是不是很高端大气国际化。

用户特点

二八法则基本适用:20% 的 URL 占用了 80% 的资源(尤其是我们默认为所有短网址开启了统计之后)。

监控先行

很多小团队犯的第一个毛病就是不做监控,等到用户来告诉你网站无法打开的时候就太晚了。为了省事我们用了监控宝和阿里云监控(主要阿里云监控有免费短信)。

每次出现无法打开网站的状态时,都应该定位此次问题的原因。如果频次增加,就要考虑应对策略了。loadavg 很好地反应了系统的负载,可以判断是否硬件出现瓶颈。

如果是在事发时间,我们可以借助这些工具查看系统状态:htop(定位哪个进程的问题)、iftop(是否有异常的流量和ip)、iotop(定位 io 瓶颈)。此外就是看日志。

如果事发时在睡觉,那么就看监控历史记录。

惨痛教训一:硬盘容量——为将来留下后路

MongoDB在硬盘容量不够的时候会拒绝启动。而如果之前没有使用 lvm 这类工具,将无法快速扩展容量,而国内的云不像 linode 那么智能地在后台提供容量的一键 resize(虽然这个功能曾把文件系统搞出错了)。后果很可能是停机几个小时。

惨痛教训二:最大打开文件描述符

异步模式下不可避免遇到新问题——最大打开文件描述符。我们先后遇上了 tornado 和 nginx 的最大打开文件描述符问题。 tornado 的表现为:CPU 100%,日志里出现500;Nginx 则在日志里报错,打开缓慢。

要避免此类问题,要做相应 ulimit 的设置。

用ulimit -n显示的只是当前会话的(!important)。正确做法是查看进程的 limits: cat /proc/{$pid}/limits

Nginx 的配置文件里还需要设置两个参数:

worker_connections9999; #根据自己的情况设置

worker_rlimit_nofile 60000; #根据自己的情况设置

下图是 nginx 达到上限的监控图,很明显被卡在1000左右了 —— linux 默认限制为 1024。

惨痛教训三:Python 不是天生异步的语言

说实话,用 Python 来设计的过程可不是一个愉快的过程。为了避免潜在编码问题,我们使用了 python3。下面的问题是:

缺乏异步的支持:

Redis 异步驱动只支持 Python2(当然,等了大约半年后 tornado-redis 的作者终于更新了对 python3 的支持)。

不少组件仍然无法支持 python3, pip install 后直接报错的感觉就是:傻眼了。 Bitly 的 asyncmongo 简直是没有文档,最后只能选了 Motor。

Tornado 本身的文档也不够详尽

后来一部分组件使用 nodejs 开发后,简直是相见恨晚,Coffeescript 语法糖的表现也很出色。

惨痛教训四:谨慎选用数据库

数据库几乎是web应用里最关键的一部分,越是有大局观的技术人员越会谨慎选型。 事实上我们把所有压力都放 MongoDB 的做法还是过于激进了。

MongoDB 的范式化与反范式化。

几乎所有对 MongoDB一知半解的人都会告诉你不要用 SQL 的思维来思考 MongoDB,要使用内嵌文档来实现需求。但是他们忘记告诉你,不断增长的内嵌文档将导致 IO 瓶颈(参考《深入学习 MongoDB》73页)。

事实上范式化和反范式化(内嵌文档)还有很多要考虑的因素。

复杂查询时 MongoDB 的无力

在面对需要计算的查询时,MongoDB 的 map-reduce 很慢;复杂情况下对内嵌文档处理有难度;Documents 比 MySQL 更少。年轻人,不要在 mysql 遇到问题时第一时间想到替换数据库。

就这个项目而言,统计部分要快速出多样报表时明显有难度。

不要等到着火了才想起 MongoDB replSet

如果 MongoDB 写入压力大,并且没有做分片,那么单纯加机器不会缓解写入压力。如果是读取压力倒有所帮助。

从单机到 replSet 起码需要锁住数据库。程序代码也需要修改。打算切换到 replSet 的话,需要提前做准备。

最后我们的做法是将频繁更新的数据放 redis,定时刷入数据库,效果很明显。

正确使用 Redis

控制内存,控制起步成本

如果你打算省钱的,就不要把所有东西都放 Redis 里,哪怕看上去数据量不大——时间久了也占了不少内存。而在 MongoDB 里只有热数据占内存。 二八法则也适用这种情况:热数据只占20%。

当然如果你是土豪请你走开!

不要用 pub/sub 做队列

如果不想丢失数据就不要用 pub/sub 做队列。进程重启时将丢失订阅管道的信息。你可以用 lpush 和 brpop 来实现队列。

受够盛大云了

内网主机完全不能访问外网。你想 apt-get update 下?临时买带宽吧。

被 DDOS 攻击?直接断网,没有任何通知,你还百思不得其解。

io性能太差,读写大约 5-6M/s 的时候就要挂了。当然阿里云的好像更差。

最后的忠告

「年轻人啊,要多读书多看报,多思考多学习」——万峰

看到这里肯定有不少人想喷我了,来吧,我的微博是: @dai-jie ,有错我改,我改……

举报

  • 相关推荐
  • IT 运维效率跃升:向日葵自动分组策略破解千台设备管理难题

    文章介绍了企业引入商用远程控制方案的需求,重点分析了向日葵远程控制企业版新增的"统计报表"和"自动分组"两大功能。统计报表功能可集中查看企业远程控制使用情况,包括成员远程次数、设备被控情况等数据,支持时间筛选、TOP100排名查看及数据导出。自动分组功能通过设置设备名称、备注等规则实现设备智能分类,大幅提升IT管理效率。这两项功能旨在帮助企业更高效地管理远程控制设备,满足企业对高频次、多设备远程管理的需求。

  • 小红书“歹物”分享爆火,年轻人为何迷恋反向种草?

    ​最近,小红书上刮起了一阵“歹物”分享的风。 事情还要从创作者@这辈子再也不上班 的突发奇想说起,她们发布了一条吐槽视频,对象是那些年用过的“很好用,但又十分歹毒,让人又爱又恨的东西”。 这条笔记在小红书上获赞超46万,引发无数网友的共鸣和好奇,此后更是有无数创作者加入到“歹物”分享的行列里。

  • 融合数据中台与动态调度:林剑峰在共享出行智能算法开发中的技术探索

    本文讲述了林剑峰在智能出行领域的十年深耕历程。作为系统工程师,他主导构建了融合数据、算法与规则引擎的智能调度体系,通过动态聚类和路径规划模型显著提升了共享单车调度效率。其创新包括分级围栏模型、嵌入式调度判断模块等专利技术,实现了跨区域精准调度和系统自主运行能力。数据显示,他推动的系统使车辆调度效率提升37.38%,异常识别准确率显著提高。林剑峰的工作体现了"技术+业务"的系统设计理念,为城市智能交通建设提供了可借鉴的技术范式。

  • 颖儿分享割胆手术经历 医生提醒:需规律饮食 重视体检

    据报道,知名演员颖儿在社交平台上发表长文,记录了自己从发现胆结石到接受胆囊切除手术的全过程,并分享了术后感悟与健康提醒。 颖儿表示,她之前体检时查出胆结石,初期未引起重视,因畏惧手术选择了保守方案,但在6月底拍戏时突发剧烈腹痛,最终不得不接受切除手术。 她建议大家定期体检,如果体检发现胆结石,但这时候石头还小,小于1厘米以下也一定要重�

  • 雷军宣布7月2日返场直播:分享YU7上市背后故事

    雷军今天发文称,小米YU7发布以来,媒体和用户朋友们在试驾后给出了很多好评,锁单也远超预期,诚挚感谢朋友们的支持和厚爱。” 同时宣布,将于7月2日晚8点进行一次返场直播,分享YU7上市背后的故事,也集中回答一下大家关心的一些问题。 小米YU7上市后已经成为市场上最火爆的车型,开放购买3分钟大定超20万辆,1小时大定超28.9万辆,18小时锁单量突破24万台。

  • GOPS 2025北京站|联想智能云CloudOps专场圆满收官,五大技术议题点燃智能运维新思潮!

    第26届GOPS全球运维大会上,联想智能云CloudOps专场聚焦企业智能化转型,探讨大模型时代下的智能运维实践。联想提出双AI引擎架构:智能分析平台和IT运营智能体xSpark,实现运维流程自动化,提升效率40%。专家分享企业级LLMOps平台设计理念,强调大模型全生命周期管理的重要性。此外,联想FinOps方案通过可视化云资源、精细化成本分摊,助力企业降本30%。会议还展示了跨区域�

  • 日本末世预言仅剩1天 赴日航班减少离日旅行增加 日本民众分享“最后一天”

    距离日本漫画家龙树谅在《我所看见的未来》中预言的2025年7月5日大灾难”仅剩最后一天,该预言称将发生比日本大地震规模大三倍的海啸。 尽管科学界普遍质疑,这一预言仍在日本社会引发连锁反应。 部分航空公司已悄然减少赴日航班,离日旅行增加。日本国土交通省相关人士证实了这一趋势。 与此同时,日本民众仍保持常态。有网友晒出工作照表示公司不放假,该上�

  • 雷军回应小米YU7销量爆单:自己看了好几遍销量数据才敢分享

    今日晚间,小米董事长雷军开启返场直播,详细介绍了小米YU7的订单、交付情况。 雷军回应YU7的销量火爆:其实在YU7发布前,我是非常担心的,人们都说我凡尔赛,有什么可担心的?我当时在想的有三点。 首先,SUV市场很大但竞争很激烈,ModelY比大家想象的要强大很多,连续多年全球销冠,国内厂商一波又一波冲击却都没能撼动Model Y,小米YU7能做到吗? 其次,YU7是一款不�

  • 主流AI多模态大模型有哪些?超全的多模态大模型指南分享

    2024年多模态大模型成为AI领域最具前景的技术方向之一。文章全面分析了主流多模态大模型的特点、应用场景和发展趋势。多模态大模型能同时处理文本、图像、音频、视频等多种数据,实现更智能的人机交互。重点介绍了GPT-4V、Claude3.5、Gemini、通义千问等代表性模型,对比了它们在视觉理解、编程能力、中文处理等方面的优势。应用场景涵盖智能客服、内容创作、教育医疗等领域。未来发展趋势包括模型规模扩大、支持更多模态、实时交互能力提升等。选择模型需考虑应用需求、语言支持、性能成本等因素。

  • 华为回应《原神》鸿蒙版何时上线:正进行鸿蒙5的开发适配

    日前,华为终端BGCEO何刚微博发文,称鸿蒙5上架了很多游戏,我也要下载体验一下。 有网友在评论区留言询问:《原神》啥时候上线? 对此,华为终端客户服务表示,华为正与应用开发者进行HarmonyOS 5的开发适配与技术沟通工作,因体量、功能差异不同功能的适配周期和进度不同,可以尝试在应用市场我的心愿单中添加心愿。 一旦应用上架,应用市场将会第一时间通过通知