解决方案:ELK实时日志分析平台环境部署

优采云 发布时间: 2022-11-22 15:30

  解决方案:ELK实时日志分析平台环境部署

  一、概念介绍

  日志主要包括系统日志、应用日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息,检查配置过程中的错误及错误原因。经常分析日志可以帮助您了解服务器的负载、性能安全,并及时采取措施纠正错误。

  通常,日志分布并存储在不同的设备上。如果您管理着数十台或数百台服务器,您仍然使用轮流登录每台机器的传统方法查看日志。这样是不是感觉很麻烦,效率很低。当务之急,我们使用集中式的日志管理,比如开源的syslog,采集

汇总所有服务器上的日志。

  日志集中管理后,日志的统计和检索就成了一件比较麻烦的事情。一般我们可以使用grep、awk、wc等Linux命令来实现检索和统计,但是对于要求比较高的查询、排序、统计等。而且机器数量庞大,用这种方法还是有点力不从心。

  通过日志的集中管理,我们需要采集

汇总所有机器上的日志信息。完整的日志数据有很重要的作用:

  那么,有没有办法解决日志的采集

、统计和检索呢?开源的实时日志分析ELK平台可以完美的解决我们以上的问题。

  简单的说,ELK是Elasticsearch、Logstash和Kibana这三个开源工具的首字母缩写。

  1.弹性搜索

  Elasticsearch是一个开源的基于Lucene的开源实时分布式搜索分析引擎工具。它使您能够以前所未有的速度和规模探索您的数据。其特点是:分布式、零配置、自动发现、索引自动分片、方便的集群配置等。索引复制机制、restful风格接口、多数据源、自动搜索负载等。它提供了一个分布式多用户能力的全-基于 RESTful Web 界面的文本搜索引擎。Elasticsearch 使用 Java 开发并根据 Apache 许可条款作为开源发布,是第二受欢迎的企业搜索引擎。专为云计算设计,可实现实时搜索,稳定可靠,速度快,安装使用方便。在 Elasticsearch 中,所有节点的数据都是平等的。

  (1) 关于集群配置

  discovery.zen.ping.unicast.hosts: ["host1", "host2"]

discovery.zen.minimum_master_nodes: 2

discovery.zen.ping_timeout: 10

  (2) 关于集群节点

  (3)关于内存 Elasticsearch默认内存为1GB,对于任何业务部署来说都太小了。通过指定ES_HEAP_SIZE环境变量,可以修改其堆内存大小。服务进程在启动时会读取这个变量,并相应地设置堆大小。Elasticsearch 建议设置系统内存的一半,但不要超过 32GB。

  (4)关于硬盘空间 Elasticsearch将数据存储在一个自定义的路径中。随着数据的增长,会出现硬盘空间不足的情况。这时候需要给机器挂载一个新的硬盘,把Elasticsearch的路径修改为新硬盘的路径。通过“path.data”配置项设置,如“path.data:/elk/elasticsearch/data”。需要注意的是,同一个分片下的数据只能写入一个路径,所以还是要合理规划。

  (5)关于Index的划分和分片的数量,这个需要根据数据量来权衡。索引可以按时间划分,比如每月一个,每天一个。在Logstash输出的时候配置,分片个数也需要配置。好控制。

  (6)关于监控,这里我使用了两个监控插件head和kopf。

  2.日志存储

  Logstash 是一个开源的日志采集

工具和数据管道。它主要用于采集

、解析和分析各种系统产生的大量结构化和非结构化数据和事件。它可以采集

、过滤、分析和存储您的日志供以后使用(例如搜索),我们也可以使用它。说到搜索,logstash 带有一个 web 界面来搜索和显示所有日志。

  Logstash工作原理展示图:

  (一)常用输入输入

  (2) 常用过滤滤芯

  (3) 公共输出输出

  (4) 常用编*敏*感*词*codecs

  (5) 采集

日志信息

  pattern => "^\[" # 采集以"["开头的日志信息

pattern => "^2018" # 采集以"2018"开头的日志信息

pattern => "^[a-zA-Z0-9]" # 采集以字母(大小写)或数字开头的日志信息

pattern => "^[a-zA-Z0-9]|[^ ]+" # 采集以字母(大小写)或数字或空格的日志信息

  3.基巴纳

  Kibana 是一个开源的基于浏览器的 Elasticsearch 前端展示工具。Kibana 可以为 Logstash 和 ElasticSearch 提供友好的日志分析 Web 界面,可以帮助我们汇总、分析和搜索重要的数据日志,也可以通过柱状图、地图、饼图等图形和表格来表达数据。只需轻点鼠标,即可完成搜索和聚合功能,生成令人眼花缭乱的仪表盘。Kibana 提供了数据查询和展示的 web 服务。丰富的图表模板,可以满足大部分数据可视化需求。这也是很多人选择ELK的主要原因之一。

  在 5.0 版本之后,由于引入了 Beats 套件,Elastic 将原来的 ELK Stack 称为 Elastic Stack。

  官方网站:

  ELK工作原理展示图:

  如上图所示:多个应用服务器上的日志通过Logstash采集

器传输到一个集中的索引器,索引器将处理后的数据结果输出到ElasticSearch集群,然后Kibana在ElasticSearch集群中查询日志数据创建仪表盘用于视觉呈现。

  2.ELK总体规划

  ELK中的三个系统各司其职,形成一个整体的解决方案。Logstash是一个ETL工具,负责抓取每台机器的日志数据,将数据进行转换处理,输出到Elasticsearch进行存储。Elasticsearch是一个分布式的数据存储搜索引擎和分析引擎,提供实时数据查询。Kibana是一种数据可视化服务,根据用户操作从Elasticsearch中查询数据,形成相应的分析结果,并以图表的形式呈现给用户。ELK的安装非常简单。您可以按照“下载->修改配置文件->启动”的方式分别部署三个系统,也可以使用Docker快速部署。我们来看一个常见的部署方案,如下图所示:

  在每台生成日志文件的机器上,部署 Logstash。作为Shipper,负责从日志文件中提取数据,但不做任何处理,直接将数据输出到Redis队列(列表);需要一台机器部署 Logstash ,作为 Indexer 的角色,负责从 Redis 中取出数据,对数据进行格式化处理,输出到 Elasticsearch 进行存储;部署Elasticsearch集群要看你的数据量,当然,如果数据量小,可以用单机来做服务,如果做集群,最好3个节点以上,还需要部署相关监控插件;部署Kibana服务,提供网页可视化展示服务。

  部署前期主要工作是部署Logstash节点和Elasticsearch集群。在后期的使用中,主要工作是Elasticsearch集群的监控以及使用Kibana进行日志数据的检索和分析。当然你也可以直接写程序消费Elasticsearch。数据。

  在上面的部署方案中,我们将Logstash分为Shipper和Indexer来完成不同的任务,中间使用Redis作为数据管道。我们为什么要做这个?为什么不直接在每台机器上使用 Logstash 来提取数据,处理数据,然后存储在 Elasticsearch 中呢?

  首先,采用这样的架构部署有三个好处:

  减少对日志所在机器的影响。这些机器一般都部署了反向代理或者应用服务,本身负载就很大,尽量少在这些机器上做。如果需要采集日志的机器很多,那么让每台机器不断向Elasticsearch写入数据势必会对Elasticsearch造成压力,所以需要对数据进行缓冲。同时,这样的缓冲也能在一定程度上保护数据。丢失的。将日志数据的格式化和处理放在Indexer中统一完成,可以修改代码部署在一处,避免在多台机器上修改配置。

  其次,我们需要做的是将数据放入一个消息队列中进行缓冲,所以Redis只是其中一种选择,还可以是RabbitMQ、Kafka等,在实际生产中使用较多的是Redis和Kafka。由于Redis集群一般都是按key切分的,不可能做list类型的集群,在数据量大的时候肯定不适合,而且kafka本质上是一个分布式消息队列系统。

  三、ELK环境部署 一、基础环境介绍

  # 系统: Centos7.3

[root@elk-01 ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

# 防火墙: 关闭

[root@elk-01 ~]# systemctl stop firewalld && systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# Sellinux: 关闭

[root@elk-01 ~]# setenforce 0

[root@elk-01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 机器环境: 两台

elk-01: 192.168.8.55 # master机器

elk-02: 192.168.8.66 # slave机器

  说明:主从模式:master采集

日志后,会将部分数据分片给slave(随机的一部分数据);同时,master和slave都会制作自己的副本,并将副本放到对方机器上,这样就保证了数据不会丢失。如果master挂了,那么client可以在日志采集配置中将Elasticsearch主机改为slave,这样可以保证ELK日志的正常采集和web展示

  2. Elasticsearch安装配置

  Elasticsearch是java程序,必须运行在jdk1.8或以上elk-01和elk-02才能同时运行

  (1)写hosts文件

  [root@elk-01 ~]# echo "192.168.8.55 elk-01" >> /etc/hosts

[root@elk-02 ~]# echo "192.168.8.66 elk-02" >> /etc/hosts

  (2)安装jdk1.8版本

  [root@elk-01 ~]# yum -y install java-1.8.0

[root@elk-01 ~]# java -version

openjdk version "1.8.0_102"

OpenJDK Runtime Environment (build 1.8.0_102-b14)

OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

  (3) 安装Elasticsearch

  [root@elk-01 ~]# wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.6/elasticsearch-2.4.6.tar.gz

[root@elk-01 ~]# mkdir /elk

[root@elk-01 ~]# tar zxvf elasticsearch-2.4.6.tar.gz -C /elk

[root@elk-01 ~]# cd /elk/

[root@elk-01 elk]# ls

elasticsearch-2.4.6

[root@elk-01 elk]# mv ./elasticsearch-2.4.6 ./elasticsearch

  (4)修改Elasticsearch配置文件

  [root@elk-01 ~]# vim /elk/elasticsearch/config/elasticsearch.yml #将配置文件内容修改如下,打开注释

17 cluster.name: test-ELK # 配置集群名,两台服务器名保持一致

23 node.name: elk-01 # 配置单一节点名称,每个节点唯一标识

33 path.data: /elk/elasticsearch/data # data存储路径

37 path.logs: /elk/elasticsearch/logs #log存储路径

43 bootstrap.memory_lock: true # 锁住内存,不被使用到交换分区去

<p>

" />

54 network.host: 0.0.0.0 # *敏*感*词*地址

58 http.port: 9200 # *敏*感*词*端口

68 discovery.zen.ping.unicast.hosts: ["192.168.8.66"] # 集群节点发现列表,写另外一台的ip

72 discovery.zen.minimum_master_nodes: 2 # 集群可做master的最小节点数

[root@elk-01 ~]# mkdir -p /elk/elasticsearch/{data,logs}

</p>

  (5) 修改系统参数

  [root@elk-01 ~]# vim /etc/security/limits.conf --文件最后添加系统参数,让系统用户打开文件无限制

# 添加配置

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

* soft memlock unlimited

* hard memlock unlimited

[root@elk-01 ~]# vim /etc/sysctl.conf --在此文件里加入以下参数

# 添加配置

vm.max_map_count= 262144

[root@elk-01 ~]# sysctl -p --刷新

vm.max_map_count = 262144

  (6) 开设账户并启动Elasticsearch服务

  使用root账户启动Elasticsearch时,会出现错误信息。这是因为它是系统安装考虑的设置。由于Elasticsearch可以接收并执行用户输入的脚本,出于系统安全考虑,不允许root账户启动,所以建议为Elasticsearch单独创建一个。运行 Elasticsearch 的用户。

  # 创建elk用户组及elk用户

[root@elk-01 ~]# groupadd elk

[root@elk-01 ~]# useradd elk -g elk -p 123

[root@elk-01 ~]# chown -R elk.elk /elk/elasticsearch

[root@elk-01 ~]# su - elk

上一次登录:六 5月 5 11:08:30 CST 2018pts/5 上

[elk@elk-01 ~]$ cd /elk/elasticsearch/

[elk@elk-01 elasticsearch]$ nohup ./bin/elasticsearch &

[1] 3503

[elk@elk-01 elasticsearch]$ nohup: 忽略输入并把输出追加到"nohup.out"

[root@elk-01 ~]# netstat -antlp |egrep "9200|9300"

tcp6 0 0 :::9200 :::* LISTEN 1608/java

tcp6 0 0 :::9300 :::* LISTEN 1608/java

tcp6 0 1 192.168.8.66:47992 192.168.8.55:9300 SYN_SENT 1608/java

tcp6 0 0 192.168.8.66:9200 192.168.8.1:2015 ESTABLISHED 1608/java

  如果启动失败,您将在 syslog(在我们的示例中为 /var/log/messages)中遇到类似于以下内容的错误:

  Apr 9 15:39:09 elk-02 kernel: [ 3727] 1000 3727 784748 214244 617 70749 0 java

Apr 9 15:39:09 elk-02 kernel: Out of memory: Kill process 3727 (java) score 368 or sacrifice child

Apr 9 15:39:09 elk-02 kernel: Killed process 3727 (java) total-vm:3138992kB, anon-rss:849016kB, file-rss:7960kB, shmem-rss:0kB

  此错误的原因是低内存耗尽。”内核使用low memory来跟踪所有的内存分配,一旦low memory耗尽,它会kill掉进程以保持系统正常运行。说白了,OOM Killer是一种防止Linux内存不足的保护机制.如果没有大问题,杀掉不相关的进程,最简单的办法就是增加内存空间。

  (7) 访问Elasticsearch

  http://192.168.8.55:9200/

http://192.168.8.66:9200/

  浏览器访问结果(推荐chrome和firefox浏览器访问)

  3.安装Elasticsearch-head插件

  elasticsearch-head 是一个 Web 前端,用于浏览 Elasticsearch 集群并与之交互。即用于显示集群节点和数据信息。

  Elasticsearch 5及以上的head插件(可自行研究)不再通过elasticsearch-plugin安装,成为独立服务,需要单独安装。安装方法请参考GitHub官网。

  在Elasticsearch 5之前的版本,安装比较简单。安装成功后,可以在浏览器中通过:9200/_plugin/head访问。这里的 IP 地址就是你的 Elasticsearch 服务器地址。查看官方文档。具体安装如下:

  [root@elk-01 ~]# /elk/elasticsearch/bin/plugin install mobz/elasticsearch-head

-> Installing mobz/elasticsearch-head...

Trying https://github.com/mobz/elasticsearch-head/archive/master.zip ...

Downloading .............................................................................................................................DONE

Verifying https://github.com/mobz/elasticsearch-head/archive/master.zip checksums if available ...

NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)

Installed head into /elk/elasticsearch/plugins/head

  插件安装目录:/elk/elasticsearch/plugins 在线安装完成后,授予权限

  [root@elk-01 ~]# chown -R elk:elk /elk/elasticsearch/plugins

[root@elk-01 ~]# ll /elk/elasticsearch/plugins/head/

  插件接入(最好提前安装好elk-02节点的配置和插件,然后进行接入和数据插入测试)

  http://192.168.8.55:9200/_plugin/head/

http://192.168.8.66:9200/_plugin/head/

  **注:**ES集群健康分为三种颜色:红、黄、绿。红色:个别分片副本不可用 ×××:个别副本不可用 绿色:健康

  两台机器看到的内容完全一样,test-ELK是集群的名字,集群的健康值为绿色。

  测试一个数据实例,看界面是否能正常显示如下: 点击“复合查询”,在POST选项下,输入任意如/2018/test,然后在下面输入数据(注意内容之间要有逗号)不容错过);输入数据后(输入"user":"xiaozuo","mess":"test Elasticsearch"内容如下),点击"Verify JSON" -&gt; "Submit Request",观察之后右侧栏出现的信息提交成功:有索引、类型、版本等信息,失败:0(成功信息)

  测试2如下:点击“复合查询”,选择GET选项,在/2018/test/后面输入上面POST结果中的id号,不要输入任何内容,即{}括号为空!然后点击“Verify JSON”-&gt;“Submit Request”,观察右栏上面插入的数据(即xiaozuo,测试Elasticsearch)

  点击“基本查询”查看数据,如下图,可以查询上面插入的数据:

  点击“数据视图”可以查看插入的数据:

  点击“Overview”,主界面也会更新,显示刚刚创建的类型,以及访问数据碎片的位置:

  每个索引有5个分片,粗线的分片是主节点分片,细线的是副本分片。这样kibana在搜索的时候可以从多个Elasticsearch服务器读取,压力也按比例分配到各个集群节点上。

  注意:一定要提前在elk-02节点上完成配置(配置内容同上)。如果没有建立集群,只能看到一个节点,往上面插入数据后,Elasticsearch集群状态会显示×××*敏*感*词*状态,elk-02配置完成后会恢复正常绿色状态,加入集群。当数据不多时,也可以通过Elasticsearch服务器来完成任务。但是数据会随着时间的推移而增加,尤其是当你需要查询跨越6个月、一年甚至更长时间的数据时,你会发现集群是多么的重要。

  4.安装kopf监控插件

  Kopf展示了ElasticSearch的节点碎片、文档、占用空间、大小等信息,可以查询文档的索引。

  [root@elk-01 ~]# /elk/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

-> Installing lmenezes/elasticsearch-kopf...

Trying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip ...

<p>

" />

Downloading .............................................................................................................................DONE

Verifying https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip checksums if available ...

NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify)

Installed kopf into /elk/elasticsearch/plugins/kopf

# 授予权限

[root@elk-01 ~]# chown -R elk:elk /elk/elasticsearch/plugins

[root@elk-01 ~]# ll /elk/elasticsearch/plugins/kopf/

</p>

  接入插件:(如下,也要提前在elk-02节点上安装插件,否则接入时会出现集群节点为×××的*敏*感*词*告警状态)

  http://192.168.8.55:9200/_plugin/kopf/#!/cluster

http://192.168.8.66:9200/_plugin/kopf/#!/cluster

  至此,Elasticsearch包安装完成。

  5.Logstash安装配置

  elk-01 和 elk-02 都必须安装。同时在每台产生日志文件的机器上部署Logstash,将采集到的数据写入Elasticsearch,可以登录Logstash界面查看)

  (1) 安装Logstash

  [root@elk-01 ~]# wget https://download.elastic.co/logstash/logstash/logstash-2.4.1.tar.gz

[root@elk-01 ~]# tar zxvf logstash-2.4.1.tar.gz -C /elk/

[root@elk-01 ~]# mv /elk/logstash-2.4.1/ /elk/logstash/

[root@elk-01 ~]# useradd logstash -s /sbin/nologin

[root@elk-01 ~]# chown -R logstash.logstash /elk/logstash/

  (2) 数据测试

  测试一个基本的输入输出,验证logstash是否可以接收数据。

  [root@elk-01 ~]# /elk/logstash/bin/logstash -e "input { stdin{ } } output { stdout{} }"

Settings: Default pipeline workers: 1

Pipeline main started

xiaozuo # 输入的内容

2018-05-06T07:15:50.140Z elk-01.com xiaozuo # 输出的内容

hello # 输入的内容

2018-05-06T07:16:09.850Z elk-01.com hello # 输出的内容

  在此示例中,我们使用输入插件 stdin 和输出插件 stdout 运行 Logstash,因此无论您输入什么,输出都是相同的。使用-e参数可以在命令行快速测试配置是否正确。

  测试2使用rubydebug详细输出

  [root@elk-01 ~]# /elk/logstash/bin/logstash -e "input { stdin{} } output { stdout{ codec => rubydebug} }"

Settings: Default pipeline workers: 1

Pipeline main started

hello # 输入的内容

{ # 输出下面信息

"message" => "hello",

"@version" => "1",

"@timestamp" => "2018-05-06T07:23:16.933Z",

"host" => "elk-01.com"

}

xiaozuoxiansen # 输入的内容

{ # 输出下面信息

"message" => "xiaozuoxiansen",

"@version" => "1",

"@timestamp" => "2018-05-06T07:23:48.631Z",

"host" => "elk-01.com"

}

  测试三写入内容到Elasticsearch

  [root@elk-01 ~]# /elk/logstash/bin/logstash -e "input { stdin{} } output { elasticsearch { hosts => ['192.168.8.55:9200']} }"

Settings: Default pipeline workers: 1

Pipeline main started

123456 # 随意输入内容

xiaozuo

hello

  说明:使用rubydebug和写入elasticsearch的区别:其实就是后面标准输出的区别,前者使用codec;后者使用elasticsearch。

  写入Elasticsearch,在Logstash中查看,如下图:

  注意:master采集

日志后,会将部分数据分片给slave(随机的一部分数据),master和slave都会各自制作副本,并将副本放在另一台机器上,所以以确保数据不会丢失。如下,master采集的数据放在自己的0、2、4分片上,其他的放在slave的1、3号分片上。

  然后点击“数据视图”可以看到刚才输入的内容:

  (3)Logstash配置及文件写入

  1)Logstash的配置很简单:

  [root@elk-01 ~]# mkdir /elk/logstash/conf.d/

[root@elk-01 ~]# vim /elk/logstash/conf.d/01-logstash.conf

input { stdin { } }

output {

elasticsearch { hosts => ["192.168.8.55:9200"]}

stdout { codec => rubydebug }

}

  结果:

  [root@elk-01 ~]# /elk/logstash/bin/logstash -f /elk/logstash/conf.d/01-logstash.conf

Settings: Default pipeline workers: 1

Pipeline main started

ShenZhen # 随意输入内容

{ # 输出下面的信息

"message" => "ShenZhen",

"@version" => "1",

"@timestamp" => "2018-05-06T07:59:40.650Z",

"host" => "elk-01.com"

}

  再次点击“数据视图”,可以看到刚才输入的内容:

  整套解决方案:自动实时增量采集解决方案

  如果您需要监控和采集

招标采购信息;或需要监控和采集

财经新闻;或需要监控和采集

招聘招生内容;或者需要监测和采集

舆情内容。请继续往下看,目的是及时发现网站的更新内容,并在极短的时间内完成自动采集数据。

  

" />

  由于每个网站的内容格式不同,需要有针对性地定制数据采集方案。

  

" />

  1、实时监控、更新、采集内容的原则:首先在监控主机上运行网站信息监控软件,添加需要监控的网址,主要监控网站的首页或栏目列表页。当发现更新时,更新后的新闻标题和链接会立即发送到采集主机。采集主机收到新闻链接后,会自动用木浏览器打开网页,采集新闻标题和正文内容,然后保存到数据库或导出Excel文件,或填写表格提交至其他系统。监控主机和采集主机可以部署在不同的计算机上,也可以部署在同一台计算机上,通过网络接口实现数据传输。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线