写点什么

豆瓣的基础架构

2014 年 4 月 09 日

本文根据 InfoQ 中文站对豆瓣洪强宁(@hongqn)的沟通交流整理而成。洪强宁介绍了豆瓣的架构和组件,并分享了豆瓣基础平台部的一些团队经验。文中截图来自洪强宁在 2013 年 CTO 俱乐部中的分享。

嘉宾介绍

洪强宁,豆瓣首席架构师。豆瓣第一位全职员工。清华毕业后,洪强宁一直做嵌入式系统。在 2002 年开始接触 Python 语言,从硬件工程师变为软件工程师,对一种语言在计算机底层如何工作有深入的理解。

架构

豆瓣整个基础架构可以粗略的分为在线和离线两大块。在线的部分和大部分网站类似:前面用 LVS 做 HA,用 Nginx 做反向代理,形成负载均衡的一层;应用层主要是做运算,将运算结果返回给前面的用户,DAE 平台是这两年建起来的,现在大部分豆瓣的应用基本都跑在 DAE 上面了;应用后面的基础服务也跟其他网站差不多,MySQL、memcached、redis、beanstalkd,不一样的是 NoSQL 的选择—— BeansDB ,这是我们在几年前开源的 KV 数据库,也是国内比较早开源的 KV 数据库。

BeansDB 项目可以说是一个简化版的 AWS DynamoDB,该项目在 2008 年启动,2009 年开源,第⼀版使⽤tokyo cabinet 作为存储引擎,2010 年使⽤bitcask 存储格式重写了存储引擎,性能更好。BeansDB 对 key 做哈希运算找到节点来实现分布和冗余, 一个写操作会写好几个节点,而现在的配置是写三份读一份。BeansDB 主要的特点是支持海量 KV 数据库——相比 Redis 这种支持几十个 G 到几百个 G 的内存 KV 数据库,BeansDB 可以支持到上百 T 的数据。另外 BeansDB 最大的好处就是运维很简单,性能、可用性、扩容都很好,也实现了最终一致性。

BeansDB 中间的 Proxy 是用 Go 语言写的,也是一个开源的组件。整体来说BeansDB 的设计结构比较简单,相比Redis 那种有多种value 类型的方式,BeansDB 的Value 比较简单一些。

在豆瓣内部建立了两个不同的BeansDB 集群,一个是doubandb,一个是doubanfs,分别针对不同的场景。doubandb 主要存储小型文本数据,如影评、用户个人介绍、帖子内容等,这样的好处是可以大大降低我们对MySQL 的性能依赖,算是给MySQL 减负;doubanfs 主要存放图片和音频等中型数据。

DAE 可以说是基于很多以前积累的、旧的组件做起来的。我们做的这种对内的 PaaS,相比对外的 PaaS 而言做了很多简化,尤其是安全方面如应用间隔离、权限管理方面,我们都不用像公有云那样花大量精力去做,所以工作量其实还好。DAE 现在在计划开源,当然它现在只支持 Python 应用。以后我们也许会让 DAE 支持 Go 语言。

上面是在线的部分,对高可用性和低时延有较大要求。离线部分则包括数据挖掘、数据分析等,技术组件分别是海量分布式文件系统 MooseFS,这个文件系统的结构类似 HDFS,用 C 语言编写,其好处在于 FUSE 模块实现的比较好,用文件系统就可以直接进行操作,而不需要专门的命令,可以支持的数据量也很大。另外就是自己开发的分布式计算平台 DPark

DPark 顾名思义是 Spark 的 Python 实现,不过现在已经跟 Spark 越来越不一样了。和 Hadoop 相比,Spark 可以使用内存做为缓存加速分布式计算,DPark 继承了这个优点,这对于大规模数据的迭代计算非常有用。在豆瓣的应用场景下,因为我们的离线计算很多是推荐算法计算,这种计算涉及大量的迭代算法,如果每次计算的结果都入磁盘再在下一轮计算加载,那性能是很差的,所以 DPark 能够大幅提升性能。另外,因为 DPark 的编写使用了函数式语言的特点,所以可以写的非常简洁:

到目前(2014 年 3 月),DPark 的集群规模和处理数据量已经比去年多了一倍左右,一天要处理 60~100TB 左右的数据。

团队

当前,我所负责的豆瓣平台部一共包括四个部分:核心系统,这块也是由我直接带领的,共 6 名工程师;DAE,现在是彭宇负责,共 4 名工程师;DBA 两人;SA 两人。

平台部负责的项目大多是跟业务无关的东西,贴近应用层的主要在产品线团队做,这个分工跟豆瓣工程团队的发展历史有关。早期豆瓣工程师还不多的时候,就已经分为两种倾向,一种是偏业务的,就是去做用户能看得见的东西;另一种是支持性的,运行在业务层下面、不被用户所感知的东西。下面这一层就衍变成了平台部门。

在豆瓣,不管是做产品还是做平台的工程师,技术实力都比较强,一个项目应该从哪个部门发起,并不是看这个任务的难度,而是看它是公共的还是业务特有的。有些项目即使未来可能会成为公共的,但一开始只是一个产品线需要,那么它也会从产品线发起。比如豆瓣的短信服务,最开始是产品线有需求,所以这些服务都是由他们发起完成的,平台这边主要负责提供建设服务的架构,比如 DoubanService,告诉他们一个服务怎样去写、怎样去部署、怎样去对用户开放。短信服务后来成为很多产品线都在使用的服务,同时这个系统本身也越来越成熟,那么它逐渐就被转移到 SA 团队来进行维护。

核心系统组做过的项目,包括刚才提到的 DPark、BeansDB,还有 MooseFS 这些二次开发的,还有搜索服务、信息推送的长连接服务等,大大小小差不多有十几个。有些项目处于维护状态,所以需要的人不是那么多。

跟豆瓣其他工程团队一样,平台部也强制大家做 code review。这对于核心系统来说很重要的一点在于,code review 是一个知识共享的过程:我们人少项目多,所以很多项目都是一个人做主力,很容易就变成其他人不知道你这个项目具体是什么情况,而强制 code review 就可以实现一种公开透明的状态,让大家都了解每个项目在做什么。

在平台部,因为你做的所有东西都会影响到全公司,测试显然很重要,我们还做了另一件事来进行质量保证,那就是一个项目由谁来主导上线,谁就要负责这个项目的故障响应——所有运维、调整系统等 SA 的工作,你这个第一负责人都要参与。你做的东西的好坏会影响到自己晚上能不能睡好觉,所以大家就会比较谨慎。灰度上线也是我们这边的通用做法。

平台部还有一点跟产品线不一样的是,平台部没有产品经理,所以你的工作方向更多是自己去找的,每个人自己发现问题的能力更重要。我们每个月都会问大家,你这个月想要解决什么问题?如果方向大家一致认可,那就去做。

最后,对于新技术的引入上,豆瓣整体是比较偏激进的,我们鼓励大家去看看新的技术。当然我们也不会看到新的就上,这里面有一些限制:一个是比较重要的服务如果要上新的技术,一定要有成功案例,且成功案例有跟我们量级差不多的规模,这样可以降低风险;另一个是对于引入的新技术一定要吃透——大部分引入的技术肯定是要做二次开发的,所以拿进来的技术你必须保证能完全理解它的代码结构,出了问题能修,能去掉自己无法掌控的东西。这也是为什么豆瓣不太可能在重要的地方引入 Java 的原因,除非别无选择,我们一般都是 Python、C 和 Go。

采访人介绍

庄表伟,目前在华为 2012 实验室的研发能力中心工作。也是 80 年代中期就开始接触计算机和编程,一直对软件开发、技术社区、开源软件等抱有浓厚的兴趣。近期关注的重点是:如何将开源社区的经验,应用于企业内部实践。


感谢杨赛对本文的审校。本采访由庄表伟策划完成。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 4 月 09 日 03:4020753

评论

发布
暂无评论
发现更多内容

Java零基础到进阶宝典!从小白到大神,金九银十面试这届斩获23K月薪

Java架构追梦

Java 学习 架构 面试 核心知识点

2020年第三季度《全国移动App 风险监测评估报告》

InfoQ_11eaedef67e9

App 移动安全 个人隐私安全

惊险的B站Java后端岗面试之旅,复盘面试经历及面试真题

Java架构之路

Java 程序员 面试 编程语言

springboot+Redis+Shiro+MyBatis炸翔版CMS开源系统(代码+视频)

周老师

Java 编程 程序员 架构 面试

【BAT面试通关手册】覆盖Java相关29个技能,学完之后吊打面试官!

Java成神之路

Java 阿里巴巴 程序员 面试 编程语言

随机森林原理介绍与适用情况(综述篇)

计算机与AI

数据挖掘 学习 数据科学 随机森林

[Go并发编程实战课]01.Mutex学习笔记

custer

go

蚁架构师首推SpringBoot套餐(原理+实战+面试)

小Q

Java 学习 架构 微服务 SpringBoot 2

4年Java经验,备战两月成功拿到美团、京东、字节offer

Java架构之路

Java 程序员 面试 编程语言

教育场景方案升级| 打通业务前后端,少量开发快速上线(一):互动小班

ZEGO即构

在线教育 低代码

详细分析定制企业应用的价格

Philips

敏捷开发 快速开发

手把手带你玩转 openEuler | 初识 openEuler

openEuler

Linux 开源 操作系统

月薪60k的Java开发在阿里是什么级别?对技术能力有哪些要求?

Java架构之路

Java 阿里巴巴 程序员 面试 编程语言

详细讲解:python中的lambda与sorted函数

计算机与AI

Python

合约跟单平台搭建,交易所跟单软件开发商

135深圳3055源中瑞8032

BATJ内部Java求职面试宝典,尤其应届生如果还没有学过那后悔去吧,也许你已经错过N多家大厂offer;

Java架构师迁哥

数字货币交易系统定制开发,区块链交易所

135深圳3055源中瑞8032

区块链USDT支付开发方案,USDT跨境支付搭建

135深圳3055源中瑞8032

[Go 并发编程实战课]02.Mutex 源代码

custer

go

WebSocket从入门到精通,半小时就够!

JackJiang

html5 网络编程 websocket 即时通讯

解释一下==和equals的区别,你以为就这么简单?那你就草率了

小Q

Java 学习 架构 面试 基础

面向对象编程会被抛弃吗?这五大问题不容忽视

Java架构师迁哥

区块链钱包开发需要注意哪些问题?区块链数字钱包搭建

135深圳3055源中瑞8032

【全球案例】ESL 游戏公司如何通过 Jira 定制化解决方案连接全球团队

Atlassian

项目管理 敏捷 Atlassian Jira

极客时间架构师培训 1 期 - 第 4 周总结

Kaven

UBBF2020:智能联接,共创行业价值新增长

DT极客

视频会议的应用

anyRTC开发者

ios 音视频 WebRTC 直播 安卓

LeetCode题解:145. 二叉树的后序遍历,栈,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

1分钟将vscode撸成小霸王

gamedilong

前端 vscode

vidyo在数字化办公中提供了什么便利?

dwqcmo

音视频会议 集成架构 解决方案 智能硬件

手把手带你玩转 openEuler | 如何安装 openEuler

openEuler

Linux 开源 操作系统 openEuler

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

豆瓣的基础架构-InfoQ