解决方案: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" -> "Submit Request",观察之后右侧栏出现的信息提交成功:有索引、类型、版本等信息,失败:0(成功信息)
测试2如下:点击“复合查询”,选择GET选项,在/2018/test/后面输入上面POST结果中的id号,不要输入任何内容,即{}括号为空!然后点击“Verify JSON”->“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文件,或填写表格提交至其他系统。监控主机和采集主机可以部署在不同的计算机上,也可以部署在同一台计算机上,通过网络接口实现数据传输。