Mais conteúdo relacionado
Semelhante a Pptv lb日志实时分析平台 (20)
Pptv lb日志实时分析平台
- 2. Agenda
• PPTV LB日志实时分析系统介绍
– 实际面临的问题
– 解决方案
– 系统部署
• 系统实现
– Fluentd(td-agent)
– MongoDB
– Python Script(PyMongo module)
– Zabbix
• 应用实例
– Nginx return code 4xx 5xx 监控
– Nginx响应时间监控
– 告警邮件自动分析程序
– LB日志实时分析与自动Release平台的集成
- 8. 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”
}
- 11. 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的输入;
- 12. 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很好的解决了日志定量
轮转的问题
- 14. 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
- 16. 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>
- 17. 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>
- 18. 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")
}
- 19. PPTV LB日志分析逻辑(1)
• 为LB日志自动生成fluentd配置文件:
• 对某台/log/nginx/*.access.log和
*.error.log:
• 根据LB所在机房分配后端mongodb地址/
端口,根据历史日志大小分配capped
collection size,根据LB机器名分配
mongodb database_name,根据域名确
定mongodb collection name.
- 20. 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" }
- 21. 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秒的个数
• }
- 22. 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"
• }