http://www.infoq.com/cn/news/2012/11/dropbox-scale-bestpractice

Dropbox的运维工程师Rajiv,跟大家分享了可伸缩性设计的最佳实践第一讲。众所周知,Dropbox是一款非常易用的网络存储云端产品,现已达到40,000,000的用户。令人惊奇的是,Dropbox公司对于服务器集群的运维人员投入在一到三个人。Rajiv就系统的可伸缩性设计,尤其在资源有限、流量快速增长的情况下,将最佳实践分享给大家。

Run with extra load(通过额外加载发现系统故障)

在生产环境最常用的一个技巧就是,人为制造一些额外的数据进行加载。举个例子,生产环境常常针对缓存服务器进行额外的数据读取加载(Memcached Read),如果缓存服务器down机,运维工程师就可以马上切断流量进行故障排查。为什么不能事先计划好,而是采用一种”通过加流量试错”的方式发现系统的问题呢?答案是:从长时间积累的运维经验来看,引起系统故障的原因范围太大,而且常常是突发性的,无法通过监控实时捕获。另一点需要注意的是,尽量不要模拟数据写入加载,这会破坏生产环境的数据一致性以及导致无法控制的锁竞争。

App-specific metrics(面向具体应用的度量图表)

针对特定应用,汇总不同类目集群所定制的数据统计图表变得越来越重要。一般现有的图表监控都是针对具体某一类数据(CPU, Mem, IO等),将各个维度的统计数据汇总到一个图表的需求很迫切。Dropbox的解决方案是充分利用memcached(缓存服务器),cron(后台计划任务管理)以及ganglia(集群监控管理)三方的功能:每当有统计数据是我们想要的,会将该数据存到线程安全的内存块里面,每秒钟内存块里面的数据都会发送到缓存服务器,以时间戳作为Key存储。每分钟,缓存服务器的统计数据会被清除、汇总、发送到集群监控服务器。举个实际的例子,下面是生产环境中最好用的图表:

图1:系统响应时间度量图表

横轴是时间段,纵轴是站点服务器响应时间,响应时间分五段(MySQL Query, MySQL Commit, RPC’s, Memcaced, CPU),我们很容易看出在1:00左右,有根很长的刺,由MySQL Commit所导致。实际图表响应时间不仅仅只有五段,很多因素被剔除了,都包含在”CPU”里面。

Poor man’s analytics with bash(善于利用bash脚本分析系统问题)

熟练运用bash shell可以很大程度提高工作效率,举个例子,现有服务器端的日志,想从中提取最近某个时间段内流量的波峰是否超过阈值,当然现有的服务器图表可以满足大部分的需求,但很多系统的数据实时性不高(一到五分钟更新一次数据)。面对ad hoc需求,可以使用如下脚本:

Apr 8 2012 14:33:59 POST ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:01 POST ...

cut -d’ ’ -f1-4 log.txt | xargs -L1 -I_ date +%s -d_ | uniq -c | (echo “plot ‘-’ using 2:1 with lines”; cat) | gnuplot

上述命令会将现在的系统状况以图形化的形式表现出来。

Log spam is really helpful(垃圾日志还是帮得上忙的)

垃圾日志并不是说一无是处,很多时候,它帮了我们大忙。垃圾日志其实可以作为跟踪代码的一种方式,举个例子,一段代码逻辑如果在正常情况下会打印”FUUUCCKKKKKasdjkfnff”的字符串,那么在出问题的时候我们可以根据日志找到问题的源头。日常的运维工作常常会维护两份日志文件,一份干净的日志文件,一份填充着垃圾日志的文件,它常常会不经意的帮到我们。

Keeping a downtime log(记录故障日志)

记录故障日志是一个很好的习惯,记录故障的开始、结束时间以及故障的原因,过后通过分析故障日志我们可以很客观的判断如何最小化故障发生的时间。每个故障发生的原因不尽相同,而每个故障的解决方案也不一样,将故障详情记录下来确实是一个明智之举。

UTC(使用世界标准时间)

一定要使用世界表尊时间,不管是服务器时间还是数据库时间。很多系统对于非UTC时间的处理很不好,这会带来很多问题,切记在呈现给用户数据之前做时区转换。

Technologies we used(我们使用的技术)

很多朋友对于Dropbox使用什么技术非常感兴趣,我们来列举下我们使用的技术:

1) 开发语言使用Python

2) 数据库MySQL

3) Web框架Paster/Pylons/Cheetah

4) 亚马逊云服务S3/EC2存储文件

5) memcached用来减小数据库的压力,以及用来处理内部系统的协作

6) ganglia做集群监视管理以及生成定制化监控报表

7) nginx做前端服务器

8) haproxy做web服务器负载均衡

9) nagios做内部服务器的健康检查

10) Pingdom做外部服务的监控

11) GeoIP 用来将IP转化为地理位置

上述选择的技术是业界标准,没有什么新奇,最大的原因是可靠、风险低。即便是memcached这么通用的技术,都存在一些令人头痛的bug,选择太新的技术会让事情变得复杂。我们对于技术选型的建议是,尽量选择轻量级的、业界知名公司都在使用的技术,当然也可以花时间成为该项目的”技术先驱”。

The security-convenience tradeoff(系统安全和用户体验的权衡)

为了保护用户文件信息,系统安全对于Dropbox非常重要。但增加安全性,不管对于用户还是程序员,都会造成不方便,举个例子:很多网站在用户输入错误的用户名或者密码的时候,提示说您有一项输入错误,但不会告诉你具体是哪个。这种安全性策略,大大减小了破解用户名、密码的概率,但对于那些在不同网站都使用不同用户名的用户,会带来一些麻烦。

在内部服务器集群设置防火墙,是一个很棒的想法,但在实践中,对于互相没有通信的服务器集群可以省略此步骤。最常用的隔离,一般针对的是搭建在内部网络的第三方论坛,它更容易遭到攻击。

我们的安全策略可能有些争议,但系统安全都是对用户行为的假想和抽象,很多系统甚至是银行系统,都存在很大的安全隐患,所以在对系统做安全性投入的时候,先想一想这些工作是不是那么的必要。

对于运维技术感兴趣的读者朋友,可以关注Rajiv博客,或者通过邮箱rajiv.eranki@gmail.com与作者联系

Dropbox可伸缩性设计最佳实践分享的更多相关文章

  1. 来自Google资深工程师的API设计最佳实践

    来自Google资深工程师Joshua Bloch的分享:API设计最佳实践 为什么API设计如此重要?API是一个公司最重要的资产. 为什么API的设计对程序员如此重要? API一旦发布,出于兼容性 ...

  2. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  3. Atitit 词法分析器的设计最佳实践说明attilax总结

    Atitit 词法分析器的设计最佳实践说明attilax总结 1.1. 手写的优点:代码可读,对源代码中的各种错误给出友好的提示信息,用户体验高,1 1.2. 使用状态表比较简单,dfa比较麻烦1 1 ...

  4. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  5. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  6. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  7. RESTful API 设计最佳实践(转)

    背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...

  8. RESTful API 设计指南,RESTful API 设计最佳实践

    RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...

  9. RESTful API 设计最佳实践【转】

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,后面API和RESTful API 一个意思)如何设计的文章,然而却没有一个“万能”的设计标准:如何鉴权?API格式如何?你的API ...

随机推荐

  1. UVA 11389 The Bus Driver Problem

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82842#problem/D In a city there are n bus ...

  2. @RestController

    /* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Vers ...

  3. XML (DOM解析) 看看就行

    000000000000000000000000000000000000000 ------------------------------------------------------------ ...

  4. Demon_游戏登录界面(具备账号密码输入功能)

    using UnityEngine; using System.Collections; using UnityEngine.UI;// public class LoginButton : Mono ...

  5. ASP.NET MVC3调用分部视图-PartialView的几种方式(集)

    我们的网页通常会有好几个部分组成,一些公共的区域我们通常会做成PartialView(部分视图),但这些视图并不是完全固定的,所以还是需要 特定的Controller来控制.如果只是静态的html,虽 ...

  6. 初学者学Java(十五)

    再谈数组 在这一篇中我们来讲一下关于数组的排序和查找的方法. 排序 说到数组的排序,就不得不说冒泡这种经典的方法. 1.冒泡排序 冒泡排序的基本思想是比较两个相邻元素的值,如果满足条件就交换元素的值( ...

  7. VSS Get Latest Version 没有提示recursive的对话框解决

    今天按照VSS使用时,当“Get Latest version”时,不小心勾选了 “Only show this dialog when the Shift key is down”,因此当我再“Ge ...

  8. Meth | apt-get update ,upgarde 和dist-upgrade 的区别

    #sudo apt-get update 获得最近的软件包的列表:列表中包含一些包的信息,比如这个包是否更新过#sudo apt-get dist-upgrade 如果这个包没有发布更新,就不管它:如 ...

  9. Unix系统解压tar包时出现@LongLink错误

    Unix系统上使用tar命令解压tar包后,多了一个@LongLink的文件,并且原来的tar包解压后不完整.网上查了下,原因是AIX系统上tar命令自身的一个缺陷.解决办法:把该tar包上传到lin ...

  10. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...