概念
ELK是实时日志存储和检索分析的平台,可以对各种日志进行收集、过滤、清洗、存储、并用于实时检索和分析。
Elasticsearch,是基于Lucene开发的分布式搜索引擎。
Logstash,是数据收集和处理引擎,用于日志收集、过滤、加工等操作,然后一并发往elasticsearch。
Kibana,是可视化平台,它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。
架构
- 如下架构适用于数据量小的应用环境,搭建简单,易于上手,但Logstash比较消耗系统资源,另外由于没有消息队列缓存,可能存在数据丢失的风险。
- 如下架构适合大型集群、海量数据的业务场景,用filebeat替换前端的Logstash Agent,有效降低了收集日志对业务系统资源消耗,同时消息队列使用kafka集群架构,保障了数据的安全性和稳定性,而后端Logstash和Elasticsearch均采用集群模式搭建,实现了可扩展性,保证了系统的性能。
安装
-
jdk
下载安装包解压到/usr/local,然后配置环境变量vi /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
确认是否安装成功,java -version
-
filebeat
安装包解压到/usr/local,然后修改配置./filebeat -e -c filebeat.yml
-c:配置文件位置
-path.logs:日志位置
-path.data:数据位置
-path.home:家位置
-e:关闭日志输出
-d 选择器:启用对指定选择器的调试。 对于选择器,可以指定逗号分隔的组件列表,也可以使用-d“*”为所有组件启用调试.例如,-d“publish”显示所有“publish”相关的消息。
启动:nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
停止:ps -ef |grep filebeat, kill -9 pid
-
zookeeper
下载安装包解压到/usr/local,然后配置环境变量vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.5.9
export PATH=$PATH:$ZOOKEEPER_HOME/bin
修改配置/conf/zoo.cfg
dataDir=/data/zookeeper
dataLogDir=/var/log/zookeeper
audit.enable=true
启动 ./bin/zkServer.sh start
停止 ./bin/zkServer.sh stop
重启 ./bin/zkServer.sh restart
状态 ./bin/zkServer.sh status
-
kafka
下载安装包解压到/usr/local,然后配置环境变量vi /etc/profile
export KAFKA_HOME=/usr/local/kafka_2.11-2.4.0
export PATH=$PATH:$KAFKA_HOME/bin
修改配置config/server.properties
listeners=PLAINTEXT://192.168.1.100:9092
advertised.listeners=PLAINTEXT://192.168.1.100:9092
log.dirs=/var/log/kafka
zookeeper.connect=192.168.1.100:2181
启动/usr/local/kafka_2.11-2.4.0/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.11-2.4.0/config/server.properties
-
elasticsearch
下载安装包解压到/usr/local
修改配置文件config/elasticsearch.yml
path.data: /usr/local/elasticsearch-7.12.0/data
path.logs: /usr/local/elasticsearch-7.12.0/logs
network.host: 192.168.1.100
cluster.initial_master_nodes: ["node-1"]
启动/usr/local/elasticsearch-7.12.0/bin/elasticsearch -d
-
logstash
下载安装包解压到/usr/local,然后配置环境变量vi /etc/profile
export LOGSTASH_HOME=/usr/local/logstash-5.6.1
export PATH=:$PATH:$LOGSTASH_HOME/bin
修改配置./bin/logstash.lib.sh
unset CDPATH
export JAVA_HOME=/usr/local/jdk1.8.0_291 //在这里添加上JAVA-1.8版本的路径。
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
启动/usr/local/logstash-5.6.1/bin/logstash -e 'input { stdin {} } output { stdout {} }'
./bin/logstash -f config/logstash.conf &
-
kibana
安装包解压到/usr/local,然后修改配置config/kibana.yml
server.port: 5601
server.host: "192.168.1.100"
elasticsearch.hosts: ["http://192.168.1.100:9200"]
启动服务./bin/kibana
访问http:
//192.168.1.100:5601/app/kibana
filebeat收集本地日志写入kafka
logstash消费kafka数据写入es
vi logstash.conf
vi logstash.yml
pipeline.ordered: auto
config.support_escapes: true
kibana搜索、可视化分析的用法
实例
logstash配置实例(日志写入redis队列):
input {
file {
path => "/home/pubsrv/mysql-5.5.53-3306/log/mysql-slow/mysql-slow.log"
type => "query_slow"
codec => "json"
start_position => "beginning"
}
}
output {
if [type] == "query_slow" {
redis {
data_type => "list"
host => "192.168.8.9"
db => "1"
port => "6379"
password => "Hok51IdMQnW4hAnW"
key => "query_slow"
}
}
stdout { codec => rubydebug }
}
配置实例(redis队列到ES):
input {
redis {
host => "192.168.8.9"
db => "1"
password =>"Hok51IdMQnW4hAnW"
data_type => "list"
key => "mysql_query_slow"
type => "mysql_slow_es"
codec => "json"
}
}
filter {
json {
source => "message"
}
grok {
# 有ID有use
match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id:\s%{NUMBER:id:int}\n# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\nuse\s(?<dbname>\w+);\nSET\s+timestamp=%{NUMBER:timestamp_mysql:int};\n(?<query>.*)" ]
# 有ID无use
match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id:\s%{NUMBER:id:int}\n# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\nSET\s+timestamp=%{NUMBER:timestamp_mysql:int};\n(?<query>.*)" ]
# 无ID有use
match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\n# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\nuse\s(?<dbname>\w+);\nSET\s+timestamp=%{NUMBER:timestamp_mysql:int};\n(?<query>.*)" ]
# 无ID无use
match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\n# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\nSET\s+timestamp=%{NUMBER:timestamp_mysql:int};\n(?<query>.*)" ]
}
output {
elasticsearch {
hosts => ["192.168.8.9:9200"]
index => "mysql-slowlog-%{+YYYY.MM.dd}"
}
}
启动命令:logstash-6.5.1/bin/logstash -f /home/pubsrv/test/query_slow_es.conf
filebeat配置实例(日志写入redis队列):
filebeat.prospectors:
- input_type: log
paths:
- /home/pubsrv/mysql-5.5.53-3306/log/mysql-slow/mysql-slow.log
exclude_lines: ['^\# Time']
multiline.pattern: '^\# Time|^\# User'
multiline.negate: true
multiline.match: after
tail_files: true
name: 192.168.8.9
output.redis:
hosts: ["172.20.67.50:6379"]
port: 6379
password: "Hok51IdMQnW4hAnW"
db:1nnnnn
timeout: 10
key: "mysql_query_slow"
启动命令:filebeat-5.5.0-linux-x86_64/filebeat -e -c test/query_slow_redis.yml