标点符(钱魏 Way)

EverNote的系统架构

我们就先初略的从Evernote 服务的物理构造说起,这里我不会详细的介绍每一个组件。有意思的点会在接下来的文章中详述。

我们先从图片的左上角开始说起,所有的服务器状态截止为2011年5月17日。

网络:几乎所有的Evernote流量都是通过https://www.evernote.com:443 传输的。包括所有的“网络”的活动,还包括基于Thrift的客户端同步服务API 。他每天可以处理1.5亿的HTTPS请求,峰值为250Mbps的流量。(对于我们半夜运营的团队来说,最不幸的是,每天的峰值时间发生在太平洋时间每天的6:30左右)

我们通过主要网络供应商(NTT)和次要供应商(Level 3)使用BGP边界网关协议)来完全独立的分配流量,在一月份我们的SSL流量达到了老的负载均衡设备的极限后我们就新上了通过Vyatta防火墙过滤的A10 负载均衡,我们很容易的使用一台AX 2500设备来转移服务器故障。但我们准备测试其N +1群集配置以备未来的增长。

碎片:Evernote服务的核心是一组称为“碎片”的服务器组。每一台“碎片”用来保存和处理10万Evernote注册用户的所有数据和流量(Web和API)因为我们有超过900万用户,将有大约有90台“碎片”。

设备上,“碎片”被部署为一对有两个四核英特尔处理器,很多内存和镜像RAID配的置希捷企业级硬盘的SuperMicro盒子。在每个盒子中我们运行了 Debian的 主机管理两个 Xen的 虚拟机。盒子上的主虚拟机运行核心应用程序 Debian + Java 6 + Tomcat + Hibernate + Ehcache +  Stripes + GWTMySQL (for metadata)/ (元数据)+ hierarchical local file systems (for file data)/本地文件系统层次结构(数据文件)。

盒子上主虚拟机中的所有用户数据使用 DRBD技术 将同步复制到不同盒子的备份虚拟机上。这就意味着每一种用户数据会存在于两台物理服务器中,并有四份拷贝,并且每晚都会备份。如果我们的一台服务器存在问题,我们可以使用Heartbeat在最短的时间内将服务从注虚拟机切换到另一台盒子的备虚拟机上。

因为每个用户的数据汇总在一个虚拟服务器,我可以在没有与外部依赖的情况下独立运行“碎片”, 因此,一台“碎片”出现了问题并不会影响其他“碎片”。

为了连接用户和负载均衡设备,我们在浮躁均衡设备上花了大量的工作来通过UR L或Cookies来寻找对应的“碎片”。

用户信息保存:绝大多数的用户数据存储在单层的NoteStore碎片中,同时他们共享一个主“UserStore”帐户数据库(MySQL)。数据中包含少量的信息,如:用户名、MD5处理过的密码和“碎片”服务器的ID。这些数据足够的小,以至于可以在内存中储存。但是我们还会使用RAID镜像、DRBD复制确保数据备份的高度冗余。

高级图片处理:为了让你在笔记中可以搜索图片,我们每天使用28台8核服务器处理新图片。在忙的时候,一天可以处理130万到140万张图片。目前服务器Linux和Windows一起在使用,但是我们已经计划化把我们把所有的服务器在本月底换成debian系统来解决先前一些很老的问题。

这些服务器运行了我们研发团队自行开发的“先进的图像识别”程序。这个程序清每幅图片,识别文字形区域,然后和“识别引擎”进行匹配,这种识别引擎,比如我们的专业团队制作开发手写识别引擎,其中包括授权给我们商业合作伙伴的技术。

其他服务:我们所有的服务器都位于California,Santa Clara 的两个数据中心,除了我们核心服务的设备以外,我们也有小的服务器群组来处理小的任务,小的服务器群组只要小的服务器群组只要一到两个“盒子”或虚拟机。例如,我们的

SMTP邮件网关服务器就是由两台装有Postfix和一个基于Dwarf 的Java邮件处理程序的debian服务器。我们的@myen Twitter gateway 是一个简单的基于twitter4j的内部服务程序。

我们公司的网站使用的是Apache,公司的博客使用的是WordPress系统,我们大部份使用的拓扑结构交换机来自于惠普 ,我们使用Puppet来进行配置管理,使用ZabbixOpsviewAlertSite来进行监测性能。我们每晚通过一个千兆的使用比较软件将数据备份到另一个数据中心。

等等,为什么?我知道这个文章留下了明显的问题,比如为什么我们在许多地方选择了X而没有选择Y,为什么我们使用自己的服务器群组而不实用云提供商?为什么我们还在使用一些旧的技术(Java,SQL,local storage等)而不是新的神奇的技术。

这些问题我们会在未来几个月在后面的文章中进行详述,尽情大家期待!

本有由标点符翻译,原文链接(英文):http://blog.evernote.com/tech/2011/05/17/architectural-digest/

码字很辛苦,转载请注明来自标点符《EverNote的系统架构》

评论

  1. Ramon #1

    嗨, 刚在highscalability.com上看到你的翻译链接, 原文有几点没搞清楚, 主要是关于shard部分的介绍:This means that each byte of user data is on at least four different enterprise drives across two different physical servers, plus nightly backups..我不太确定, 他为啥说有至少4个备份.
    我的理解是一个shard包含两个box, 每个box上又跑两个虚拟机, 而且每个box有自己独立的raid(我老是觉得两个box共享一个raid), 这样的话在一个shard中有两个core application stack实例, 并且每个box上的副vm作为两外一个主vm的备份. 当一个用户提交了数据的时候, 处理请求的box会保存一份数据(raid的镜像是第二份), 然后同步到备份vm的是第三份(备份vm所在box的raid镜像是第四份)…不知道我的理解对不?

    回复
    2011-07-4
    • 标点符

      两台设备,每台设备有两个虚拟机,2*2=4

      回复
      2011-07-7
  2. 朱健强 #2

    期待“未来几个月在后面的文章中进行详述”

    回复
    2011-08-7