一、ELK简介
1、Elasticsearch
Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合
2、Logstash
Logstash是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理。
3、Kibana
kibana是一个开源和免费的工具,它可以为Logstash和ElasticSearch提供的日志分析友好的Web界面,可以帮助您汇总、分析和搜索重要数据日志。
4、ELK版本信息为7.2.1,你可以从官网下,也可以直接从下面地址下载:
https://artifacts.elastic.co/downloads/logstash/logstash-7.2.1.tar.gz
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.1-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.2.1-linux-x86_64.tar.gz
官网地址:https://www.elastic.co/cn/downloads/
二、环境准备
1、三台Linux服务器,系统为CentOS7.x
[root@elk-1 config]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2、角色划分
内网服务器信息
NODE | IP | 节点类型 |
node-1 | 192.168.1.156 | 数据、主节点(安装elasticsearch、logstash、kabana) |
node-2 | 192.168.1.155 | 数据节点(安装elasticsearch) |
node-3 | 192.168.1.74 | 数据节点(安装elasticsearch) |
三、 安装Elasticsearch(简称ES)集群
1、下载及解压(省略)
2、创建用户及授权
ElasticSerach要求以非root身份启动,在每个节点创建用户及用户组
-- 创建新用户及授权
# groupadd elsearch
# useradd elsearch -g elsearch -p elasticsearch
# cd /data/deploy/elk/
# chown -R elsearch:elsearch elasticsearch-7.2.1
-- 切换用户,启动
# su elsearch
# cd elasticsearch-7.2.1/bin
# sh elasticsearch &
3、修改elasticsearch.yml配置文件
3.1、node-1节点配置文件
#三个集群需要同样的集群名
cluster.name: my-application
#每个node的名字需要唯一
node.name: node-1
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
3.2、node-2节点配置文件
#三个集群需要同样的集群名
cluster.name: my-application
#每个node的名字需要唯一
node.name: node-2
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
3.3、node-3节点配置文件
cluster.name: my-application
#每个node的名字需要唯一
node.name: node-3
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#数据存放的位置,需要新建一个目录
path.data: /home/elk/elasticsearch/data
#日志存放的位置,需要新建一个目录
path.logs: /home/elk/elasticsearch/log
#监听的ip
network.host: 0.0.0.0
#监听的端口
http.port: 9200
transport.tcp.port: 9300
xpack.security.enabled: false
#允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["192.168.1.155", "192.168.1.156", "192.168.1.74"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
4、启动elasticsearch及关闭
./bin/elasticsearch #命令窗运行
./bin/elasticsearch -d #后台线程运行
ctrl+c #命令窗关闭
ps -ef | grep elastic #后台线程关闭
kill -9 4442 #pid 4442为查处线程的pid
5、查看端口号,分别为9200和9300
验证elasticsearch启动,主机名是你的服务器的ip地址或域名
所有机器启动成功
// 输入连接查看(_cat/nodes查看集群所有节点)
http://IP:9200/_cat/nodes
6、elasticsearch启动常见的几个报错
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
切换到root用户,编辑limits.conf添加如下内容
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
[2]: max number of threads [3818] for user [es] is too low, increase to at least [4096]
最大线程个数太低。修改配置文件etc/security/limits.conf,增加配置
* soft nproc 4096
* hard nproc 4096
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改/etc/sysctl.conf文件,增加配置vm.max_map_count=262144
vi /etc/sysctl.conf
sysctl -p
执行命令sysctl -p生效
[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
问题原因:因为Centos6不支持SecComp,而ES5.2.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动
解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
7、es集群基本操作
#查看集群的健康信息 curl 'localhost:9200/_cluster/health?pretty' #查看集群的详细信息 curl ' localhost:9200/_cluster/state?pretty' #查询索引列表 curl -XGET http:// localhost:9200/_cat/indices?v #创建索引 curl -XPUT http:// localhost:9200/customer?pretty #查询索引 curl -XGET http:// localhost:9200/customer/external/1?pretty #查询es数据 curl -XGET 'http://localhost:9200/_cat/count/索引名称' #删除索引 curl -XDELETE http:// localhost:9200/customer?pretty #删除指定索引 curl -XDELETE localhost:9200/nginx-log-2019.08 #删除多个索引 curl -XDELETE localhost:9200/system-log-2019.0606,system-log-2019.0607 #删除所有索引 curl -XDELETE localhost:9200/_all #在删除数据时,通常不建议使用通配符,误删后果会很严重,所有的index都可能被删除,为了安全起见需要禁止通配符,可以在elasticsearch.yml配置文件中设置禁用_all和*通配符 action.destructive_requires_name: true
四、安装logstash
说明:在每台需要收集日志的服务器部署即可
1、下载解压(省略)
2、修改logstash.yml配置文件(可不修改此配置文件)
http.host: "192.168.1.156"
3、创建监控日志的配置文件(重要)
# vim /kibana-761linux-x86_64/config/logstash.conf
input {
tcp {
#模式选择为server
mode => "server"
#ip和端口根据自己情况填写,端口默认4560,对应下文logback.xml里appender中的destination
host => "192.168.1.156"
port => 4560
#格式json
codec => json_lines
}
}
filter {
#过滤器,根据需要填写
}
output {
elasticsearch {
action => "index"
#这里是es的地址,多个es要写成数组的形式
hosts => ["192.168.1.155:9200","192.168.1.156:9200","192.168.1.74:9200"]
#用于kibana过滤,可以填项目名称
index => "%{[appname]}-%{+YYYY.MM.dd}"
}
}
4、启动logstash及关闭
bin/logstash -f /home/logstash-6.3.0/config/logstash.conf ##命令窗形式
bin/logstash -f /home/logstash-6.3.0/config/logstash.conf & ##后台线程形式
ctrl+c #命令窗关闭
ps -ef | grep logstash #后台线程关闭
kill -9 4617 ##pid 4617 为查处线程的pid
验证启动成功
http://IP:9600/
五、安装kibana
1、下载及解压(省略)
2、修改kibana配置文件
vi /kibana-761linux-x86_64/config/kibana.yml
server.port: 5601 ##服务端口
server.host: "0.0.0.0" ##服务器ip 本机
elasticsearch.hosts: ["http://192.168.1.155:9200","http://192.168.1.156:9200","http://192.168.1.74:9200"]
kibana.index: ".kibana"
elasticsearch.requestTimeout: 90000
i18n.locale: "zh-CN"
3、启动kibana及关闭
bin/kibana --allow-root #命令窗启动
nohup bin/kibana --allow-root & #后台线程启动
ctrl+c #命令窗关闭
ps -ef | grep kibana #后台线程关闭
kill -9 4525 ##pid 4525 为查处线程的pid
验证启动成功
http://IP:5601/
六、kibana简单使用
1、创建索引
可以新建一个全局的索引,【Index pattern】设置为【*】,点击下一步至完成为止。
2、日志搜索
如截图所示,可以通过Discover和新建的索引,对日志进行详细的查看,并且可以选择具体的字段进行查看。在右上角,可以通过选择不同的时间段,对日志进行查看和搜索。
网达环境日志查看:http://192.168.1.156:5601/wd-kibana
咪咕环境日志查看:http://183.192.162.121:473/migu-kibana
springboot整合elk
pom.xml添加依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency> 修改logback.xml配置文件
<!-- 输出到logstash的appender -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash的IP和端口,从环境变量注入 ${ELK_DESTINATION}-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"cadip-ability-simulation"}</customFields>
</encoder>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="debug"/>
<appender-ref ref="error"/>
<appender-ref ref="logstash"/>
</root>
完整配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<springProperty scope="context" name="log_level" source="cadip.log.level" defaultValue="INFO"/>
<springProperty scope="context" name="log_open_console" source="cadip.log.open_console" defaultValue="false"/>
<springProperty scope="context" name="app_name" source="spring.application.name"
defaultValue="cadip-ability-job"/>
<springProperty scope="context" name="active" source="spring.profiles.active"/>
<property name="log_path" value="/tools/logs"/>
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%level|${PID:-}|%thread|${app_name:-}|%X{X-B3-TraceId:-}|%X{X-B3-SpanId:-}|%X{X-Span-Export:-}|%class.%method-%line|%msg%n"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.info.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.error.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Feign log -->
<appender name="feignFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/${app_name}/%d{yyyy-MM-dd}.feign.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到logstash的appender -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash的IP和端口,从环境变量注入 ${ELK_DESTINATION}-->
<if condition='property("active").contains("preview")'>
<then>
<destination>10.150.202.71:4560</destination>
</then>
<else>
<destination>192.168.1.156:4560</destination>
</else>
</if>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"${app_name}-${active}"}</customFields>
</encoder>
</appender>
<logger name="feign" level="INFO" addtivity="false">
<appender-ref ref="feignFile"/>
</logger>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="${log_level}">
<if condition='property("log_open_console").contains("true")'>
<then>
<appender-ref ref="console"/>
</then>
</if>
<appender-ref ref="file"/>
<appender-ref ref="error"/>
<appender-ref ref="logstash"/>
</root>
</configuration>