大众点评网
监控平台剖析
吴其敏 @QCon Hangzhou 2012
qimin.wu@dianping.com
12年10月29日星期⼀一
大众点评网
• 2003年4月成立于上海,是中国领先的本地生活消费平台
• 覆盖全国2300座城市,180万家商户,2200万条消费者点评
• 月活跃用户数5400+万,移动客户端独立用户数4500+万
• 500+台应用服务器,300+名技术人员
(数据截止2012年第三季度)
12年10月29日星期⼀一
• 介绍
• 报表
• 设计
• 未来
Agenda
12年10月29日星期⼀一
• MRTG, Cacti, Nagios, Ganglia, Zabbix, ...
• Dapper(Google), Scribe(Facebook),
Zipkin(Twitter), CAL(eBay), ...
• CAT(Dianping)
监控系统
12年10月29日星期⼀一
12年10月29日星期⼀一
目标
• 故障诊断
• 跨越边界访问(Across Boundary Activity)
• 跨网络:URL, HTTP, RPC, SQL, Message, Cache, ...
• 跨角色:浏览器/网络/应用服务器, Nginx/Tomcat, Controller/Model/View, ...
• 跨语言: Java call Scala, PHP call Java, ...
• 跨所有权:公共组件, 规则引擎, ...
• 状态记录(Status)
• 系统状态:CPU, Memory, Thread, Disk, Network, GC, Load, ...
• 业务状态:
, 结果, ...
• 业务统计
• 计数/计时:Page, Service, Cache, Database
• 分布:浏览器, IP, 登陆状态, 缓存命中, ...
• A/B 测试, 性能测试, ...
• 系统优化:响应时间, 依赖耦合, 嵌套调用
• 容量规划:数据库, 应用服务器
12年10月29日星期⼀一
部署
12年10月29日星期⼀一
特性
• 实时处理,全量数据,侧重应用监控
• 轻量级,低开销
• 无中心化设计,支持水平扩展
• 通用API,支持各种业务
• 丰富的分析、统计报表
12年10月29日星期⼀一
目前
• 集成所有中间件产品
• 60+ 业务应用
• 400+ 应用服务器
• ~1TB 消息(每天)
• ~200GB 存储(每天,压缩后)
12年10月29日星期⼀一
• 介绍
• 报表
• 设计
• 未来
Agenda
12年10月29日星期⼀一
消息
• 消息头
• 版本号,消息ID,所属业务,IP,所在线程,根消息ID
• 消息体
Type & timestamp 1st Category 2nd Category Status Duration & Attributes
t: Transaction Start
E: Event
T: Transaction End
A: Atomic Transaction
Transaction: 可嵌套
Event: 不可嵌套
Heartbeat: 不可嵌套
12年10月29日星期⼀一
消息
服务调用慢!
需要更多埋点!
12年10月29日星期⼀一
消息树
12年10月29日星期⼀一
Transaction报表
12年10月29日星期⼀一
Transaction报表
12年10月29日星期⼀一
Transaction报表
12年10月29日星期⼀一
Transaction报表
12年10月29日星期⼀一
Event报表
12年10月29日星期⼀一
Problem报表
12年10月29日星期⼀一
心跳报表
12年10月29日星期⼀一
更多报表
• Matrix
解读:URL(/scoreboard.bin)平均每次调用了65.7次服务和1.4次数据库访
问,服务调用平均耗时约2ms,数据库访问平均耗时8ms,服务调用平均
占用了整个URL处理时间的80.3%,数据库访问占6.3%。
建议:优化服务调用,减少服务调用的次数。
12年10月29日星期⼀一
更多报表
• Cross(客户端)
解读:在统计时间段内,调用了约202K次服务,其中调用了FeedServer业
务78K次,UserBaseService业务58K次等等。
12年10月29日星期⼀一
更多报表
• Cross(服务端)
解读:在统计时间段内,所有服务被调用了约53M次,其中13M次调用来
自于GroupService,11M次调用来自于ShopWeb等等。
12年10月29日星期⼀一
更多报表
• Cache
12年10月29日星期⼀一
• SQL
更多报表
Databases:
12年10月29日星期⼀一
更多报表
• Database
解读:此数据库有较高的SELECT请求,平均每秒1146次查询。
12年10月29日星期⼀一
• 介绍
• 报表
• 设计
• 未来
Agenda
12年10月29日星期⼀一
设计
• API
• 实时分析
• 数据建模
• 存储
12年10月29日星期⼀一
API
①
②
②
③
③
④
③
④
⑤
① 创建Transaction
② 记录子Event
③ 记录子Transaction
④ 设置状态
⑤ 结束Transaction
12年10月29日星期⼀一
实时处理
业务应用
业务应用
业务应用
监控消息
消费机
Receiver
Receiver
Receiver
threads
Analyzer
Analyzer
Analyzer
threads
HDFS
File
消息转储
MySQL
统计报表
Queues
12年10月29日星期⼀一
数据建模
。。。
public interface IVisitor {
public void visitTransactionReport(TransactionReport transactionReport);
public void visitMachine(Machine machine);
public void visitType(TransactionType type);
public void visitName(TransactionName name);
public void visitRange(Range range);
public void visitDuration(Duration duration);
}
• 目标模型定义
• 访问, 转换和合并
• 模型持久化
• XML, JSON, Binary, ...
• 代码生成
12年10月29日星期⼀一
存储需求
• 当前小时:读写;历史消息:只读
• 数量:几百万/小时
• 大小:1~100 KB/消息
• 消息ID:生成和使用可能不是同⼀一应用
• 随机读取:消息ID -> Logview
• 顺序读取:Hadoop M/R, Hive -> HDFS
• 压缩
• 归档
12年10月29日星期⼀一
存储设计
• 介质
• 内存:容量小, 成本高, 速度快, 顺序和随机读写
• 本地磁盘:容量有限, 成本低, 本地访问, 顺序和随机读写
• HDFS:容量大, 成本低, 冗余备份, 顺序读写随机读
• MySQL: 开销大, 成本高, 顺序和随机读写
• 存储
• 最近2小时
• 报表:内存
• 消息:本地磁盘
• 历史小时
• 报表:MySQL(历史日报表,周报表,月报表以小时报表为基础生成)
• 消息:HDFS
12年10月29日星期⼀一
消息存储设计
顺序读:/2012/10/13/14/ShopService-*-*
随机读:/2012/10/13/14/*-ShopWeb-*
块地址
32 bits
块内偏移地址
16 bits
数据
/2012/10/13/14/ShopSerivce-ShopWeb-10.1.6.1
/2012/10/13/14/ShopService-ShopWeb-10.1.6.2
375030 => 2012-10-13 14:00:00
ShopService => 消息被记录的domain
10.1.6.1/2 => 消息被处理的机器IP
0a010680 => 10.1.6.128 用于保证消息ID唯⼀一性
消息ID:ShopWeb-0a010680-375030-2
GZIP压缩,压缩前大小<64K
索引
解压后
12年10月29日星期⼀一
• 先做小做精,再做大做全
• 持续集成,持续发布,不断监控
• 单机开发和调试
• Everything Fails
• 关注客户,快速响应
12年10月29日星期⼀一
• 介绍
• 报表
• 设计
• 未来
Agenda
12年10月29日星期⼀一
未来
• 告警服务
• 数据服务
• 故障定位
• 支持Hive分析
• 前端监控
• 代码开源
12年10月29日星期⼀一
谢谢!
12年10月29日星期⼀一