pptv lb 日志实时分析平台

28
PPTV LB 日日日日日日日日 XinyiZhou [email protected] 11/5 2012

Upload: najila

Post on 06-Jan-2016

80 views

Category:

Documents


0 download

DESCRIPTION

PPTV LB 日志实时分析平台. XinyiZhou [email protected] 11/5 2012. Agenda. PPTV LB 日志实时分析系统介绍 实际面临的问题 解决方案 系统部署 系统实现 Fluentd (td-agent) MongoDB Python Script( PyMongo module) Zabbix 应用实例 Nginx return code 4xx 5xx 监控 Nginx 响应时间监控 告警邮件自动分析程序 LB 日志实时分析与自动 Release 平台的集成. 实际面临的问题. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PPTV LB 日志实时分析平台

PPTV LB 日志实时分析平台

[email protected]

11/5 2012

Page 2: PPTV LB 日志实时分析平台

Agenda

• PPTV LB 日志实时分析系统介绍– 实际面临的问题– 解决方案– 系统部署

• 系统实现– Fluentd(td-agent)– MongoDB– Python Script(PyMongo module)– Zabbix

• 应用实例– Nginx return code 4xx 5xx 监控– Nginx 响应时间监控– 告警邮件自动分析程序– LB 日志实时分析与自动 Release 平台的集成

Page 3: PPTV LB 日志实时分析平台

实际面临的问题• PPTV 采用 Nginx+Keepalived 的方式构建 Load Balancer ,共有约 40 台 LB server ,每台承载10-50 个域名的流量 , 我们需要精确的把握所有域名的健康状态(返回码是否正常, 4xx/5xx 率),及响应时间变化趋势;能够准实时的发现入侵行为;

• 难点:• 日志量大 – 每台 LB 每天都有几百 GB 日志 ( 压缩

前)• 日志分散不易进行统一分析• 难以添加有效监控

Page 4: PPTV LB 日志实时分析平台

解决方案 ( 一 )

• awk+grep+bash+gnuplot• 最方便的一招,比较灵活,计算准确;但实际使用

不方便,看一个域名的日志需要登陆好几台 LB• E.g. 统计非 200 的 top return code• awk '{if ($9 ~ /^[0-9]*$/ && $9 != "200" &&

$9 !~ /^3/) code[$9]++}END {for ( i in code ) print i " " code[i]}'|sort -k2 –nr

• 使用 gnuplot 对统计结果绘图• cut –d’’ –f1-4 log.txt | uniq –c | (echo “plot

“-” using 2:1 with lines”;cat)|gnuplot

Page 5: PPTV LB 日志实时分析平台

解决方案 ( 二)• Python+zabbix• 每台 LB 均部署 python 日志分析脚本,通

过 zabbix 调度,每隔五分钟对前五分钟生产的日志文件进行分析,保留分析结果;

• Zabbix 负责绘图和告警;• 主要两个缺点:1 )性能瓶颈,日志分析占用大量 LB CPU 资源2 )不够灵活,日志分析局限于单台 LB

Page 6: PPTV LB 日志实时分析平台

解决方案 ( 三)• Fluentd+Mongodb+Python+zabbix• Fluentd 实时收集 LB 日志, JSON 化,存

入中央 Mongodb• Python 程序查询 Mongodb 数据进行实时

计算;计算结果存入 zabbix ; zabbix 负责告警及图形展现

• P.S. That’s what we want!!

Page 7: PPTV LB 日志实时分析平台

Fluentd/Mongodb 架构图

Page 8: PPTV LB 日志实时分析平台

Fluentd 介绍• 开源日志收集工具 http://fluentd.org/• LOG everything as JSON !• JSON:Schema-free, add/remove field from logs at

anytime• 原始日志:“2012-10-01 host1 myapp: message size=1000 user=xyz”• JSON :2012-10-01 myapp.message {“hostname”: ”host1”,“size”: 1000,“user”: “xyz”}

Page 9: PPTV LB 日志实时分析平台

Fluentd/Mongodb 数据流图

Page 10: PPTV LB 日志实时分析平台

Fluentd plugin 说明 (1)

• 在不使用 plugin 的情况下 Fluentd 仅仅是将日志输入转化为 JSON 格式输出的工具;各类 plugin 极大拓展了Fluentd 的功能

• Fluentd plugin 有如下三种:

• Input plugin 定义日志来源标准化,输入的格式• Buffer plugin 定义 fluentd 缓存的配置以实现可靠性• Output Plugin 定义输出的格式及目的地,可以是文件,

网络,数据库, etc

Page 11: PPTV LB 日志实时分析平台

Fluentd plugin 说明 (2)

• Fluentd Input Plugin• http

– 让 fluentd 从 http client 获取数据

• tail– tail 是最常用的 input plugin ;<source> type tail path /var/log/httpd-access.log #tail 监听的文件地址tag apache.access # 每个输入需要一个特定标签以区别format apache|syslog| 自定义正则 #format 可以灵活自定义 </source>

• foward– 将其他 fluentd/fluent-cat 命令的输出作为该 fluentd 的输入;

• exec– 通过执行外部命令,以命令执行的结果作为 fluentd 的输入;

Page 12: PPTV LB 日志实时分析平台

Fluentd plugin 说明 (3)

• Fluentd Output Plugin• Ouput Plugin 用于存储 Fluentd 收集来的数据;目前有

很多开源的 plugin ,如: fluentd-flume,fluentd-splunk,fluentd-cassandra,fluentd-scribe,fluentd-mongodb

• fluent-plugin-mongo 0.6.10 • Output plugin 中最完美的当属 mongodb plugin ,因

为 Fluentd/Mongodb 都以 JSON 为基础; mongodb良好的插入查询性能可以顶住海量日志实时分析的压力;mongodb 的 capped collection 很好的解决了日志定量轮转的问题

Page 13: PPTV LB 日志实时分析平台

MONGODB 部署• 每个机房部署一台 mongodb server, 用

于收集该机房全部 LB 的日志• 每个 mongodb 部署多个 instance ,每个

instance 对应一台 LB server• 建立多个 collection, 每个 collection 保存

一个域名的日志信息• 一定要使用 capped collection!

Page 14: PPTV LB 日志实时分析平台

MONGODB 配置• port = 270XX• dbpath = /home/mongodb/node270xx• logpath = /home/mongodb/node270xx.log• syncdelay = 10 #这个设置 10秒左右,将 IO 压力平均化,避免 sync 时影响查询性能

• maxConns = 20000• oplogSize = 1024• directoryperdb = on• logappend = on• journal = off• fork = on• nohttpinterface = on

Page 15: PPTV LB 日志实时分析平台

Fluentd 部署• 每台 LB上均需安装一个 Fluentd

agent ;使用 TreasureData公司 yum 源上提供的 td-agent rpm包安装即可;

• 启动方法 /etc/init.d/td-agent start• 关键配置 /etc/td-agent/td-agent.conf• 日志文件 /var/log/td-agent/td-

agent.log

Page 16: PPTV LB 日志实时分析平台

PPTV Fluentd Input 配置• <source>• type tail• path /home/logs/nginx/aplus-access.log• pos_file /var/log/td-agent/tmp/aplus.pptv.com.pos• format /^(?<ip>[^ ]*) (?<domain>[^ ]*) - ([^ ]*)

([^ ]*) "(?<url>[^"]*)" (?<code>[^ ]*) (?<bsize>[^ ]*) ("[^"]*") ("[^"]*") ("[^"]*") "(?<restime>[^"]*)" "(?<backend>[^,"]*)[^"]*" "(?<bcode>[^,"]*)[^"]*" "(?<nginxtime>[^"]*)"$/

• tag mongo.aplus.pptv.com.access• </source>

Page 17: PPTV LB 日志实时分析平台

PPTV Fluentd Output 配置• <match mongo.aplus.pptv.com.access>• type mongo• database LB_hostname• collection aplus.pptv.com.access• host mongodb_host• port mongodb_port• capped• capped_size 180m #确保能够保留最近1小时该域名的日志• ignore_invalid_record true• buffer_type memory #使用内存作为buffer存储方式• buffer_chunk_limit 1M• buffer_queue_limit 15• retry_limit 10• retry_wait 1s• flush_interval 1s #刷新频率为1s,基本做到实时• </match>

Page 18: PPTV LB 日志实时分析平台

PPTV 日志样例• 原始日志:218.26.242.14 999.fb.app.aplus.pptv.com - [05/Nov/2012:15:42:38 +0800] "GET /recommend_pop/?_=1352101423806 HTTP/1.0" 200 34 "http://v.pptv.com/show/MLibyMJjibbqyJB28.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)" "60.211.95.201, 127.0.0.1" "0.012" "10.201.10.94:80" "200" "0.012“

MONGODB 中的日志:{ "_id" : ObjectId("5097755c31d87b09f8046f1f"), "ip" : " 218.26.242.14", "domain" : "999.fb.app.aplus.pptv.com", "url" : " GET /recommend_pop/?_=1352101423806 HTTP/1.0", “code” : “200”, # 返回码 "bsize" : “34", #bodysize “restime” : “0.012”, #后端服务响应时间 “backend” : “10.201.10.94:80”, #后端服务地址 “bcode” : “200”, #后端服务返回码 “nginxtime” : “0.012”, #nginx 响应时间 "time" : ISODate("2012-11-05T15:42:38Z")}

Page 19: PPTV LB 日志实时分析平台

PPTV LB 日志分析逻辑 (1)

• 为 LB 日志自动生成 fluentd 配置文件:• 对某台 /log/nginx/*.access.log 和

*.error.log:• 根据 LB 所在机房分配后端mongodb 地址

/端口,根据历史日志大小分配 capped collection size,根据 LB机器名分配mongodb database_name,根据域名确定 mongodb collection name.

Page 20: PPTV LB 日志实时分析平台

PPTV LB 日志分析逻辑 (2)

• 保存域名 -LB-后端主机的对应关系,并定期更新( parse nginx 配置文件)

• > db.domain_host_info.find({domain:"aplus.pptv.com"})• { "_id" : ObjectId("5096bc7b19859831d6000002"), "domain" :

"aplus.pptv.com", "host" : “lb1", "backend" : “host1" }• { "_id" : ObjectId("5096bc7b19859831d6000003"), "domain" :

"aplus.pptv.com", "host" : " lb1", "backend" : “host2" }• { "_id" : ObjectId("5096bc7b19859831d6000004"), "domain" :

"aplus.pptv.com", "host" : “lb2", "backend" : “host3" }• { "_id" : ObjectId("5096bc7b19859831d6000005"), "domain" :

"aplus.pptv.com", "host" : “lb2", "backend" : “host4" }

Page 21: PPTV LB 日志实时分析平台

PPTV LB 日志分析逻辑 (3)

• 每五分钟对前五分钟 mongodb 收集到的日志基于域名进行汇总计算 (python/pymongo) ,得出结果存入 mongodb 中的 lb_detail表:

• > db.lb_detail.findOne()• {• "_id" : ObjectId("509434522573b0625d000002"),• “domain” : “xxxxx.pptv.com”, # 分析的域名• “ng1_count” : 0, #nginx请求时间超过 1秒个数• “be1_count” : 0, #backend后端响应时间超过 1秒个数• “total_count” : 2703, # 过去5 分钟该域名的请求总数• “backtime_total” : 6.71, # backend后端响应时间总和 • “bodysize_total” : 124100, #bodysize总和• “xx4_count” : 2, #4xx请求个数• "time" : ISODate("2012-11-03T05:00:02.634Z"),• “ng3_count” : 0, #nginx请求总时间大于 3秒的请求个数• “c200_count” : 2700, #200请求个数• “xx5_count” : 1, #5xx请求个数• “ngxtime_total” : 7.191, #nginx请求总时间• “be3_count” : 0 #backend 响应时间超过 3秒的个数• }

Page 22: PPTV LB 日志实时分析平台

PPTV LB 日志分析逻辑 (4)• 每五分钟对前五分钟 mongodb 收集到的日志基于后端机器进行汇总计算

(python/pymongo) ,得出结果存入 mongodb 中的 backend_detail表:• > #某域名 xxxx.pptv.com 中某后端机器 (backend_ip:80) 过去5 分钟的 4xx/5xx/ 响应时间 /超时次数情况• > db.backend_detail.findOne()• {• "_id" : ObjectId("509677552573b02445000004"),• "bk_xx5_count" : 183,• "bk_be3_count" : 62,• "bk_ng3_count" : 65,• "bk_body_size_total" : 214842812,• "bk_ngx_time_total" : 1443.1720000000564,• "bk_be1_count" : 83,• "domain" : “xxxx.pptv.com",• "bk_total" : 25378,• "server" : “LB_NAME",• "bk_back_time_total" : 1233.362000000008,• "bk_c200_count" : 25140,• "time" : ISODate("2012-11-04T22:10:29.004Z"),• "bk_xx4_count" : 42,• "bk_ng1_count" : 109,• "backend" : “backend_ip:80"• }

Page 23: PPTV LB 日志实时分析平台

PPTV LB 日志分析逻辑 (5)

• 对前面 (3),(4) 实时分析得出的结果,配置zabbix 监控项进行采集、绘图

• Zabbix 监控脚本使用 python/pymongo查询 mongodb 中 lb_detail/backend_detail表获取过去 5 分钟 某域名的总请求数 /2xx 率 /4xx 率 /5xx 率 / 平均响应时间 /后端响应超过 1秒的比率等

Page 24: PPTV LB 日志实时分析平台

Zabbix 监控 (1)• 建立 zabbix

LB_log_mining 监控模板,对每个域名建立总请求数, 4xx/5xx 数,后端平均响应时间, nginx 响应时间, bodysize 平均大小,响应时间 >1秒比例,响应时间 >3秒比例 ( 每五分钟采集一次 )

Page 25: PPTV LB 日志实时分析平台

Zabbix 监控 (2)

Page 26: PPTV LB 日志实时分析平台

Zabbix 监控 (3)

• 如上页所示,某域名的总请求数、 4xx、5xx 比率,平均响应时间,均可以在zabbix 中查看变化趋势;针对 4xx、 5xx率特别高或者响应时间 >3秒的比率特别高的,可以进行实时告警;

• 告警邮件见下图;

Page 27: PPTV LB 日志实时分析平台

Zabbix 监控 (4)

Zabbix 告警邮件实例;

Page 28: PPTV LB 日志实时分析平台

The End