ELK 官网:
https://www.elastic.co/cn/what-is/elk-stack
ElasticSearch
ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应用
基本概念:
Index
定义:类似于mysql中的database。索引只是一个逻辑上的空间,物理上是分为多个文件来管理的。
命名:必须全小写
描述:在实践过程中每个index都会有一个相应的副 本。主要用来在硬件出现问题时,用来回滚数据的。这也某种程序上,加剧了ES对于内存高要求。
Type
定义:类似于mysql中的table,根据用户需求每个index中可以新建任意数量的type。
Document
定义:对应mysql中的row。有点类似于MongoDB中的文档结构,每个Document是一个json格式的文本
Mapping
更像是一个用来定义每个字段类型的语义规范。在mysql中类似sql语句,在ES中经过包装后,都被封装为友好的Restful风格的接口进行操作。
这一点也是为什么开发人员更愿意使用ES的原因。
Shards & Replicas
定义:能够为每个索引提供水平的扩展以及备份操作。保证了数据的完整性和安全性
描述:
Shards:在单个节点中,index的存储始终是有限制,并且随着存储的增大会带来性能的问题。为了解决这个问题,ElasticSearch提供一个能够分割单个index到集群各个节点的功能。你可以在新建这个索引时,手动的定义每个索引分片的数量。
Replicas:在每个node出现宕机或者下线的情况,Replicas能够在该节点下线的同时将副本同时自动分配到其他仍然可用的节点。而且在提供搜索的同时,允许进行扩展节点的数量,在这个期间并不会出现服务终止的情况。
默认情况下,每个索引会分配5个分片,并且对应5个分片副本,同时会出现一个完整的副本【包括5个分配的副本数据】。
前提:关闭防火墙,关闭selinux
systemctl stop firewalld
setenforce 0
系统优化:
[root@node1 ~]# cat /etc/security/limits.conf |tail -n 15 * soft nproc 65535 * soft nofile 65535 * hard nproc 65535 * hard nofile 65535
vi /etc/sysctl.conf 加一行
vm.max_map_coun=655360
vm.max_map_coun=655360
三个组件都安装到一台服务器上
129:ES+kibana
131:logstash
1 安装jdk
rpm -ivh jdk-8u131-linux-x64_.rpm
2 配置elasticsearch 的yum源
[root@node1 ~]# cat /etc/yum.repos.d/elasticsearch.repo [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
yum install elasticsearch
配置开机自启动
[root@node1 ~]# systemctl enable elasticsearch.service
开启服务
[root@node1 ~]# systemctl start elasticsearch.service
验证服务是否启动
[root@localhost elasticsearch]# netstat -lptnu|grep java tcp6 0 0 127.0.0.1:9200 :::* LISTEN 51790/java tcp6 0 0 ::1:9200 :::* LISTEN 51790/java tcp6 0 0 127.0.0.1:9300 :::* LISTEN 51790/java tcp6 0 0 ::1:9300 :::* LISTEN 51790/java
监听端口:
9200作为Http协议,主要用于外部通讯
9300作为Tcp协议,ES集群之间是通过9300进行通讯
配置文件路径:
[root@localhost elasticsearch]# ll /etc/elasticsearch/
total 36
-rw-rw----. 1 root elasticsearch 199 Nov 7 01:56 elasticsearch.keystore
-rw-rw----. 1 root elasticsearch 2869 Oct 15 23:31 elasticsearch.yml
-rw-rw----. 1 root elasticsearch 3685 Oct 15 23:31 jvm.options
-rw-rw----. 1 root elasticsearch 13085 Oct 15 23:31 log4j2.properties
-rw-rw----. 1 root elasticsearch 473 Oct 15 23:31 role_mapping.yml
-rw-rw----. 1 root elasticsearch 197 Oct 15 23:31 roles.yml
-rw-rw----. 1 root elasticsearch 0 Oct 15 23:31 users
-rw-rw----. 1 root elasticsearch 0 Oct 15 23:31 users_roles
[root@huazai007 ~]# cat /etc/elasticsearch/elasticsearch.yml |grep -v '^#' path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 172.18.47.110 http.port: 9200
日志文件路径:
[root@localhost elasticsearch]# pwd
/var/log/elasticsearch
[root@localhost elasticsearch]# ll
total 48
-rw-r--r--. 1 elasticsearch elasticsearch 0 Nov 7 01:58 elasticsearch_access.log
-rw-r--r--. 1 elasticsearch elasticsearch 0 Nov 7 01:58 elasticsearch_audit.log
-rw-r--r--. 1 elasticsearch elasticsearch 0 Nov 7 01:58 elasticsearch_deprecation.log
-rw-r--r--. 1 elasticsearch elasticsearch 0 Nov 7 01:58 elasticsearch_index_indexing_slowlog.log
-rw-r--r--. 1 elasticsearch elasticsearch 0 Nov 7 01:58 elasticsearch_index_search_slowlog.log
-rw-r--r--. 1 elasticsearch elasticsearch 8502 Nov 7 01:58 elasticsearch.log
-rw-r--r--. 1 elasticsearch elasticsearch 35454 Nov 7 02:00 gc.log.0.current
elasticsearch 配置详解:
cluster部分:========== cluster.name: elasticsearch 配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es, 如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。 node部分:=========== node.name: node-1 定义节点名称 node.attr.rack: r1 向节点添加自定义属性 Paths部分:========== path.data: /var/lib/elasticsearch 设置索引数据的存储路径 path.logs: /var/log/elasticsearch 设置日志文件的存储路径 Memory部分:======= bootstrap.memory_lock: true 启动时锁定内存,为了保证es正常运行 Network部分:======== network.host: 192.168.0.1 设置绑定的ip地址,可以是ipv4或ipv6的 http.port: 9200 设置对外服务的http端口,默认为9200。 Discovery部分:======= discovery.zen.ping.unicast.hosts: ["host1", "host2"] 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点 discovery.zen.minimum_master_nodes: 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。 默认为1,对于大的集群来说,可以设置大一点的值(2-4) Gateway部分:======== gateway.recover_after_nodes: 3 设置集群中N个节点启动时进行数据恢复,默认为1 Various部分: [ˈveriəs]=======各种各样==== action.destructive_requires_name: true 删除索引时需要显式名称
常用命令:
验证服务
curl -X GET http://127.0.0.1:9200
elasticsearch 查看集群统计信息
curl -XGET 'http://localhost:9200/_cluster/stats?pretty'
查看集群状态
curl -X GET 'localhost:9200/_cat/health?v'
创建索引:test_index
curl -X PUT HTTP://localhost:9200/test_index?pretty
elasticsearch 查看所有索引
curl -X GET HTTP://localhost:9200/_cat/indices?v
curl -s http://192.168.1.9:9200/_cat/indices|grep "msg"|awk '{print $3}'|sort
删除索引:test_index
curl -XDELETE 'localhost:9200/test_index?pretty'
logstash工作原理:
Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。
支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。
Input模块:输入数据到logstash。
一些常用的输入为:
file:从文件系统的文件中读取,类似于tail-f命令
redis:从redis service中读取
beats:从filebeat中读取
kafka:从kafka队列中读取
Filters:数据中间处理,对数据进行操作。
一些常用的过滤器为:
grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。
它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
官方提供的grok表达式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
grok在线调试:https://grokdebug.herokuapp.com/
mutate [ˈmjuːteɪt]:对字段进行转换。
例如对字段进行删除、替换、修改、重命名等。
drop:丢弃一部分events不进行处理。
clone:拷贝 event,这个过程中也可以添加或移除字段。
geoip:添加地理信息(为前台kibana图形化展示使用)
Outputs模块:outputs是logstash处理管道的最末端组件。
一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。
一些常见的outputs为:
elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
file:将event数据保存到文件中。
graphite [ˈɡræfaɪt]:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。
Codecs模块:codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。
一些常见的codecs:
json:使用json格式对数据进行编码/解码。
multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。
3 logstash 安装
配置logstash yum 源
[logstash-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
yum install logstash
配置文件路径:
[root@localhost logstash]# pwd
/etc/logstash
[root@localhost logstash]# ll
total 36
drwxrwxr-x. 2 root root 6 Oct 16 00:57 conf.d
-rw-r--r--. 1 root root 1915 Oct 16 00:57 jvm.options
-rw-r--r--. 1 root root 4568 Oct 16 00:57 log4j2.properties
-rw-r--r--. 1 root root 342 Oct 16 00:57 logstash-sample.conf
-rw-r--r--. 1 root root 8236 Nov 7 02:33 logstash.yml
-rw-r--r--. 1 root root 285 Oct 16 00:57 pipelines.yml
-rw-------. 1 root root 1696 Oct 16 00:57 startup.options
日志文件路径:
[root@localhost logstash]# pwd /var/log/logstash [root@localhost logstash]# ll total 4 -rw-r--r--. 1 logstash logstash 1644 Nov 7 02:36 logstash-plain.log -rw-r--r--. 1 logstash logstash 0 Nov 7 02:35 logstash-slowlog-plain.log
logstash是用来收集日志,并对日志做过滤处理的,我们下面要分析的是系统日志,所以要编写一个收集日志的配置文件
vim /etc/logstash/conf.d/system.conf
input日志输入模块:日志的获取方式和路径
input { file { path => "/var/log/messages" type => "system-log" start_position => "beginning" } } output日志的输出模块:导出你的数据 output { elasticsearch { hosts => "192.168.10.129:9200" index => "system_log-%{+YYYY.MM.dd}" } }
这里为了测试,将/var/log/messages日志的权限修改为了644
chmod 777 /var/log/messages
如果conf.d 下有多个配置文件需要修改pipelines.yml(管道)文件
- pipeline.id: main path.config: "/etc/logstash/conf.d/system.conf" - pipeline.id: sec path.config: "/etc/logstash/conf.d/sec.conf"
配置开机自启动
[root@localhost ~]# systemctl enable logstash.service
启动logstash服务
[root@localhost ~]# systemctl start logstash.service
监听端口:
[root@localhost logstash]# netstat -lptnu|grep java
tcp6 0 0 127.0.0.1:9600 :::* LISTEN 6722/java
logstash 无法启动报错:
解决:
4 安装kibana
配置yum 源
[kibana-6.x] name=Kibana repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
systemctl enable kibana.service
systemctl start kibana
配置kibana
这里只需要配置监听地址和elasticsearch的ip就可以了
vim /etc/kibana/kibana.yml
[root@localhost yum.repos.d]# cat /etc/kibana/kibana.yml |grep -v "^#"
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.10.129:9200"]
启动服务:
Systemctl start kibana
监听端口:5601
在kibana上创建索引
给系统日志添加可视化图形
选择创建图形类型为线形图
选择绘画哪个索引的图形
选择x轴为绘画日期的柱状图,然后点击开始获取数据