Evernote架构摘要 – A Digest of Evernote’s Architecture (*)

前言:

这篇文章我最近研究小规模分布式系统时,在Evernote博客中发现的惊喜,里面大体介绍了Evernote后台的架构。虽然是一篇科普文没啥干货只有思路,但还是感触,老美的企业还是很有分享精神的(虽然据说Evernote正在走下坡路吧)。为了分(练)享(习)给(计)更(算)多(机)的(英)同(语)学,我选择翻译这一篇文章A Digest of Evernote’s Architecture (*)。翻译用的语调十分诙(dou)谐(bi),希望搏大家一笑的同时,能给大家带来知识。

evernote-highlevel-architecture1

让阿拉(译者:沪语的咱们)从这张简陋的Evernote服务物理构造概览开始。俺不想深入地说这张图里每一个组成部分的众多细节;俺们会计划在之后的文章中讨论这些有趣的点。

坐在图片的左上角的你是活动的起点,所有的统计数据截至2011年5月17日的…(译者:呵呵)

网络系统:差不多所有从Evernote进出的数据流量是通过HTTPS的443端口来到www.evernote.com的。这包括所有的“网络”活动,也包含所有通过俺们基于ThriftAPI的客户端同步事件。总得加起来,每天这些活动要产生1.5亿次HTTPS访问,峰值速率差不多是250Mbps。(俺们的凌晨运维团队脸很黑,太平洋时间每天凌晨6:30是流量高峰的来临时间。)(译者:中国是UTC+8时区,太平洋时间是UTC-8,这么算起来差不多北京时间22点达到流量高峰,啊哈哈哈原来Evernote码农睡不了懒觉是我大中华区的锅。)

俺们通过边界网关协议来引导由俺们的主运营商 (NTT) 和次运营商 (Level 3) 提供的专线网络流量。这些流量透过Vyatta路由器走向A10负载均衡器,这些全新的负载均衡器是一月份部署的,因为俺们旧负载均衡器的SSL表现出现了瓶颈。当前,俺们用一台AX 5000加上一个故障转移盒子就可以很爽地处理现在的流量,不过未雨绸缪的俺们正准备测试分布式N+1配置,以准备未来的流量增长。

Shards:Evernote的核心服务是由一大堆的服务器提供的,俺们管它们叫”Shards”。(碎片渣渣)每个Shard(碎片)处理一大伙差不多是100,000个Evernote注册用户的所有数据和流量。(web的和API的)从俺们有了超过九百万用户开始,这些数据流量被分配给了差不多90台Shard。

在物理上,Shards是部署在一组SuperMicro牌的机器上的,这些机器的配置是Intel四核处理器,大得很的内存和塞满了硬盘架的希捷RAID镜像硬盘阵列。在这些机器上,俺们运行了一个基础的Debian系统服务来管理两个Xen虚拟机。主虚拟机运行着俺们的核心程序栈:Debian + Java 6 + Tomcat + Hibernate + Ehcache + Stripes + GWT + MySQL(存储数据元) + 分层文件系统(存储文件数据)。(译者:这都是些啥。。。)

所有在一台机器上主虚拟机里的用户数据,会通过DRBD(Linux平台的分散式存储系统)同步复制到另一台机器上副虚拟机里头。这意味着,每一个byte的用户数据都至少分布在2台物理服务器的4块不同的企业级硬盘里,加上每晚上的定期备份。一旦俺们发现某个服务器出现了问题,俺们可以通过Heartbeat这个黑科技进行故障切换,将主虚拟机切换到那台副虚拟机上,宕机时间短得一笔。

因为每个用户的数据是完全位于一台虚拟Shard机上的,所以阿拉可以将每一个Shard作为一个孤岛,事实上没有干扰或是附属关系。这意味着,一台Shard上的问题,不会滚雪球一样地影响到其他的Shard。

为了将用户和他对应的Shard连接起来,俺们在开发负载均衡器上花了很多的心思。负载均衡器通过一大串的规则,在URL或者cookies里寻找这个用户的Shard。

用户存储:虽然大量的主要数据是存储于笔记仓库Shards里的,但是所有用户都共享唯一的一个主「用户仓库」账号数据库(也是基于MySQL的),其中包括每个账户小规模的信息,例如:用户名,密码的MD5,还有这个用户所对应的Shard编号。这个数据库足够小,以至于能够跑在内存里,不过俺们会结合RAID镜像、通过DRBD复制到备用服务器、并且每晚备份的方法,来保持高的冗余度。

AIR数据处理机:为了让你们看到图文并茂的笔记,俺们维护了一个拥有28台服务器的服务器池,这些服务器夜以继日地用它们8颗核心处理新图像。在繁忙的日子里,这些服务器将转换130万到140万个分散的图像。目前,这些服务器是Linux和Windows混着跑,不过既然俺们已经移除了一些麻烦的遗留依赖(估计是说Windows),俺们打算在这个月底之前将所有的服务器都运行Debian操作系统。

这些服务器正在流水化运行由俺们的R&B研发猴子团队开发的”Advanced Imaging and Recognition”(AIR)「高级图像和识别」(不是空气,也不是Adobe AIR)。这个软件清理【优化?】每一张图片,识别看上去像文字的区域,然后通过「识别引擎」根据列表匹配每一个字的含义。这套系统里的引擎,是由俺们在这方面的精英团队开发的,吹个牛逼举个例子,俺们的手写识别技术,可以和业界最佳的同行们的商业许可技术软件相媲美。

其他服务:每台服务都被俺们处心积虑想方设法地塞进一对专用的盒子里,然后放到俺们位于加州圣克拉拉市的数据中心里。除了为俺们提供核心服务的硬件以外,俺们还有差不多由一到两台刀片(刀片服务器)组成的服务器组或是Xen虚拟机用来运行一些轻量级服务。比如,俺们的「收件服务」SMTP入口是由一对运行着Postfix的Debian服务器负责的,然后俺们的自定义Java邮件处理进程是基于Dwarf搭建的。俺们的@myen Twitter入口是跑在内部运行的twitter4j进程上。

俺们所有的网站都是Apache的,俺们的博客学习Dick Wu是用的WordPress(逃,俺们几乎所有的备份接口切换是有惠普提供的(译者:这段翻译不是很会,贴上原文most of our fully redundant internal switching topology is from HP),俺们用Puppet来管理配置,俺们的监控服务是由ZabbixOpsviewAlertSite提供的。俺们每晚会进行异地数据备份,这些备份数据将会通过1Gbps的宽带传输到另外一个数据中心。

等等,可是为啥?俺意识到,这篇文章明显留下了许多问题:关于为啥俺们在许多地方选择X而不是Y?为啥俺们用自己的服务器而不是用阿里云?为什么用这么闷骚老旧的软件(Java, SQL, 本地存储等等)而不是新的黑科技?(译者:原文是魔术子弹)…

俺们会努力在接下来的几个月里透露这些问题的细节。

(*)2011年6月29日更新:在Conde Nast童鞋的要求下,文章的标题改成现在的了。原来的标题是《架构摘要》。

我是猪脚[2]——在VirtualBox中安装Ubuntu

根据杨老师程序设计基础课的要求,大一的学弟学妹们都需要安装或者虚拟一套Linux操作系统。所以就有了我和@Jimmy Zhou开了这一个我是助教系列,这是这个系列的第二篇文章

一、配置VirtualBox运行环境

首先我们要打开VirtualBox,点击新建。

ubuntusetup1

接下来就是给这个虚拟机取名,我给它取名Ubuntu,大家爱怎么取就怎么取~然后选择类型为Linux,版本是Ubuntu(64Bit)。当然,下载32位或者没有开启IntelVM的同学只能选择Ubuntu(32 Bit)。

ubuntusetup2

接下来是给虚拟机君分配内存。因为我有8GB物理内存,所以就给了虚拟机2GB,实际上1GB足矣,512MB也够用。

ubuntusetup3

 

分配完内存之后,就是创建虚拟硬盘。

ubuntusetup4

 

选择创建以后,选择VDI。其实VMDK VHD啥的都行。如果用VHD的话,还可以做到开机引导。由于是启蒙教程,所以我们就用最简单的VDI吧。

ubuntusetup5

分配大小的话,当然是动态分配啦,这样的话虚拟硬盘文件就会按照硬盘大小自动适应,而不是一下子占用10GB存储空间。

ubuntusetup6

接下来就是选择VDI文件存储的位置,点右边的小文件夹图标,选择存储位置(最好不要是C盘,尤其是SSD用户。。。土豪请忽略这句话)。

ubuntusetup7

 

就像这样。

ubuntusetup8

我给它分配了10GB的硬盘空间,如果你觉得10GB不够用的话,尽管分大好啦,反正是动态分配的容量。

ubuntusetup9

创建完成后,我们会发现VirtualBox的左侧新增了一个虚拟机,我们右键它,选择设置。

ubuntusetup10

首先进入系统配置,主板选项卡。主要是把软驱前面的勾去掉,然后把光驱挪到第一启动位。

ubuntusetup11

处理器标签可以设置多处理器。我这里选择了4个处理器,其实一个处理器也够用了。

ubuntusetup12

显示设置,显存当然要给到最大,不然的话图形界面会卡死。

ubuntusetup13

然后是存储设置,我们需要分配Ubuntu的安装光盘镜像。

ubuntusetup14

点击分配光驱右侧的光驱标志,然后选择一个虚拟光盘。

ubuntusetup15

找到教程[1]中下载的Ubuntu Kylin安装镜像。选中之后,存储树显示成这样就说明安装光盘已经塞进虚拟机了。

ubuntusetup16

网络设置用缺省的NAT就行。当然在后续的教程里,我们是需要再配置这一个模块的。

ubuntusetup17

确定完成所有设置之后,进入下一步,安装Ubuntu。

二、安装Ubuntu

双击VirtualBox主页的虚拟机,虚拟机君就会开心地运行了。缓慢的加载之后,终于出现了Ubuntu的欢迎界面。

ubuntusetup18

在这一步需要勾选安装第三方软件,否则的话一些闭源的软件是没法用Ubuntu的软件市场安装的。

ubuntusetup19

然后会问你用什么方法安装,虚拟就是任性,清除整个磁盘并安装啦!如果勾上Use LVM的话,以后还可以任意扩充分区容量啦,所以果断勾选LVM。

ubuntusetup20

然后安装程序会傻傻地问您在什么地方,别看咱们离上海这么远,定位上海才是正确的(或许是Ubuntu认为中国首都是上海吧),然后继续。

ubuntusetup21

接下来是选择键盘布局,俺们就是汉语键盘啦。别告诉我有用法语键盘的。。。

ubuntusetup22

您的姓名按照爱好填,用户名按照爱好填,密码需要设置。这和Windows的安装是差不多的。一定要设置密码哟!

ubuntusetup23

然后虚拟机就开始勤劳地安装了。它会很慢很卡,现在你可以去上一节课或者睡一觉,醒来说不定分就安装好了。

ubuntusetup24

安装完成提示重启。注意如果卡在一个黑屏,并且让你remove any disk to restart的话,只要按下回车就可以重启了。

ubuntusetup25

 

重启以后看到了登陆界面,当然是要用刚刚设置的密码啦。

ubuntusetup26

然后你就会吐槽。这个屏幕好小啊!!!好坑爹啊!所以我们需要在虚拟机窗口点击设备,然后安装增强功能。

ubuntusetup27

然后Ubuntu会弹出提示要不要运行增强功能的安装包。

ubuntusetup28

当然是运行啦!运行会问你密码,继续输入即可。

ubuntusetup29

直到看到Press Return to close this Window,按回车就安装完了。

ubuntusetup30

 

这时候重启Ubuntu,下次点亮,Ubuntu的分辨率就可以根据VirtualBox的窗口大小自适应了。还有一个无缝模式,可以在Windows中打开Ubuntu的窗口,有兴趣的同学可以试一下。

ubuntusetup31

三、Linux终端命令初探

用apt-get做个例子吧,抛砖引玉教大家Ubuntu Shell的一些入门命令。

首先是换源,国外的源太慢啦!大家会受不了的。

点击Ubuntu桌面右上角的设置齿轮,然后进入系统设置,选择软件和更新。

ubuntusetup33

选择下载至右边的网址下拉菜单,然后选择中国下载服务器里头的mirriors.aliyun.com,没错土豪阿里巴巴的源!

ubuntusetup34

选择服务器之后,会提示软件列表过时,重新载入下就行。如果过了几分钟卡住了,关闭那个重新载入的窗口即可。

ubuntusetup35

 

接下来就可以打开终端了,终端的位置在Ubuntu桌面左侧的导航条上。

Treminal

打开终端后就可以看到Ubuntu的终端界面啦。事实上世界上大多数正在运行的Linux是没有图形界面的,程序猿们都是在黑框里面敲各种各样的命令实现各种功能。学习Shell命令,是每一个程序猿的必经之路。

那我们就从更新系统开始介绍Ubuntu Terminal的一些命令吧,输入:

sudo apt-get update

敲完之后回车。会提示输入密码,那就继续敲密码然后回车咯。记住Linux的终端是不会出***符号的,所以你输入密码后,终端界面不会有任何的反应。

Treminal2

等更新完软件列表之后,再输入一个更新命令:

sudo apt-get upgrade

Treminal3

Treminal4

 

更新半天之后,会问您希望继续执行吗?输入y或者Y。。。回车就会开始更新系统了。等待很长时间之后,终于安装完了~

本文最后再介绍几条开关机命令:

sudo shutdown -h now

这条命令是关机命令,同样需要输入密码执行。

sudo shutdown -r now

当然还可以定时关机

sudo shutdown -h 100   //100分钟以后自动关机

接下来会介绍如何配置程序设计基础课的基本环境GCC。请大家移步Jimmy Zhou同学的我是猪脚[3]——How to Install gcc And How to Program On Ubuntu。这货还写了英文版………欢迎膜拜。

我是猪脚[1]——安装VirtualBox

根据杨老师程序设计基础课的要求,大一的学弟学妹们都需要安装或者虚拟一套Linux操作系统。所以就有了我和@Jimmy Zhou开了这一个我是助教系列。

这是本系列的第一篇文章,主要是介绍 开源虚拟机VirtualBox的安装方法,并且简单地介绍一下最适合Linux入门的Ubuntu操作系统及其获取方式。

一、准备

首先需要下载VirtualBox和Ubuntu,分别在https://www.virtualbox.org/wiki/Downloads 和http://www.ubuntu-china.cn/download 可以下载。为了防止小白手抽,给出下载链接:

VirtualBox

http://download.virtualbox.org/virtualbox/4.3.26/VirtualBox-4.3.26-98988-Win.exe

Ubuntu 14.04 Kylin x64(64位的骚年点这里)

http://cdimage.ubuntu.com/ubuntukylin/releases/14.04/release/ubuntukylin-14.04-desktop-amd64.iso

Ubuntu 14.04 Kylin x86(8632位的骚年点这里)

http://cdimage.ubuntu.com/ubuntukylin/releases/14.04/release/ubuntukylin-14.04-desktop-i386.iso

二、配置BIOS

VirtualBox需要配合intel或者AMD的硬件虚拟化技术才能发挥最佳的性能。

以Lenovo的机器为例,联想是关机状态按Novo键进入BIOS Setup,其他品牌可能是F9 F11 或者 F12之类的吧,具体可以百度。

20150402_215609

BIOS中的Configration标签,打开Intel Virtual Technology(设置为Enabled)。

20150402_215626

对于AMD的CPU,可能是AMD Virtualization或者AMD-V。这个问百度应该都可以找到图片。

三、安装VirtualBox

打开VirtualBox的安装包,之后的步骤看后面的图就行。有时候会弹出UAC或者驱动提示,允许即可。不对,不是即可,是一定要允许!!!

VBoxSetup1 VBoxSetup2 VBoxSetup3 VBoxSetup4 VBoxSetup5

安装的时候会弹出安装驱动的提示,一定要始终信任然后安装。

VBoxSafetyDrivers VBoxSetup6

 

四、配置权限

由于VirtualBox有高权限的系统调用,所以需要系统管理员权限运行。

我们需要右键VirtualBox的快捷方式,选择属性:

选择兼容性选项卡,点击更改所有用户的设置。

VBoxSetting

勾选以管理员身份运行此程序。高DPI屏幕的,要勾选高DPI设置时禁用显示缩放,避免显示错误。

VBoxSetting2

然后就可以打开VirtualBox玩了。

好吧马上就去更新接下来请移步多图文:我是猪脚[2]——在VirtualBox中安装Ubuntu Kylin 14.04

博客全站强制SSL和Nginx的一个问题

强制SSL

PositiveSSL_tl_trans

昨天半夜,Jimmy Zhou同学上了DO并且随着大流加了SSL。因为我的站早就启用了StartCom的免费SSL证书,所以他就来给我的SSL评了下分。结果——C。

强迫症瞬间就犯了,在Jimmy同学的鼓动下,入了$9一年的COMODO SSL。接下来就是升级网站的SSL配置,具体过程如下:

  • 1、升级Openssl(2015.10更新:改成了LibreSSL),使用更安全,ARM平台表现更好的加密算法: CHACHA20_POLY1305。。
  • 2、重新编译安装Nginx至最新版本,开启SPDY。(顺便吐槽下:lnmp一键安装包的一键升级Nginx脚本存在问题,还是手动配置大法好)
  • 3、禁用SSLv3(这是我搬回国内以后忘记做得事情)。
  • 4、强制http://dickwu.com 和 http://www.dickwu.com 301 至https://dickwu.com。

然后SSL评级就A了。离A+还差一步,至少强迫症解决了。

Update: 配置CHACHA20_Poly1305的详细教程,移步这里

Nginx Rewrite规则加斜杠的问题

新的强迫症出现:

这是老问题了,既然昨天动到了Nginx就想办法解决一遍。具体问题是这样的:

如果我访问https://dickwu.com/class04这个网址,最后没有加斜杠,Nginx会认为站点是在dickwu.com/下,CSS什么的自然是到dickwu.com/css里去找,这就造成了网页里所有css,js,图片挂掉的问题。

网上的办法都是在Nginx的配置文件中加一句server_name_in_redirect off; 但事实上Nginx早就把这个配置作为默认选项了。那问题肯定就出在了Wordpress的Rewrite规则上。

搞了一晚上,没想到办法。最后用了被Jimmy嘲笑的一招:

if (-d $request_filename){

rewrite ^/(.*)([^/])$ /$1$2/ permanent;

}

但是这绝对不是解决的办法。

求大神相救!!!!!!!!!!!!!!!!!

Apple Genius Bar体验

Apple Store真的是IT男的玩具店。

今天下午,某土豪的Macbook Air需要卸载Bootcamp分区。原本应该是打算一整个下午找个星巴克自己搞定的,突然机智的我一拍脑袋想到!无锡不是有Apple Store嘛,找Genius Bar不就行了?

于是驱车前往著名的Center 66。

Center66

在这个土豪聚集的地方,有一个占据两层Large号店面的Apple Store。

Center66 Apple Store

里面有许多聪明的Apple Genius

Genius Bar

Genius Bar的天才们,忙得不可开交(这几张图已经是等预约高峰过后拍的了)。。。

到那里被负责预约的Genius用非常不耐烦的口气告知:今天和明天的Genius Bar已经全部预约完了,您如果有需要的话后天再来吧。

喵,出4块钱地铁钱,为了装13还买了30元星巴克,我能白跑?!

MBA

于是我们就拿这台没人用的MBA查看了一下预约,发现今晚还有N多Macbook的预约名额。居然敢骗我!那个管预约的Genius你完蛋了!还想不想在Apple混了?!

预约第一步->第二步->…非常顺利,只到最后一步,网页提示错误。

怒了,抓了一只正在回答Apple小白白痴问题的Genius,然后问他能不能帮我处理下预约这个问题。结果这个时候,这个Genius居!然!放!下!了!那!个!客!户!的!iPad!然后转向我们,问我们的Macbook Air遇到了什么问题!

你怎么忍心把人家晾在一边?不过自私点想,毕竟是晾了别人帮我干活,于是就欣然回答Genius君,我们只是想把这个Bootcamp分区删掉,然后把Macintosh OS的盘扩容。

Genius说这个简单,于是变出一个东西来给我们…………5分钟就搞定了!

哦对了然后Genius彻底忘了那个被他晾在一边的妹纸,去做下一个预约了。

那个被晾在一边的妹纸很伤心,于是我告诉她其实我也是半个Apple Genius,有什么问题你问我好了。结果你猜啥?

她输入Apple ID密码的时候,大写锁定开了。

怪不得Genius不理她了

解决了问题,心情大好!

20150204_111930

出Center 66的时候,看到门口有一家这个店,这时候我的消费欲立马起来了。

走进去一看标价:

¥4, 480, 000

土豪的世界,我们屌丝还是不要去碰的好。
886

买了Y50,加装SSD

因为Hp Probook实在是太老了,满足不了我现在的工作娱乐需求,所以这个寒假萌生了换电脑的想法。经过熟人的建议,入了联想的Y50。

Y50的体验就不说拉,网上的测评非常多~这篇文章主要记录一下我折腾SSD的历程。

话说联想也真是,Y50这个平台,居然只有一个硬盘位一个SATA接口。木有光驱,没有mSATA,木有任何能够塞东西的地方。虽然我知道这是为了把笔记本做薄,但是对于我这种折腾党来说就是对我们的剥削啊!剥削!!!!

好叭吐槽完了还要办正事儿!

一、拆

我的Y比较幸运,买回来不知道有没有满3分钟我就拆了它了(原厂系统连初始化都没高兴做,直接卸硬盘)。

Back

拆完12个B面的螺丝以后,囧了。

………………………………

这里施力中

………………………………

大力出奇迹

………………………………

还是不要大力了

………………………………

纹丝不动

于是只好咨询度娘,度娘把我带到了中关村的这篇文章。原来是出风口处四个卡扣在作祟。那四个卡扣非常地紧,如果大力出奇迹必定会断裂,于是机智的我。

webwxgetmsgimg (1)

先用较薄的地铁卡开缝隙,然后用较硬的联通电话卡插进缝隙向外拉,直到四个卡扣全部松脱。

话说这一步弄了我小半天哪,还出了一身汗,这时候真为联想的装配工人捏把汗,万一装配的时候手残大力出杯具咋办。

webwxgetmsgimg (2)

庐山真面目出现,话说这个布局真的紧凑,有一种开Macbook的感觉。然后仔细寻找一圈,真的没有多出来的接口(┬_┬)。原版用的是5400转的WD蓝盘,8GB Cache+1TB的布局,实际上也可以达到很好的体验。

二、上SSD

webwxgetmsgimg (3)

三星旗舰850Pro,Michael Guo强烈推荐的SSD,128GB在梦之岛大概900左右入的吧,10年质保我也不担心寿命问题了。

webwxgetmsgimg (4)所有的螺丝归位,合上盖子~

三、安装系统和驱动

系统,一开始我下载的是Windows 8.1 Standard然后安装,后来发现序列号不匹配。又度娘了一下才知道国内的电脑是用的China Special Edition。不过总算淘到了ISO,用Ultraiso做了个启动U盘安装完了Windows8。

最后是装Samsung Magician驱动,这个驱动不仅仅可以延长SSD寿命,还有一个打鸡血模式RAPID——

Magician

打鸡血之后——

webwxgetmsgimg (6)

实际上RAPID是利用了一部分内存作为SSD的缓冲区,这就是为什么850 EVO PRO这么吊。。。

哈哈哈哈哈现在就可以像羊驼一样奔腾啦!!!!

webwxgetmsgimg (5)

大年夜快乐!