pptv lb 日志实时分析平台

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

Upload: ilana

Post on 24-Feb-2016

132 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

PPTV LB 日志实时分析平台

[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 平台的集成

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

• 难点:• 日志量大 – 每台 LB 每天都有几百 GB 日志 ( 压缩前)• 日志分散不易进行统一分析• 难以添加有效监控

解决方案 ( 一 )• 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

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

zabbix 调度,每隔五分钟对前五分钟生产的日志文件进行分析,保留分析结果;• Zabbix 负责绘图和告警;• 主要两个缺点:1 )性能瓶颈,日志分析占用大量 LB CPU 资源2 )不够灵活,日志分析局限于单台 LB

解决方案 ( 三)• Fluentd+Mongodb+Python+zabbix• Fluentd 实时收集 LB 日志, JSON 化,存入中央 Mongodb• Python 程序查询 Mongodb 数据进行实时计算;计算结果存入 zabbix ; zabbix 负责告警及图形展现• P.S. That’s what we want!!

Fluentd/Mongodb 架构图

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”}

Fluentd/Mongodb 数据流图

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

Fluentd 的功能• Fluentd plugin 有如下三种:• Input plugin 定义日志来源标准化,输入的格式• Buffer plugin 定义 fluentd 缓存的配置以实现可靠性• Output Plugin 定义输出的格式及目的地,可以是文件,网络,数据库, etc

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 的输入;

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 很好的解决了日志定量轮转的问题

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

instance 对应一台 LB server• 建立多个 collection, 每个 collection 保存一个域名的日志信息• 一定要使用 capped collection!

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

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

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>

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>

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")}

PPTV LB 日志分析逻辑 (1)• 为 LB 日志自动生成 fluentd 配置文件:• 对某台 /log/nginx/*.access.log 和

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

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

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" }

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秒的个数• }

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"• }

PPTV LB 日志分析逻辑 (5)• 对前面 (3),(4) 实时分析得出的结果,配置

zabbix 监控项进行采集、绘图• Zabbix 监控脚本使用 python/pymongo查询 mongodb 中 lb_detail/

backend_detail表获取过去 5 分钟 某域名的总请求数 /2xx 率 /4xx 率 /5xx 率 / 平均响应时间 /后端响应超过 1秒的比率等

Zabbix 监控 (1)• 建立 zabbix

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

Zabbix 监控 (2)

Zabbix 监控 (3)• 如上页所示,某域名的总请求数、 4xx、

5xx 比率,平均响应时间,均可以在zabbix 中查看变化趋势;针对 4xx、 5xx率特别高或者响应时间 >3秒的比率特别高的,可以进行实时告警;

• 告警邮件见下图;

Zabbix 监控 (4)Zabbix 告警邮件实例;

The End