一:前言
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat隶属于Beats。目前Beats包含四种工具:
- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
- Filebeat(搜集文件数据)
- Winlogbeat(搜集 Windows 事件日志数据)
二:elasticSearch
2.1:主要特点
1、特点:全文检索,结构化检索,数据统计、分析,接近实时处理,分布式搜索(可部署数百台服务器),处理PB级别的数据搜索纠错,自动完成 2、使用场景:日志搜索,数据聚合,数据监控,报表统计分析 3、国内外使用者:维基百科,Stack Overflow,GitHub
2.2:ES6.1新特性讲解
1、6.1.x版本基于Lucene 7.1.0,更快,性能进一步提升,对应的序列化组件,升级到Jackson 2.8
2、自适应副本选择 在Elasticsearch中,对同一分片的一系列搜索请求将以循环方式转发到主要和每个副本。如果一个节点启动了长时间的垃圾收集,这可能会出现问题 - 搜索请求仍将被转发到缓慢的节点,并且会影响搜索延迟。
在6.1中,我们添加了一个称为自适应副本选择的实验性功能。每个节点跟踪并比较搜索请求到其他节点的时间,并使用这些信息来调整向特定节点发送请求的频率。在我们的基准测试中,这样可以大大提高搜索吞吐量,降低99%的延迟。 这个选项在默认情况下是禁用的
3、推荐使用5.0版本推出的Java REST/HTTP客户端,依赖少,比Transport使用更方便,在基准测试中,性能并不输于Transport客户端,
在5.0到6.0版本中,每次有对应的API更新, 文档中也说明,推荐使用这种方式进行开发使用,所有可用节点间的负载均衡 在节点故障和特定响应代码的情况下进行故障转移,失败的连接处罚(失败的节点是否重试取决于失败的连续次数;失败的失败次数越多,客户端在再次尝试同一节点之前等待的时间越长)
2.3:安装ES
1.linux下使用wget下载jdk8:
代码语言:javascript复制进到目录/usr/local/software
#wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/; oraclelicense=accept-securebackup-cookie"
#"http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"
#vim /etc/profile
加入
export JAVA_HOME=/usr/local/software/jdk8
export JAVA_BIN=/usr/local/software/jdk8
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
使用wget 下载elasticsearch安装包
代码语言:javascript复制wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz
解压
代码语言:javascript复制tar -zxvf elasticsearch-6.2.2.tar.gz
2.4:配置ES出现相关问题处理
1、问题一
代码语言:javascript复制Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/software/temp/elasticsearch-6.2.2/hs_err_pid1912.log
解决:内存不够,动态增加内存
2、问题二
代码语言:javascript复制[root@iZwz95j86y235aroi85ht0Z bin]# ./elasticsearch
[2018-02-22T20:14:04,870][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-6.2.2.jar:6.2.2]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-6.2.2.jar:6.2.2]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.2.2.jar:6.2.2]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.2.2.jar:6.2.2]
解决:用非root用户 添加用户:useradd -m 用户名 然后设置密码 passwd 用户名
3、问题三
代码语言:javascript复制./elasticsearch
Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/software/temp/elasticsearch-6.2.2/config/jvm.options
解决:权限不够 chmod 777 -R 当前es目录
常见配置问题资料:https://www.jianshu.com/p/c5d6ec0f35e0
2.5:ES目录和配置文件介绍
简介:介绍ES目录结构,配置文件基本说明 bin: 启动文件 log: 日志文件,包括运行日志,慢查询日志 config: 核心配置文件 lib: 依赖包 plugins :插件
2.6:ES核心配置文件讲解,性能优化配置
简介:讲解核心配置文件,JVM参数配置,性能优化 健康状态检查:http://localhost:9200/_cluster/health jvm.options 虚拟机参数配置文件,配置heap内存一样
elasticsearch.yml 主配置文件 cluster.name 集群名称,同一个网段自动加入 node.name 节点名称 http.port http端口 注意事项 本地启动多个节点,复制es安装包的时候,需要删除里面data目录里面的资料,不然无法加入集群
2.7:ES基础概念讲解
简介:es的index索引,document文档对象,副本,多节点集群等基础知识 1、通俗的解释: 在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中, 索引名称必须是小写 Relational DB -> Database -> Table -> Row -> Column Elasticsearch -> Indice -> Type -> Document -> Field
2、分片shards: 数据量特大,没有足够大的硬盘空间来一次性存储,且一次性搜索那么多的数据,响应跟不上es提供把数据进行分片存储,这样方便进行拓展和提高吞吐 3、副本replicas: 分片的拷贝,当主分片不可用的时候,副本就充当主分片进行使用
4、Elasticsearch中的每个索引分配5个主分片和1个副本 如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样每个索引总共就有10个分片。
2.8:search搜索语句
简介:讲解URL中的_search搜索语句的基本使用,美化响应结果, 索引的基础操作
集群健康检查
代码语言:javascript复制http://localhost:9200/_cat/health?v
http://localhost:9200/_cluster/health(推荐)
状态说明
代码语言:javascript复制green:正常
yellow: 集群正常 数据正常,部分副本不正常
red: 集群部分正常,数据可能丢失,需要紧急修复
查询节点列表
代码语言:javascript复制http://localhost:9200/_cat/nodes?v
查看所有索引
代码语言:javascript复制http://localhost:9200/_cat/indices?v
目前 集群中没有任何索引
补充: curl -X 指定http的请求方法 有HEAD GET POST PUT DELETE -d 指定要传输的数据 -H 指定http请求头信息
新增索引
代码语言:javascript复制curl -XPUT 'localhost:9201/blog_test?pretty'
curl -XPUT 'localhost:9201/blog?pretty'
删除索引
代码语言:javascript复制curl -XDELETE 'localhost:9200/blog_test?pretty'
新增一条记录,并指定为article类型,ID为1
代码语言:javascript复制curl -XPUT -H "Content-Type: application/json" 'localhost:9201/yaohong/article/2?pretty' -d '
{
"title": "myblog",
"content":"1234567"
}'
代码语言:javascript复制curl -XPUT -H "Content-Type: application/json" 'localhost:9201/yaohong/article/3?pretty' -d '
{
"title": "test",
"content":"testsfsdfdsfdsf",
"PV":23
}'
ID查询记录
代码语言:javascript复制curl -XGET 'localhost:9200/yaohong/article/1'
curl -XGET 'localhost:9200/yaohong/article/1?pretty'(美化推荐)
搜索
代码语言:javascript复制curl -XGET 'http://localhost:9201/yaohong/article/_search?q=title:小A'
2.9:search搜索语句
简介:讲解结构化查询语句DSL的使用,bool,filter查询等
新增数据集
代码语言:javascript复制curl -XPUT -H "Content-Type: application/json" 'localhost:9201/yaohong/article/7?pretty' -d '
{
"title": "elk搭建日志采集系统",
"content":"elk elasticsearch logstash kibana",
"PV":18
}'
什么是query DSL
1、Domain Specific Language 领域特定语言 2、Elasticsearch提供了完整的查询DSL,基于JSON定义查询 3、用于构造复杂的查询语句
curl查询(空格处理不当,会出问题)
代码语言:javascript复制curl -XPOST -H "Content-Type: application/json" 'http://localhost:9201/blog/article/_search' -d '{
"query" : {
"term" : { "title" : "elk" }
}
}'
建议使用postman工具
post方式提交,增加http头信息 body里面选row格式,粘贴对应的dsl即可
bool查询
代码语言:javascript复制{
"query": {
"bool": {
"must": [
{ "match": { "title": "elk" } }
],
"must_not": [
{ "match": { "title": "小D" } }
]
}
}
}
filter查询 参考地址:https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-filtered-query.html
代码语言:javascript复制{
"query": {
"bool": {
"filter": {
"range": {
"PV": {
"gt": 15
}
}
},
"must": {
"match": {
"title": "ELK"
}
}
}
}
}
总结:(官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html)
1、大部分filter的速度快于query的速度 2、filter不会计算相关度得分,且结果会有缓存,效率高 3、全文搜索、评分排序,使用query 4、是非过滤,精确匹配,使用filter
三:Logstash
3.1:Logstash基本介绍和使用场景
简介:讲解什么是logstash,里面的基本工作流程input,filter,output等说明
什么是logstash (文档地址 https://www.elastic.co/guide/en/logstash/current/index.html) 开源的日志收集引擎,具备实时传输的能力 读取不同的数据源,并进行过滤,开发者自定义规范输出到目的地 日志来源多(如系统日志,应用日志,服务器日志等)
流程讲解 logstash通过管道pipeline进行传输,必选的两个组件是输入input和输出output,还有个可选过滤器filter logstash将数据流中等每一条数据称之为一个event,即读取每一行数据的行为叫做事件 #输入 input { ... }
# 过滤器 filter { ... }
# 输出 output { ... }
3.2:Logstash插件介绍
简单的配置 test.conf
代码语言:javascript复制input {
# 从文件读取日志信息
file {
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
filter {
}
output {
#标准输出
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-test-%{type}-%{host}"
}
}
input插件:https://www.elastic.co/guide/en/logstash/current/input-plugins.html file,http,kafka,rabbitmq等
filter插件:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html grok(号称将非标准化的日志数据转换成标准化并且可搜索数据最好的方式,常用于处理Niginx,sysLog等日志) drop(跳过某些日志,不进入output) geoip(获取地理信息)
output插件:https://www.elastic.co/guide/en/logstash/current/output-plugins.html elasticSearch,cvs,email,file等
3.2安装LogStash6.1.2
下载安装包
代码语言:javascript复制wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.2.tar.gz
解压:tar -zxvf logstash-6.2.2.tar.gz
快速启动(需要java8 jre,目前不支持java9)
代码语言:javascript复制./bin/logstash -e 'input {stdin {}} output {stdout {}}'
目录文件说明
https://www.elastic.co/guide/en/logstash/6.2/dir-layout.html
配置讲解 https://www.elastic.co/guide/en/logstash/6.2/logstash-settings-file.html
logstash.yml 修改 pipeline.workers,根据CPU核数增加1到2即可 jvm.options 修改 xms和xmx为相同,一般是系统内存三份之二