文档章节

如何在半小时搭建一个简单的日志分析平台?

翟志军
 翟志军
发布于 2016/09/25 01:04
字数 1743
阅读 11255
收藏 331
点赞 15
评论 11

人们常常说数据如金,可是,能被利用起的数据,才是“金”。而互联网的数据,常常以日志的媒介的形式存在,并需要从中提取其中的"数据"。

从这些数据中,我们可以做用户画像(每个用户都点了什么广告,对哪些开源技术感兴趣),安全审计,安全防护(如果1小时内登录请求数到达一定值就报警),业务数据统计(如开源中国每天的博客数是多少,可视化编辑格式和markdown格式各占比例是多少)等等。

之所以能做这些,是因为用户的所有的行为,都将被记录在nginx日志中或其它web服务器的日志中。日志分析要做的就是将这些日志进行结构化,方便我们的业务人员快速查询。日志分析平台要做的就是这些。

说完这些,你是不是觉得日志分析平台很难做,需要十人的团队加班几个月才能完成?

自从有了Elasticsearch、Logstash、Kibana,俗称ELK,小公司也可以很轻松地做日志分析了。说白了,1天几G的日志,ELK完全可以吃得消。就像标题说的,只需要1个人半小时就可以搭建好了。前提是你已经熟悉了Ansible。下文也假设你已经熟悉Anbile,如果不熟悉可以看看我的另一篇文章:Puppet,Chef,Ansible的共性

本文目的就是教你如何在搭建一个日志分析平台的雏形。有了这个雏形,你可以慢慢迭代出更强大,更适合你业务的日志分析平台。同时,提供可执行的源代码:OSC-AdCenter

简单日志分析架构图

简单日志分析架构图

我做了简化,架构图中的每个组件都可以分别放到不同的机器。这里简单介绍下这些你组件:

  • your app:你的应用,我们的源码中,把这个给省略了
  • Openresty:基于Nginx的Web开发平台,你可以想像它基于Nginx做了很多扩展,类似淘宝的Tengine。为什么我们不直接使用Nginx呢?因为在Openresty上,我们可以做更多事情。
  • Logstash:日志收集,结构化数据后,push到Elasticsearch中,基于JRuby。可使用其它日志收集工具替代,比如Beats
  • Elasticsearch:分布式搜索引擎,基于Lucene
  • Kibana:用于可视化数据,基于NodeJs

日志分析平台开发所需要工具

  • Ansible 2.0+:简单的自动化配置工具,运维工具。关于自动化配置还有什么好说的呢?
  • Vagrant:操作系统虚拟化工具,开发时使用。如果没有听过,Docker总听过吧。这家伙就和Docker完全类似的功能,也早于Docker出现。
  • 一个简单的支持yml格式高亮的文本编辑器,比如Atom
  • 自行下载JDK8:jdk-8u66-linux-x64.tar.gz放到项目路径:provision/roles/jdk8/files/jdk-8u66-linux-x64.tar.gz P.S. 抱歉这个的确需要你自己下。
  • 什么?不用写代码吗?的确不用需要写。如果你要扩展这个雏形就会需要写一些脚本。

启动一台服务器

因为我们需要在本地开发好以后,再部署到生产环境,所以,我们需要一台服务器用来做实验。用Vagrant可以在你的开发机上虚拟化一台。clone 下 OSC-AdCenter后,进入项目目录执行:Vagrant up

文件Vagrantfile有描述这台机器的配置:

Vagrant.configure(2) do |config|

  ANSIBLE_RAW_SSH_ARGS = []
  machine_box = "trusty-server-cloudimg-amd64-vagrant-disk1"
  machine_box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.define "oscadcenter" do |machine|
    machine.vm.box = machine_box
    machine.vm.box_url = machine_box_url
    machine.vm.hostname = "oscadcenter"
    machine.vm.network "private_network", ip: "192.168.4.10" ##指定这台机器的IP,只能宿主机能访问
    machine.vm.provider "virtualbox" do |node|
        node.name = "oscadcenter"
        node.memory = 4048
        node.cpus = 2
    end
   end

end

更多关于Vagrantfile:https://www.vagrantup.com/docs/vagrantfile/

Vagrant机器的默认账号密码都是: vagrant,所以你可以使用ssh vagrant@192.168.4.10登录这台机器。也可以使用vagrant命令登录,在Vagrantfile所在目录下执行:vagrant ssh oscadcenter

部署日志分析平台

在你的开发机上,安装好ansible:

服务器准备好了,我们只需要一条命令就可以部署OSC-AdCenter了:

ansible-playbook ./provision/playbook.yml  -i ./provision/inventory  -u vagrant -k

然后输入ssh登录密码:vagrant

简单说明:

  • ansible-playbook是ansible的一个命令

  • ./provision/playbook.yml是描述你的服务器配置的文本,你可以想像成所有的部署脚本都写在这个文件中

  • ./provision/inventory是服务器在playbook在的host与ip的映射表,比如playbook中这么写:

    ---
    - hosts: adcenter
    

    那么,inventory文件就是这样的:

    [adcenter]
    192.168.4.10
    

    具体请看文档:http://docs.ansible.com/ansible/intro_inventory.html

  • -u vagrant -k 表示使用vagrant账号ssh登录目标机器

部署的这个过程,要看你的网速和elastic源的提供速度,可能会很漫长。 参考时长为半小时。建议执行部署后,做些别的事情,比如午休。

测试部署是否成功

  1. 打开Elasticsearch http://192.168.4.10:9200/_plugin/head/ 可看到界面:

    es

  2. 打开Kibana http://192.168.4.10:5601 可看到界面:

  3. 打开各种浏览器,输入url:http://192.168.4.10/1.gif?account=oschina&e=pv&p=p233444&url=www.oschina.net&title=学习&sh=1200&sw=800&cd=400&lang=en,然后可在Elasticsearch中和kibana中看到相应的数据

我使用Chrome访问了两次url,再使用Safari访问了一次。就这样,Elasticsearch中出现了3条数据,而Kibana中我们可统计出,过去4小时中,Chrome占了2/3,而Safari占 1/3。

部署过程都执行了什么?

从部署脚本的入口./provision/playbook.yml看:

- hosts: analysis
  sudo: yes
  vars_files:
    - ./vars/base-env.yml
    - ./vars/analysis-logstash.yml

  roles:
    - common # 执行一些基础工作
    - openresty # 安装openresty
    - {role: "analysis-openresty-conf",   nginx_server_conf: "analysis.conf"} # 配置openresty
    - jdk8 # 安装jdk8,并设置JAVA_HOME到 /etc/profile中
    - ansible-role-elasticsearch  #安装 es
    - ansible-role-kibana-4 # 安装kibana4
    - ansible-logstash # 安装logstash

这里的ELK的role都是从Ansible 的 Galaxy上download下来的。

然后呢?

  1. 学习Kibana的查询语法,根据业务需求来统计分析日志。
  2. 对当前的日志分析平台实施监控,哪天系统挂了,你都不知道。
  3. 与现在有的系统结合。
  4. 解决当单个Elasticsearch,特别庞大时的扩容问题

最后

好吧,如果你不会Ansible,你半小时可能搞不定。所以,我说的半小时,其实并不科学。但是这也恰恰说明了使用的自动化配置的好处。我一个运维外行,利用Ansible两三天就搭建好了一个简单日志分析平台。

而且如果你要在生产环境使用这套系统,你只需要在线上准备一台干净的ubuntu服务器,修改inventory文件的IP就可以了。

现实中的日志分析平台一定不会这么简单的,本次教程,只是抛砖引玉。

附:项目源代码位置 http://git.oschina.net/zacker330/OSC-AdCenter

© 著作权归作者所有

共有 人打赏支持
翟志军

翟志军

粉丝 338
博文 75
码字总数 79851
作品 2
深圳
程序员
加载中

评论(11)

翟志军
翟志军

引用来自“gloomyzerg”的评论

这里有一个问题,logstash从每台机器收集日志到es中间最好再加一个队列,如redis。否则日后如果需要处理日志,比如修改格式或者分别倒入到es和其他某地方做处理的时候会很麻烦,及时你是用ansible批量处理logstash的配置。很多刚开始使用的elk的很容易掉这个坑

我知道要用redis做缓冲啊。而修改格式问题,只要在logstash处理时加上日志版本就好了。不过好像现在用beats是趋势
gloomyzerg
gloomyzerg

引用来自“曾经的十字镐”的评论

其实日志收集有多种方式,你讲的这种方式,也不是很轻量级,我觉得对于一般的公司,日志1天远远达不到1G,顶多有个百十来MB,其实用shell就可以搞定,当然你也可以结合Flume放到Mongodb当中或是ES当中,后期可以使用Echarts这样的图标工具显示,也是比较方便的。

百十来M的日志最好就别用日志收集了,用个计划任务scp到一个地方合并一下就行了,再导入其他工具
gloomyzerg
gloomyzerg
这里有一个问题,logstash从每台机器收集日志到es中间最好再加一个队列,如redis。否则日后如果需要处理日志,比如修改格式或者分别倒入到es和其他某地方做处理的时候会很麻烦,及时你是用ansible批量处理logstash的配置。很多刚开始使用的elk的很容易掉这个坑
雨翔河
雨翔河
点赞
快乐起航2020
快乐起航2020
不懂啊
翟志军
翟志军

引用来自“jeffsui”的评论

图是什么画的?

回复@jeffsui : 画图神器: Keynote
12叔
12叔
docker 更快点 3分钟吧
jeffsui
jeffsui
图是什么画的?
翟志军
翟志军

引用来自“成熟的毛毛虫”的评论

一定要用Openresty吗?
不一定。还没有调研。
曾经的十字镐
曾经的十字镐
其实日志收集有多种方式,你讲的这种方式,也不是很轻量级,我觉得对于一般的公司,日志1天远远达不到1G,顶多有个百十来MB,其实用shell就可以搞定,当然你也可以结合Flume放到Mongodb当中或是ES当中,后期可以使用Echarts这样的图标工具显示,也是比较方便的。
VMware + JunOS + Linux 搭建安全测试平台

众所周知VMareWorkStion 是一个强大的桌面型的虚拟化软件,比较可以建立Windows虚拟机、Linux虚拟机、甚至各网络操作系统,比如CISCO ASA 、Juniper SRX等。并且可以利用VMWare自身的虚拟网卡...

arckyli ⋅ 2017/09/26 ⋅ 0

互联网亿级日志实时分析平台—ELK

一,前言 人们常常说数据如金,可是,能被利用起的数据,才是“金”。而互联网的数据,常常以日志的媒介的形式存在,并需要从中提取其中的"数据"。 从这些数据中,我们可以做用户画像(每个用...

顶风走千里 ⋅ 2017/11/29 ⋅ 0

数据产品经理生存指南第一条

最近两年,数据产品经理这个名词开始越来越多的出现在各公司的招聘列表中。也经常有朋友问我,有没有合适的数据产品经理介绍? 出于职业的习惯,我通常会问这么几个问题: 你们公司做什么业务...

刘洋 ⋅ 2016/12/05 ⋅ 0

构建Hadoop+Hbase+ZooKeeper分布式存储

前言* Hadoop是Apache开源组织的一个分布式计算开源框架,在很多大型网站上都已经得到了应用,如亚马逊、Facebook和Yahoo等等。对于我来说,最近的一个使用点就是服务集成平台的日志分析。服...

wgkgood ⋅ 2017/02/21 ⋅ 0

有赞大数据实践: 敏捷型数据仓库的构建及其应用

前言 互联网公司一般发展迅速. 一方面, 业务飞速发展, 当前应用的形式和模型每天都在变化; 企业的产品也在经历不断的下线上线过程. 数据仓库如何拥抱变化, 是难点之一. 互联网的运营人员从了...

xrzs ⋅ 2012/07/28 ⋅ 0

《前言 :一个典型的大数据平台架构》

先前声明: 1、这个文章的架构和思路其实是源于14年,由于spark的快速发展,目前方案已经有些陈旧,但仍是一般公司常用的架构。 2、有哪些地方有问题,欢迎指教:) 3、将是一系列个人总结感...

王二铁 ⋅ 2016/04/18 ⋅ 0

CTO详细讲解海量日志处理ELK

ELK实时日志分析平台之Elasticsearch简介 Elasticsearch是一个高度灵活的开源全文检索和分析引擎。它能够迅速(几乎是实时地)地存储、查找和分析大规模数据。通常被用在有复杂的搜索要求的系...

Java架构分享 ⋅ 05/23 ⋅ 0

百万行数据如何进行稽核

大家好,我这么在处理数据时遇到一个问题: 有一张表,每天会产生800万行日志,我现在将这张表每半小时读取一次,将日志表中缺少的字段补全后存入另外一张表,现在存在的问题是 日志中的数据...

text_android ⋅ 2014/04/22 ⋅ 4

linux监控平台搭建-监控项

本人运维某生态互联网监控平台服务。过程中遇见了很多问题。目前互联网有很多的开源监控工具:nagios、zabbix、falcon、cacti...各有优点。这里不讲解监控工具的优缺点。写一些新搭建监控平台...

donkey910614 ⋅ 2017/02/25 ⋅ 0

从零开始搭建ELK+GPE监控预警系统

作者介绍 本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果。 8个平台 100+台服务器 10+个集群分组 微服务600+ 用户...

张志朋 ⋅ 2017/11/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 22分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部