ELK
ELK定义
Elasticsearch:负责日志检索和储存
Logstash:负责日志的收集和分析、处理
Kibana:负责日志的可视化
这三款软件都是开源软件,通常是配合使用,而且又先后归于Elastic.co公司名下,故被简称为ELK
使用场景
ELK组件在海量日志系统的运维中,可用于解决:
– 分布式日志数据集中式查询和管理
– 系统监控,包含系统硬件和应用各个组件的监控
– 故障排查
– 安全信息和事件管理
– 报表功能
Elasticsearch
Elasticsearch 是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上,用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。
主要特点:
– 实时分析
– 分布式实时文件存储,并将每一个字段都编入索引
– 文档导向,所有的对象全部是文档
– 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)
– 接口友好,支持JSON
– Elasticsearch没有典型意义的事务
– Elasticsearch是一种面向文档的数据库
– Elasticsearch没有提供授权和认证特性
ES集群
1.相关概念名词:
– Node: 装有一个ES服务器的节点
– Cluster: 有多个Node组成的集群
– Document: 一个可被搜索的基础信息单元
– Index: 拥有相似特征的文档的集合
– Type: 一个索引中可以定义一种或多种类型
– Filed: 是ES的最小单位,相当于数据的某一列
– Shards: 索引的分片,每一个分片就是一个Shard
– Replicas: 索引的拷贝
2.ES为什么要实现集群
在单台ES服务器节点上,随着业务量的发展索引文件慢慢增多,会影响到效率和内存存储问题等。
我们可以采用ES集群,将单个索引的分片到多个不同分布式物理机器上存储,从而可以实现高可用、容错性等。
ES集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。
3.ES常用插件
head插件
它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作
它提供一组针对集群的查询API,并将结果以json和表格形式返回
它提供一些快捷菜单,用以展现集群的各种状态
kopf插件
是一个ElasticSearch的管理工具,它提供了对ES集群操作的API
bigdesk插件
是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu、内存使用情况,索引数据、搜索情况,http连接数等
map 映射
mapping:映射
– 创建索引的时候,可以预先定义字段的类型及相关属性
– 作用:这样会让索引建立得更加的细致和完善
分类:静态映射和动态映射
– 动态映射:自动根据数据进行相应的映射
– 静态映射:自定义字段映射数据类型
Kibana安装与配置
kibana是什么
– 数据可视化平台工具
特点:
– 灵活的分析和可视化平台
– 实时总结流量和数据的图表
– 为不同的用户显示直观的界面
– 即时分享和嵌入的仪表板
安装
安装和配置参考用户手册
kibana.yml的配置
server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://192.168.1.51:9200" kibana.index: ".kibana" //默认索引的名称 kibana.defaultAppId: "discover" //默认页面 elasticsearch.pingTimeout: 1500 elasticsearch.requestTimeout: 30000 elasticsearch.startupTimeout: 5000
除elasticsearch.url需要配置为我们ES集群的地址之外,其他保持默认值
web访问kibana --- http://192.168.1.56:5601/
Logstash是什么
是一个数据采集、加工处理以及传输的工具
– 所有类型的数据集中处理
– 不同模式和格式数据的正常化
– 自定义日志格式的迅速扩展
– 为自定义数据源轻松添加插件
安装
Logstash依赖Java环境,需要安装java-1.8.0-openjdk
Logstash没有默认的配置文件,需要手动配置
Logstash工作结构: { 数据源 } ==> input { } ==> //获取数据 filter { } ==> //处理数据 output { } ==> //存储,输出数据 { ES }
Logstash类型及条件判断
Logstash里面的类型
– 布尔值类型: ssl_enable => true
– 字节类型:bytes => "1MiB"
– 字符串类型: name => "xkops"
– 数值类型: port => 22
– 数组: match => ["datetime","UNIX"]
– 哈希: options => {k => "v",k2 => "v2"}
– 编码解码: codec => "json"
– 路径: file_path => "/tmp/filename"
– 注释: #
Logstash条件判断
等于: ==
不等于: !=
小于: <
大于: >
小于等于: <=
大于等于: >=
匹配正则: =~
不匹配正则: !~
包含: in
不包含: not in
与: and
或: or
非与: nand
非或: xor
复合表达式: ()
取反符合:!()
Logstash的第一个配置文件:/etc/logstash/logstash.conf
input{ stdin{} //标准输入 } filter{ } output{ stdout{} //标准输出 }
# logstash -f logstash.conf //启动并验证
Logstash插件
上页的配置文件使用了logstash-input-stdin和logstash-output-stdout两个插件, Logstash还有filter和codec类插件,查看插件的方式是
# /opt/logstash/bin/logstash-plugin list
插件地址
codec类插件
– 常用的插件:plain、json、json_lines、rubydebug、multiline等
– 使用刚刚的例子,这次输入json数据
– 设置输入源的codec是json,在输入的时候选择rubydebug
input{ stdin{ codec => "json" } } filter{ } output{ stdout{ codec => "rubydebug" } }
input file插件
file{ path => [“/tmp/a.log”, “/tmp/b.log”] //要读取数据的文件,可以同时监控多个文件 sincedb_path => "/var/lib/logstash/sincedb-access" //指针文件,记录读取文件的位置 start_position => "beginning" //指定默认行为,配置第一次读取文件从什么地方开始 type => 'filelog' //打标签 }
filter grok插件
– 解析各种非结构化的日志数据插件
– grok使用正则表达式把飞结构化的数据结构化
– 在分组匹配,正则表达式需要根据具体数据结构编写
– 虽然编写困难,但适用性极广
grok{ match => ["message", "%{IP:ip}, (?<key>reg) " ] }
正则宏表达式模板:/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
output ES插件
if [type] == "filelog"{ elasticsearch { hosts => ["192.168.1.51:9200", "192.168.1.52:9200"] //主机地址 index => "weblog" //索引名称 flush_size => 2000 //达到一定大小写入数据库 idle_flush_time => 10 //达到一定时间写入数据库 }}
调试成功后,把数据写入ES集群
input filebeats插件
这个插件主要用来接收beats类软件发送过来的数据,由于logstash依赖JAVA环境,而且占用资源非常大,因此会使用更轻量的filebeat替代
beats { port => 5044 }
filebeat安装配置(web服务器)
filebeat安装与配置
使用rpm安装filebeat # yum –y install filebeat 修改配置文件/etc/filebeat/filebeat.yml 设置开机运行# systemctl enable filebeat 开启服务 systemctl start filebeat
修改配置文件/etc/filebeat/filebeat.yml
paths:
- /root/logs.jsonl
document_type: weblog
... ...
paths:
- /root/accounts.json
document_type: account
output:
logstash:
hosts: ["192.168.1.57:5044"]