当前位置:首页 > 燃气灶 > 文章正文

ELK有坑切切别踩

编辑:[db:作者] 时间:2024-08-25 07:36:26

2台做elasticsearch的主副节点

1台做kibana和elasticsearch_head 由于机器匮乏我还在这台机器上支配了logstash和nginx做事(虽然下面的架构中都提到了redis等缓存,但是暂时没有加该做事,后期会研究添加上的)

先说目的:将nginx的日志通过logstash网络后发送到ela,然后kibana进行展示

ELK有坑切切别踩

环境如下elasticsearch master 10.5.2.175:9200elasticsearch salve 10.5.2.176:9200logstash 172.17.211.153 启动命令: nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/agent.conf -w 10 -l /usr/local/logstash/logs/logstash-plain.log &nginx es-head: 172.16.211.143:9100kibana: 172.16.211.143:5601

架构如下:

加redis/kafa的缘故原由:在生产环境中,我们的日志可能会有瞬时高峰,而这个时候如果直接存入es,可能会导致es承受不住,从而影响日志的网络和查询。

一样平常情形下,我们会将日志存直接放到kafka或者redis这种读写性能非常高的运用中,作为一个缓存,然后通过下贱组件(例如logstash)进行消费、过滤后存入ES,然后通过可视化界面查看。

ELK的事情流程logstash客户端网络到日志后将日志存入到redis之类的缓存中Logstash_server将数据从redis中提取出来并根据/usr/local/logstash/patterns下的文件(文件名随意取)这里叫grok-patterns里面根据不同的日志,比如apache、nginx做事规定的不同格式来进行切割,切割完毕后将日志存入到elastaicsearch中,格式里面的key vlaue值便是els中的字段和值elastaicsearch对logstash_server发送过来的值进行集群保存,供应被调用接口以及快速的搜索做事(这里还可以安装分词插件,当做搜索引擎)kibana对es根据条件进行搜索并对搜索到的数据进行展示,使我们看起来更加直不雅观。
一、elasticsearch

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 根本之上。
Lucene 可以说是当下最前辈、高性能、全功能的搜索引擎库—无论是开源还是私有。

中文文档https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html#intro

elasticsearch的安装

详细安装可以参考https://www.cnblogs.com/yanjieli/p/11187430.html这个教程,这里直说下配置和思路,首先懂思路,安装看教程就行。

须要有jdk环境vim /etc/elasticsearch/jvm.options2g2g1.vim /etc/elasticsearch/elasticsearch.ymlhttp.port: 9200discovery.zen.ping.unicast.hosts: ["10.5.2.175","10.5.2.176"]network.host: 10.5.2.1752.vim /etc/systemd/system.confDefaultLimitNOFILE=65536DefaultLimitNPROC=32000DefaultLimitMEMLOCK=infinity3.vim /etc/security/limits.conf soft nofile 65536 hard nofile 65536 soft nproc 32000 hard nproc 32000 hard memlock unlimited soft memlock unlimited4.vim /etc/sysconfig/elasticsearchJAVA_HOME=/usr/java/jdk1.8.0_1515.vim /usr/lib/systemd/system/elasticsearch.service[Service]LimitMEMLOCK=infinityelasticsearch的问题

启动elasticsearch失落败,报找不到JAVA环境,可明明系统是有的 办理方法如下:

vim /etc/sysconfig/elasticsearchJAVA_HOME=/usr/java/jdk1.8.0_151elasticsearch的观点

index 索引 相称于数据库里的“数据库” 他是我们存储和索引关联数据的地方

type 类数据 将一类的数据放到一起 相称于数据库中的“表”

id 相称于数据库表中的一行

Elastic 实质上是一个分布式数据库,许可多台做事器协同事情,每台做事器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。
一组节点构成一个集群(cluster)。
Elastic 会索引所有字段,经由处理后写入一个反向索引(Inverted Index)。
查找数据的时候,直接查找该索引。
倒排索引(反向索引)原始文档创建倒排索引列表倒排索引创建索引的流程:1) 首先把所有的原始数据进行编号,形成文档列表2) 把文档数据进行分词,得到很多的词条,以词条为索引。
保存包含这些词条的文档的编号信息。
搜索的过程:当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。
找到这些词条就能找到包含这些词条的所有文档的编号。
然后根据这些编号去文档列表中找到文档以是,Elastic 数据管理的顶层单位就叫做 Index(索引)。
它是单个数据库的同义词。
每个 Index (即数据库)的名字必须是小写。

下面的命令可以查看当前节点的所有 Index。

$ curl -X GET 'http://localhost:9200/_cat/indices?v

index 索引 相称于数据库里的“数据库” 他是我们存储和索引关联数据的地方

type 类数据 将一类的数据放到一起 相称于数据库中的“表”

id 相称于数据库表中的一行

pertty 在网页中格式化输出相应内容

elasticsearch的操作方法

官方教程在这里,我以为这个更加实用官方教程 https://www.cnblogs.com/chuyuan/p/11380744.html

# 增加http://10.5.103.176:9200/database1/table1 { "name": "doudou", "age": 4.5, "weight": 20,}# 查询# 以上方法是精确的但是再增加一个table2的是否发生如下报错http://10.5.103.176:9200/database1/table2{ "name": "dianche1", "weight": 1000}缘故原由是elastic search在6.x版本调度了, 一个index只能存储一种type。

GET /atguigu/_mapping1. 检索文档Mysql : select from user where id = 1ES : GET /atguigu/doc/1相应结果{ "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }}2.大略检索Mysql : select from userES : GET /megacorp/employee/_search3.全文检索ES : GET /megacorp/employee/_search?q=haha查询出所有文档字段值为haha的文档4.搜索(模糊查询)ES : GET /megacorp/employee/_search?q=hello查询出所有文档字段值分词后包含hello的文档5.聚合PUT atguigu/_mapping/doc{ "properties": { "interests": { "type": "text", "fielddata": true } }}elasticsearch-head的安装

ealsticsearch只是后端供应各种api,那么怎么直不雅观的利用它呢?elasticsearch-head将是一款专门针对付elasticsearch的客户端工具,是es的集群管理工具、数据可视化、增编削核对象。
干系详细的教程在这里1 https://www.sojson.com/blog/85.html2 https://www.cnblogs.com/xuwenjin/p/8792919.html3 https://blog.csdn.net/huwei2003/article/details/40581143

一、下载head插件https://github.com/mobz/elasticsearch-head二、解压到任意目录把稳:为避免找不到,一定要和elasticsearch的安装目录区分开三、安装Node.js由于head是一个Node.js项目。
以是,如果没有安装nodejs须要先安装Node.js32位安装包下载地址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.tar.gz64位安装包下载地址: https://nodejs.org/dist/v4.4.3/node-v4.4.3-x64.tar.gz检测PATH环境变量是否配置了Node.js,打开命令行输入命令"which npm",输出如下结果:/usr/bin/npmwget https://nodejs.org/dist/latest-v8.x/node-v8.16.0.tar.gztar xf node-v8.16.0.tar.gzcd node-v8.16.0./configure --prefix=/usr/local/node-v8.16make -j 8 && make install添加环境变量vim /etc/profile################nodejs###############export NODE_HOME=/usr/local/node-v8.16export PATH=$PATH:$NODE_HOME/binsource /etc/profilenode -vv8.16.0npm -v6.4.1四、安装npm yum install npm -y五、es-head安装:解压源码包:elasticsearch-head.tar.gz启动:cd /usr/local/src/elasticsearch-headnpm run start &访问地址是http://{你的ip地址}:9200/_plugin/head/在浏览器中输入:这台机器的ip+端口http://10.5.2.220:9100/

问题办理:在elasticsearch中没有当天的索引

头一天利用过的bj日志第二天无法网络到,缘故原由是昨天logstash已经网络过一遍,就被打过了标签,本日再利用的话,如果这个日志是不再增加的就不会被网络,由于日志中没有新的内容进来,办理方法如下:

在logstash的config文件下的agent.conf加入以下配置start_position =>"beginning"#检讨韶光戳二、kibana措辞设置

vim config/kibana.ymli18n.locale: "en" 或者zh-CN中文systemctl restart kibana重启即可安装配置

重新加载systemctl配置,这个是针对centos7以上利用systemctl kibana restart命令的

systemctl daemon-reload

这里由于是二进制的安装方法,以是要设置一个systemctl start kibana.service的启动方法

1. vim /usr/lib/systemd/system/kibana.service添加以下内容[Unit]Description=KibanaAfter=network.target[Service]ExecStart=/usr/local/kibana/bin/kibanaType=simplePIDFile=/usr/local/kibana/kibana.pidRestart=always#User=es 这里我直策应用root用户进行启动#Group=es[Install]WantedBy=default.target2. 重新加载一下配置文件systemctl daemon-reload3. 启动systemctl start kibana.service4. 访问测试http://10.5.2.220:5601查询语法

参考地址1 参考地址2 参考地址3https://blog.csdn.net/u013958257/article/details/88567581

kibana查询语法基于Lucene

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完全的全文检索引擎,而是一个全文检索引擎的架构,供应了完全的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方措辞)。
Lucene的目的是为软件开拓职员供应一个大略易用的工具包,以方便的在目标系统中实现全文检索的功能,或者因此此为根本建立起完全的全文检索引擎。
Lucene是一套用于全文检索和征采的开源程式库,由Apache软件基金会支持和供应。
Lucene供应了一个大略却强大的运用程式接口,能够做全文索引和征采。
在Java开拓环境里Lucene是一个成熟的免费开源工具。
就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。
人们常常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相稠浊。
Lucene最初是由Doug Cutting开拓的,在SourceForge的网站上供应下载。
在2001年9月作为高质量的开源Java产品加入到Apache软件基金会的 Jakarta家族中

kibana在ELK阵营中用来查询展示数据elasticsearch构建在Lucene之上,过滤器语法和Lucene相同

1. 根据某个字段查询精确匹配: agent:"Mozilla/5.0"如果不带双引号,只要包含指定值就可以搜索到 agent:Mozilla/5.0如果是数值类型没有以上差异2. 数组范围查询[7758794 TO 7758794] 表示即是,原意思是一个区间范围指定区间: response:[100 TO 200]大于即是指天命值的: response:[201 TO ]小于即是指天命值的: response:[ TO 200]3. 从指定时间到现在/或者查询指定时间前数据2015-05-20T09:20:41.943Z之后的数据: @timestamp:{2015-05-20T09:20:41.943Z TO }2015-05-20T09:20:41.943Z之前的数据: @timestamp:{ TO 2015-05-20T09:20:41.943Z }指定时间范围: @timestamp:{2015-05-20T09:20:41.943Z TO 015-05-22T09:20:41.943Z}备注:09:20:41事实上是17:20:41,存在8个小时差4. 正则匹配包含指定值: request:/uploads/不包含指定值: !request:/uploads/5. 逻辑查询AND(与关系数据库一样) request:/uploads/ AND response:404OR(与关系数据库一样) request:/uploads/ OR response:200组合查询: (uid OR token) AND version6. 存在/不存在存在host字段但不存在url字段: _exists_:host AND _missing_:url分外转义字符+ – && || ! () {} [] ^” ~ ? : \

kibana创建索引模式(手动)

https://blog.csdn.net/weixin_34727238/article/details/81540692

当在els中有了当天的索引,就可以到kibana中取创建索引模式了,只是这里供应了一手动创建的办法,无法自动进行,须要本地定义脚本的办法进行自动索引的创建。

等所有索引都创建完毕后,不才面就能看到了

然后不才面这个里面就能看到我们的索引里面的数据情形了,条件是你的logstash成功将切割后的日志发送到了els中

否则便是以下这种的

kibana创建索引模式(自动)

由于logstash客户端运行的问题,只要有当天日志产生,就会将该日志发送给elasticsearch,然后会在elasticsearch里面产生一个新的索引

方法如下:

在kibana节点上写一个脚本,然后设置定时任务实行kibana中索引与elasticsearch的关联vim /usr/local/scripts/kibana_create_index.sh#!/bin/bashtoday=`date +%Y-%m-%d`index_name="nginx-log-${today}.log"curl -X POST -H "kbn-xsrf:reporting" -H "Content-Type: application/json" -d '{"attributes":{"title":"'$log_name'"}}' 'http://172.16.211.143:5601/api/saved_objects/index-pattern'这里碰着一个问题,json中调用变量的问题,一贯调用不到,后来各种查询原来是格式不对json数据里变量要用''括起来<font color=gray size=72>color=gray</font>

json数据里变量要用''括起来https://www.cnblogs.com/landhu/p/7048255.html

ELK 索引生命周期管理问题办理Kibana server is not ready yet涌现的缘故原由

第一点:KB、ES版本不一致(网上大部分都是这么说的)

办理方法:把KB和ES版本调度为统一版本

第二点:kibana.yml中配置有问题(通过查看日志,创造了Error: No Living connections的问题)

办理方法:将配置文件kibana.yml中的elasticsearch.url改为精确的链接,默认为: http://elasticsearch:9200

改为http://自己的IP地址:9200

第三点:浏览器没有缓过来

办理方法:刷新几次浏览器。

终极办理方法:在elasticsearch中删除kibana的干系索引,只是再打开kibana看不到其他了之前创建的图形什么的了

kibana可以做哪些剖析

剖析的必要性:顶级

用户分布PV、UV状态码访问韶光

更多图形看这里https://www.cnblogs.com/hanyifeng/p/5860731.html

比较牛逼一点的教程看这里https://www.bilibili.com/video/BV1TE411A77i?p=6

三、logstashlogstash和filebeat的比拟

Filebeat是网络日志的其余一种办法,二者差异在于以下

Filebeat用于日志网络和传输,比较Logstash更加轻量级和易支配,对系统资源开销更小,日志流架构的话,Filebeat适宜支配在网络的最前端,Logstash比较Filebeat功能更强,可以在Filebeat网络之后,由Logstash进一步做日志的解析,至于kafka也可以考虑添加,然后网络的数据都存放在elasticsearch中。

logstash和filebeat都是可以作为日志采集的工具,目前日志采集的工具有很多种,如fluentd, flume, logstash,betas等等。
乃至末了我决定用filebeat作为日志采集端工具的时候,还有人问我为什么不用flume,logstash等采集工具。
logstash涌现韶光要比filebeat早许多,随着韶光发展,logstash不仅仅是一个日志采集工具,它也是可以作为一个日志搜集工具,有丰富的input|filter|output插件可以利用。
常用的ELK日志采集方案中,大部分的做法便是将所有节点的日志内容上送到kafka行列步队,然后利用logstash集群读取消息行列步队内容,根据配置文件进行过滤。
上送到elasticsearch。
logstash详细信息可前往https://www.elastic.co/logstash是利用Java编写,插件是利用jruby编写,对机器的资源哀求会比较高,网上有一篇关于其性能测试的报告。
之前自己也做过和filebeat的测试比拟。
在采集日志方面,对CPU,内存上都要比前者高很多。
LogStash::Inputs::Syslog 性能测试与优化filebeat也是elastic.公司开拓的,其官方的说法是为了替代logstash-forward。
采取go措辞开拓。
代码开源。
elastic/beats filebeat是beats的一个文件采集工具,目前其官方基于libbeats平台开拓的还有Packetbeat, Metricbeat, Winlogbeat。
filebeat性能非常好,支配大略。
是一个非常空想的文件采集工具。
我自己采集工具也是基于beats源码进行的二次开拓。

https://blog.csdn.net/m0_38120325/article/details/79072921

自动创建elasticsearch的索引

在logstash客户真个配置文件中会有这么一个配置文件

便是会将日志发送到当天日期的索引汇总,没有的话自动创建索引,我们只须要做的便是逐日删除旧的索引。

电子书教程推举:http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/get_start/introduction.html

启动方法 基于最根本的 nohup 办法nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/conf/agent.conf &> /dev/null也可以用daemontools来进行管理安装yum -y install supervisord --enablerepo=epel在 /etc/supervisord.conf 配置文件里添加内容,定义你要启动的程序:[program:elkpro_1]environment=LS_HEAP_SIZE=5000mdirectory=/opt/logstashcommand=/opt/logstash/bin/logstash -f /etc/logstash/pro1.conf --pluginpath /opt/logstash/plugins/ -w 10 -l /var/log/logstash/pro1.log[program:elkpro_2]environment=LS_HEAP_SIZE=5000mdirectory=/opt/logstashcommand=/opt/logstash/bin/logstash -f /etc/logstash/pro2.conf --pluginpath /opt/logstash/plugins/ -w 10 -l /var/log/logstash/pro2.log然后启动 service supervisord start 即可。
logstash 会以 supervisord 子进程的身份运行,你还可以利用 supervisorctl 命令,单独掌握一系列 logstash 子进程中某一个进程的启停操作:supervisorctl stop elkpro_2
关于grok语法

官方给定的语法

https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

https://github.com/elastic/logstash/tree/v1.4.2/patterns

如果你利用的正则措辞可以将nginx日志进行匹配,就可以成功对日志进行切割,效果看下图:

调试的过程中可以利用这个网站来进行正则语法的测试:http://grokdebug.herokuapp.com/

1. 线上配置的信息格式192.168.70.94 跟威信指南中的一样SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:以下这个是Logstash默认自带了Apache标准日志的grok正则表达式:COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}2. 我的nginx日志切割格式NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:tiem_local}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\"MAINNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for}

COMBINEDAPACHELOG 合并的apache日志 logstash客户端用的是这种办法COMMONAPACHELOG 普通的apache日志

当grok匹配失落败的时候,插件会为这个事宜打个tag,默认是_grokparsefailure。
LogStash许可你把这些处理失落败的事宜路由到其他地方做后续的处理input { # ... }filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{IPV4:ip};%{WORD:environment}\] %{LOGLEVEL:log_level} %{GREEDYDATA:message}" } }}output { if "_grokparsefailure" in [tags] { # write events that didn't match to a file file { "path" => "/tmp/grok_failures.txt" } } else { elasticsearch { } }}

看下面赤色的地方,表示grok匹配失落败,才会将tags的标签定义成_grokparsefailure这个默认的

办理说是要设置锚点 目前不懂什么意思 先放到这里

https://www.jianshu.com/p/86133dd66ca4

其余一种说法,暂时不会用,先放着1.if "_grokparsefailure" in [tags] { drop { } }2.match语句跟第一个一样的 没啥要点,看着官网例子搞就行了3.只管即便用grok吧 ,grep功能往后要去掉的。

当时想的其余一种办理方法便是改nginx的日志格式成json形式的,但是我不想用这种方法。

log_format json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"request":"$request",' '"status":"$status",' '"request_method": "$request_method",' '"size":"$body_bytes_sent",' '"request_time":"$request_time",' '"upstreamtime":"$upstream_response_time",' '"upstreamhost":"$upstream_addr",' '"http_host":"$host",' '"url":"$uri",' '"http_forward":"$http_x_forwarded_for",' '"referer":"$http_referer",' '"agent":"$http_user_agent"}';access_log /var/log/nginx/access.log json ;问题办理Nginx日志没有被成功切割的终极缘故原由

以下是两种日志办法: log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$host" "$request_time"'; log_format format2 '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$host" "$request_time"'; 在logstash中进行切割的时候调用的韶光变量是不同的,灵感来自若下: grok { match => { "message" => "%{TIMESTAMP_ISO8601:time}" } }date{ match => ["time", "yyyy-MM-dd HH:mm:ss", "ISO8601"] target => "@timestamp" }mutate{ remove_field => ["time"] }定义:HTTPDATE %{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME} %{INT}TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?#NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{HTTPDATE:time_iso8601}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\"{DATA:http_user_agent}\"NGINX_ACCESS %{IPORHOST:remote_addr} - %{USERNAME:remote_user} \[%{TIMESTAMP_ISO8601:time_iso8601}\] \"%{DATA:request}\" %{INT:status} %{NUMBER:bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\"SYSLOGBASE %{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGFACILITY} )?%{SYSLOGHOST:logsource} %{SYSLOGPROG}:COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %{QS:agent}Nginx中韶光格式1:$time_local 对应logstash中\[%{HTTPDATE:timestamp}\]Nginx中韶光格式2:$time_iso8601 对应logstash中\[%{TIMESTAMP_ISO8601:timestamp}\]

作者:思绸之路

链接:https://www.cnblogs.com/zanao/p/13072595.html

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除,如需转载请保留原文地址:http://www.baanla.com/rqz/179528.html

XML地图 | 自定链接

Copyright 2005-20203 www.baidu.com 版权所有 | 琼ICP备2023011765号-4 | 统计代码

声明:本站所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:123456789@qq.com