每个萝卜下都隐藏一个坑。
前段时间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 的时候就要挂了。当然阿里云的好像更差。
个人完胜百度知道推广经验总结分享
在百度产品的推广过程中,总结了一些个人经验今天和大家分享。目前百度产品中推广产品主要是知道,百科,贴吧,空间,文库,收藏还有个即将成为主流的百度经验。这次重点分享下和信在百度知道的推广经验。在A5站长网,站长之家等主流原创站长网站上已经有非常多很成熟的方法,下面要分享的是和信个人关于实战完胜百度知道的方法和技巧
一是在回答问题的时候留下自己在百度其他产品的连接,这里分享下这个方法我是如何的操作。因为百度知道留外连越来越难,所以我们就有必要充分利用已经留下来的连接做二次利用。目前百度产品中容易留外连的是百度文库,百度经验(目前100%外链通过)。提示下百度空间的话建议就建议不要去做了,如果被人举报面临账户空间全站被K,还不如用来养养权重,让空间最后为链轮建设做个贡献。通过文库和经验以及以前做过推广的知道地址留连接,工作效率就很高了。
二是通过其他主流平台和媒体留下带有网址的连接,高权重的网站容易得到百度的认可。推荐在留此连接的时候注意切换Ip和账户,虽不是直接留外连,但是却不得不防他人举报。
三是直接留网站或者产品的品牌名称,越简单越好,这样广告嫌疑就小,比如有人问做现货黄金哪个网站好,如果直接留网址那就是非常失败的举动,但是如果你直接回答“百度搜索007理财网”,那么这样的回答只要我们做个自问自答,也会有个非常不错的效果,所
以回答的时候尽量避免有广告嫌疑,力求点到为止。
四是在回答的问题前增加百度产品虚假前置,这个方法一是给百度搜索一个虚假信息,二是给阅读者一个假象,如果推广的网站确实非常具有用户粘性,这样的IP导入无疑也是非常有用的,总之是可行性较高,直接点击跳转到你的网址。但是建议问题和答案内容不要太赤裸裸,否则容易被人举报。(小贴士:推一把网络营销论坛,网络营销推广人士学习交流的社区)
五是做热门事件方法和技巧。关于这个如果网站有这样的频道的话就会比较理想,但是做这个事件的时候,一定要及时。比如之前的日本地震,如果能够在第一时间网站先发一篇新闻稿,新闻稿及时更新内容。接着通过团队在百度知道进行自问自答,这个问题上建议回答留外连的时候要迅速点,这样有两个好处:是增加这篇文章的反连,其次是如果能够成为第一个回答者,我们就大没有必要冒着被人举报的嫌疑选为最佳答案。请记住推荐位最佳答案的目的就是让更多的人看到并点击进入,仅此而已,所以建议越热门的事件做的人越多,我们的链接就越不能成为最佳答案,大不了多做几个。还有热门事件的百度知道问题一定要快,就比如日本地震问题,赶早的Ip随便就成百上千,赶晚的就一个IP都没,因为百度屏蔽了,杯具吧。
服务器故障之运维经验总结作为一个运维人员,遇到服务器故障是在所难免的,要是再赶上修复时间紧、奇葩的技术平台、缺少信息和文档,基本上…
每个萝卜下都隐藏一个坑。前段时间955短网址日重定向次数最高达400万,主要开销是重定向请求的用户数据储存与分析。分别经历了内存瓶…
网站运维之道关于可用性这是前一段时间投稿给程序员的一篇文章标题中的quot道quot有些大了您可以理解为quot门道quot的qu…
运维工作心得总结运维工作直接关系到应用系统运行的正常稳定,但运维工作纷繁复杂,正规化、系统化相对比较弱,如何改变这种现状?从众多的…
运维服务工作总结至20xx年底银海科技有限公司在蓝湾科技有限公司的运维又届满一年的时间了在这为期一年的运维工作当中运维的业务飞速发…
一个房地产策划师的经验总结分享给需要考房地产策划师证书的同学一个房地产策划师的经验总结作为房地产策划人,必须具备房地产全程策划的能…
20xx.05.29班级烧烤总结(24人标准)一、材料(大部分物品在革新地下市场购买)牛肉:全部买牛肉粒,不买牛柳,共7斤鸡翅:3…
首先我们说说:什么是个人投资理财投资理财可分为个人投资理财、家庭投资理财和公司/机构投资理财等。无论哪一种投资理财,其目的是基本一…
发布人:圣才学习网发布日期:20xx-09-1117:24共4012人浏览[大][中][小]总结一下,货币银行学占题目比重较大,国…
玩热血海贼王有两个大方向:一种是有大量的时间跟耐心.那你可以不充任何钱.这只有在这游戏能这样.我玩过狠多游戏.但坑钱的太多了.比较…