一、需求分析
还在记复杂的Linux命令?还在为查询线上日志而苦恼?还觉得会操作Linux是个很牛X的技能?
随着中国互联网技术的发展,分布式系统复杂度越来越高,系统日志也越来越多,伴随着对日志的开发和运维成本也就随之上升。
如何优雅的解决日志的问题是各大互联网公司头疼的问题。
如何让系统日志充分地产生价值,成为一个亟待解决的问题。
二、在没有日志中心的日子里
这里举个反面教材,看下在没有日志中心的情况下,开发和运维的成本是怎样的。
场景分析:
没有日志中心,那就只能操作服务器呗。看上去讲究一些也没什么大问题。
总结一下直接操作服务器的缺点:
·界面不美观
·日志零散不易操作
·不易维护
·大日志文件需要切割
·LogView查看大文件
·效率低下
在大润发工作的时候,遇到周年庆(10.11,官网:http://www.feiniu.com/)
1.Linux服务器上的日志做了分隔
2.已知日志量会很大,按小时对日志做分隔
3.项目:购物车(cart-fn)
4.高峰期故障无法处理(11:00-3:00)
5.通过FTP把日志下载下来,用LogView打开(20mins左右),搜索日志
6.还有更坑的,搜索项目(search-fn),基本上没办法查日志。(毕竟大家在网购的时候,大部分的时间都是在搜索,对比各个商品的性价比,所以搜索的日志一直是最多的)
7.大促一天也就150多万订单,处理起来就这么复杂!!!如果是淘宝京东这样量级,怎么办???
以上场景,因为没有有效的日志解决方案,基本上无法做到实时的问题定位,只能靠QA做测试,模拟各种场景,造出用户投诉的场景。大部分的bug都无法解决,是在不行了,只能告诉大润发的地推人员,直接从超市提货吧,线上系统搞不定~ ~ ~ (记得有个bug更可怕的是,线下大润发超市提货,直接因为系统原因导致没有付款,就把冰箱洗衣机领走了,产品同学找小编,说是小编的问题,小编理都不理他,装作没听见,因为没有日志,产品不能证明是小编的锅。最后产品同学和小编的leader各赔付了一半的金额)
三、海量日志的存储、收集、可视化的解决方案
本文将对现在互联网上盛行的分布式系统日志解决方案进行解密,构建一个简单的日志系统,并用实例证明我们的架构在互联网大厂的可行性。
ELK实时日志分析平台环境部署
术语表:
- E :Elasticsearch 是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
- L : Logstash 是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
- K : Kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志
来看一下Elastic官网提供的“日志三剑客”
(1)安装Elasticsearch
tar -xzvfelasticsearch-6.3.0.tar.gz
·得到的解压目录下的文件有如下:
·Elasticsearch启动:
进入解压后的目录,执行:./bin/elasticsearch
·PS:启动后,终端上不能执行其他任何命令了?
·让程序后台执行:nohup./bin/elasticsearch&
·验证启动:curl:localhost:9200 或者在浏览器中输入http://localhost:9200
(2)安装Logstash
·解压文件:tar-xzvflogstash-6.3.0.tar.gz
·到config目录中新建一个logstash.conf配置
·配置input,output模块, 其中input是收集日志的模块,output配置导入讲日志导入到Elasticsearch
· filter是一个过滤函数,可以不配置(比如隐藏用户隐私数据:手机号)
conf/logstash.conf配置如下:
input{
tcp {
host => "127.0.0.1"
port => 4560
}
}
output{
elasticsearch {
hosts => "127.0.0.1"
index => "log-%{ YYYY.MM.dd}"
}
}
input:logstash输入源
output:logstash输出目的地
验证启动:http://localhost:9600/
(3)安装Kibana
·解压
·进入config目录,修改kibana.yml,新增如下配置项:
elasticsearch.url: "http://localhost:9200"
server.host: 127.0.0.1
·启动kibana服务:nohup./kibana&
·验证服务启动: http://127.0.0.1:5601/
(4)启动Java项目,通过Log4j2输出日志
log4j2配置如下:
<?xmlversion="1.0"encoding="UTF-8"?> <Configuration> <Appenders> <Consolename="Console"target="SYSTEM_OUT"> <PatternLayoutpattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> </Console> <!--输出日志到远程port:4560,logstash在port:4560接收数据--> <Socketname="LogStash"host="127.0.0.1"port="4560"> <JsonLayoutcompact="true"eventEol="true"/> </Socket> </Appenders> <Loggers> <Rootlevel="debug"> <AppenderRefref="Console"/> <AppenderRefref="LogStash"/> </Root> </Loggers> </Configuration>
Java测试代码如下:
publicclassElkLoggerDemo { privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ElkLoggerDemo.class); publicstaticvoidmain(String[]args){ for(inti= 0; i< 10; i ){ logger.info("输出info,i={}", i); logger.debug("输出debug,i={}", i); logger.error("输出error,i={}", i); } } }
至此准备工作全部搞定,下面就可以用通过运行我们上面的Java代码,测试一下我们简易版的日志中心的功能了。
观察Kibana上的信息:
可以发现,Kibana可以自动发现Elasticsearch中新增的索引
创建Index Pattern
搞定以上步骤以后,就可以再Kibana上搜索日志信息了,就可以告别Linux用命令行搜索日志了。
可以发现,在搜索框中输入的关键词,被命中后,都高亮显示了,更便于开发运维人员快速定位到问题。
简单总结一下我们的ELK架构:
我们只是简单的通过application server将日志通过log4j2输出到logstash中,logstash直接保存到了Elasticsearch,然后Kibana提供页面展示。
网上常见的ELK的架构如下
而真正在大厂日志中心的架构又是怎样的呢?
咨询过美团,阿里大神,大厂的日志中心架构大致类似上图。通过kafka的高吞吐量提高分布式系统日志输出效率。
------------华丽的分割线------------
感谢各位道友宝贵的时间阅读完本文
欢迎留言转发,一起探讨各种黑科技