文章目录
Linux云计算架构-部署ELK集群实现海量日志集中分析处理
1. EKL介绍
ELK 是三个开源软件的缩写,分别为:Elasticsearch(弹性搜索) 、Logstash 以及 Kibana。它们都是开源软件。现在还新增了一个 Beats,它是一个轻量级的日志收集处理工具(Agent),Beats 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具,目前由于原本的 ELK Stack 成员中加入了 Beats 工具所以已改名为 Elastic Stack
。
各开源软件介绍:
-
Elasticsearch
:开源分布式搜索引擎,提供搜集、分析、存储数据三大功能,是基于 lucene的搜索服务器。它的特点有:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful 风格接口、多数据源、自动搜索负载等。 -
Logstash
:主要是用来进行搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为 c/s 架构,client 端安装在需要收集日志的主机上,server 端负责将收到的各节点日志进行过滤、修改等操作,再一并发往 elasticsearch 上去。 -
Kibana
:是一个开源和免费的工具,Kibana 可以为 Logstash和ElasticSearch 提供的日志,分析成友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。 -
Beats
:轻量级日志采集器,之前是Logstash负责收集日志。 -
Lucene
:是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎、部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。【全文检索引擎的半成品】
ELK使用场景:适用于日志较多且复杂的场景。对于简单的通过grep、awk、more、less命令查看和过滤日志的方法,对于上述场景,会出现如下问题:
- 日志量太大如何归档?
- 文本搜索太慢怎么办?
- 如何进行多维度查询?
- 如何进行集中化日志管理?
- 如何进行日志收集汇总管理?
对于上述问题,常见的解决方案是:建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包括以下几个主要特点:
- 收集:能够采集多种来源的日志数据
- 传输:能够稳定的把日志数据传输到中央系统
- 存储:如何存储日志数据
- 分析:可以支持 UI 分析
- 警告:能够提供错误报告,监控机制
而 ELK 则提供了一整套解决方案,并且都是开源软件,各组件之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。
ELK基本拓扑图:
各软件包下载地址:https://www.elastic.co/cn/downloads/
https://elasticsearch.cn/download/
2. 部署elasticsearch集群
2.1 环境介绍
主机名 | IP地址 | 备注 |
---|---|---|
master 8核CPU 4G以上内存 | 192.168.80.136 | elasticsearch master data节点 kibana可视化工具 |
node 8核CPU 4G以上内存 | 192.168.80.133 | elasticsearch master data节点 logstash beats 收集日志 |
2.2 部署master
①安装JDK1.8,并关闭防火墙和selinux。(所有节点都要操作)
JDK1.8下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
# 卸载掉原来的openjdk,用oracel的jdk1.8
[root@master ~]# yum remove -y java-*
[root@master ~]# ll jdk-8u271-linux-x64.rpm
-rw-r--r--. 1 root root 112994496 1月 14 13:58 jdk-8u271-linux-x64.rpm
[root@master ~]# rpm -ivh jdk-8u271-linux-x64.rpm
[root@master ~]# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# setenforce 0
[root@master ~]# vim /etc/hosts
192.168.80.136 master
192.168.80.133 node
②安装elasticsearch(所有节点都要操作)
elasticsearch下载地址:https://www.elastic.co/cn/downloads/
https://elasticsearch.cn/download/
离线安装:下载rpm包
在线安装:https://www.elastic.co/guide/en/elasticsearch/reference/7.10/rpm.html#rpm-repo
# 这里使用离线安装
[root@master ~]# ll elasticsearch-7.10.1-x86_64.rpm
-rw-r--r--. 1 root root 318860379 1月 14 14:16 elasticsearch-7.10.1-x86_64.rpm
[root@master ~]# rpm -ivh elasticsearch-7.10.1-x86_64.rpm
# 创建日志目录、数据和索引文件目录
[root@master ~]# mkdir -p /data/elasticsearch/log /data/elasticsearch/data
[root@master ~]# chown -R elasticsearch:elasticsearch /data/elasticsearch/
[root@master ~]# chown -R elasticsearch:elasticsearch /etc/elasticsearch/
③调整JVM内存和elasticsearch集群参数(所有节点都要操作)
# JVM内存调整
[root@master ~]# ls /etc/elasticsearch/
elasticsearch.keystore jvm.options log4j2.properties roles.yml users_roles
elasticsearch.yml jvm.options.d role_mapping.yml users
[root@master ~]# vim /etc/elasticsearch/jvm.options
22 -Xms2g # JVM初始分配的堆内存
23 -Xmx2g # JVM最大可以使用的内存
# 修改elasticsearch集群参数
# 修改数据和索引存放路径
# 修改日志存放路径
[root@master ~]# vim /etc/elasticsearch/elasticsearch.yml
33 path.data: /data/elasticsearch/data
37 path.logs: /data/elasticsearch/log
# 在yml最后一行后添加elasticsearch集群信息
cluster.name: ELK_GZ # 集群名
node.name: master # master节点名
node.master: true # 是否可以作为主节点
node.data: true # 是否存储数据
network.host: 192.168.80.136 # 监听IP
http.port: 9200 # elasticsearch服务的端口号
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.80.136", "192.168.80.133"] # 配置自动发现
discovery.zen.minimum_master_nodes: 2 # 设置集群的节点数
gateway.recover_after_nodes: 2 # 集群内达到该节点数量才会开始数据分片和 master枚举
cluster.initial_master_nodes: ["master","node"] # 初始化master,以防elasticsearch集群找不到master节点
2.3 部署node节点
整体配置和master相同,变化如下:
# 在yml最后一行后添加elasticsearch集群信息
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/log
cluster.name: ELK_GZ
node.name: node
node.master: true
node.data: true
network.host: 192.168.80.133
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.80.136","192.168.80.133"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
cluster.initial_master_nodes: ["master","node"]
2.4 启动elasticsearch集群
先启动master,等master完全启动了再启动node。
可以看到,占用的是9200
和9300
端口号。
# 启动master,正常监听9200和9300端口号
[root@master ~]# systemctl start elasticsearch.service
[root@master ~]# systemctl enable elasticsearch.service
[root@master ~]# systemctl status elasticsearch.service
[root@master ~]# netstat -lntp | grep java
# 启动node,正常监听9200和9300端口号
[root@node ~]# systemctl start elasticsearch.service
[root@node ~]# systemctl enable elasticsearch.service
[root@node ~]# systemctl status elasticsearch.service
[root@node ~]# netstat -lntp | grep java
2.5 查看elasticsearch集群状态
浏览器查看集群健康状态:http://192.168.80.136:9200/_cluster/health?pretty
查看单台机器:http://192.168.80.136:9200/
查看单台机器:http://192.168.80.133:9200/
2.6 使用curl管理elasticsearch集群
①_cat操作:查看集群状态
[root@master ~]# curl -XGET 192.168.80.136:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates
/_cat/ml/anomaly_detectors
/_cat/ml/anomaly_detectors/{job_id}
/_cat/ml/trained_models
/_cat/ml/trained_models/{model_id}
/_cat/ml/datafeeds
/_cat/ml/datafeeds/{datafeed_id}
/_cat/ml/data_frame/analytics
/_cat/ml/data_frame/analytics/{id}
/_cat/transforms
/_cat/transforms/{transform_id}
②_cluster操作
# 查看集群的健康状态
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/health?pretty
# 查看集群系统信息,包括CPU、JVM等
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/stats?pretty
# 查看集群的详细信息,包括节点、分片等
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/state?pretty
# 获取集群堆积的任务
[root@master ~]# curl -XGET 192.168.80.136:9200/_cluster/pending_tasks?pretty
# 修改集群配置
# 格式: curl -XPUT IP:9200/{index}/{type} -d '{text}'
[root@master ~]# curl -XPUT 192.168.80.136:9200/_cluster/settings -d '{键值对}'
# 对share的手动控制
curl -XPOST 'localhost:9200/_cluster/reroute’ -d ‘xxxxxx'
# 关闭节点
curl -XPOST 'http://192.168.80.133:9200/_cluster/nodes/_local/_shutdown'
curl -XPOST 'http://192.168.80.133:9200/_cluster/nodes/192.168.80.133/_shutdown'
# 关闭主节点
curl -XPOST 'http://localhost:9200/_cluster/nodes/_master/_shutdown'
# 关闭整个集群
curl -XPOST 'http://localhost:9200/_shutdown?delay=10s'
curl -XPOST 'http://localhost:9200/_cluster/nodes/_shutdown'
curl -XPOST 'http://localhost:9200/_cluster/nodes/_all/_shutdown'
③_node操作
# 查询节点状态
curl -XGET ‘http://localhost:9200/_nodes/stats?pretty=true’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2/stats?pretty=true’
curl -XGET ‘http://localhost:9200/_nodes/process’
curl -XGET ‘http://localhost:9200/_nodes/_all/process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/jvm,process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/info/jvm,process’
curl -XGET ‘http://localhost:9200/_nodes/192.168.1.2,192.168.1.3/_all
curl -XGET ‘http://localhost:9200/_nodes/hot_threads
④索引操作
# 获取索引
curl -XGET 'http://localhost:9200/{index}/{type}/{id}'
# 索引数据
curl -XPOST 'http://localhost:9200/{index}/{type}/{id}' -d '{“a”:”avalue”,”b”:”bvalue”}'
# 删除索引
curl -XDELETE 'http://localhost:9200/{index}/{type}/{id}'
# 设置mapping
curl -XPUT http://localhost:9200/{index}/{type}/_mapping -d '{
"{type}" : {
"properties" : {
"date" : {
"type" : "long"
},
"name" : {
"type" : "string",
"index" : "not_analyzed"
},
"status" : {
"type" : "integer"
},
"type" : {
"type" : "integer"
}
}
}
}'
# 获取mapping
curl -XGET http://localhost:9200/{index}/{type}/_mapping
# 搜索
curl -XGET 'http://localhost:9200/{index}/{type}/_search' -d '{
"query" : {
"term" : { "user" : "kimchy" } //查所有 "match_all": {}
},
"sort" : [{ "age" : {"order" : "asc"}},{ "name" : "desc" } ],
"from":0,
"size":100
}'
curl -XGET 'http://localhost:9200/{index}/{type}/_search' -d '{
"filter": {"and":{"filters":[{"term":{"age":"123"}},{"term":{"name":"张三"}}]},
"sort" : [{ "age" : {"order" : "asc"}},{ "name" : "desc" } ],
"from":0,
"size":100
}'
# 修改索引
curl -XPUT 'http://192.168.80.136:9200/abong/'
curl -H 'Content-Type: application/json' -XPUT 'http://192.168.80.136:9200/abong/student/1' -d '{"name":"dir","age":"30","info":"I love you"}'
curl -XPUT 'http://192.168.80.136:9200/xuegod/student/1' -d '{"name":"dir","age":"30","info":"I love you"}'
# 获取索引
curl -XGET 'http://192.168.80.136:9200/abong/student/1?pretty'
curl -XGET '192.168.80.136:9200/_cat'
# 获取集群状态信息
curl '192.168.80.136:9200/_cluster/health?pretty'
3. 在node节点上安装logstash收集本机日志
3.1 配置终端采集日志
为了收集node节点上的日志,就要安装logstash
服务,且logstash不支持JDK1.9。
logstash下载地址:https://www.elastic.co/cn/downloads/
[root@node ~]# ll logstash-7.10.1-x86_64.rpm
-rw-r--r-- 1 root root 352352275 1月 14 19:36 logstash-7.10.1-x86_64.rpm
[root@node ~]# rpm -ivh logstash-7.10.1-x86_64.rpm
# logstash配置文件
[root@node ~]# cd /etc/logstash/
[root@node logstash]# ll
总用量 40
drwxrwxr-x 2 root root 6 12月 5 11:11 conf.d
-rw-r--r-- 1 root root 2019 12月 5 11:11 jvm.options
-rw-r--r-- 1 root root 9097 12月 5 11:11 log4j2.properties
-rw-r--r-- 1 root root 342 12月 5 11:11 logstash-sample.conf
-rw-r--r-- 1 root root 11226 1月 18 13:08 logstash.yml
-rw-r--r-- 1 root root 285 12月 5 11:11 pipelines.yml
-rw------- 1 root root 1696 12月 5 11:11 startup.options
# logstash收集日志的模板配置文件
[root@node logstash]# cat logstash-sample.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
配置logstash收集syslog日志:
[root@node ~]# vim /etc/logstash/conf.d/syslog.conf
input{ # 定义日志源
syslog{
type => "system-syslog" # 定义日志类型
port => 10514 # 定义监听端口
}
}
output{ # 定义日志输出
stdout{
codec => rubydebug # 将日志输出到当前的终端上,一般都会输出到es集群的master节点上。
}
}
==================================
# 输出到hosts上,格式为index
output{
elasticsearch{
hosts => ["192.168.1.63:9200"]
index => "system-syslog-%{+YYYY.MM.DD}"
}
}
检查syslog日志配置文件是否有问题:
[root@node ~]# cd /usr/share/logstash/bin/
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
--path.settings 指定logstash的配置文件所在目录
-f 指定需要被检测的配置文件的路径
--config.test_and_exit 检测完后直接退出logstash,不启动logstash
指定所有类型的日志都上传到10514端口上:
[root@node ~]# vim /etc/rsyslog.conf
*.* @@192.168.80.133:10514
启动rsyslog服务和logstash:
# 重启rsyslog服务
[root@node ~]# systemctl restart rsyslog
# 前台启动logstash服务
[root@node ~]# cd /usr/share/logstash/bin/
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf
# 在另一终端上查看监听端口的监听情况
[root@node ~]# netstat -lntp | grep 10514
tcp6 0 0 :::10514 :::* LISTEN 26058/java
可以看到,logstash启动后,syslog的日志在当前终端上显示出来了。
Ctrl+C退出,并关闭logstash。
3.2 配置es服务器收集日志
配置logstash收集到的日志传输到es服务器上:
[root@node ~]# vim /etc/logstash/conf.d/syslog.conf
input{
syslog{
type => "system-syslog"
port => 10514
}
}
output{
elasticsearch{
hosts => ["192.168.80.136:9200"]
index => "system-syslog-%{+YYYY.MM.DD}"
}
}
# 检查配置文件
[root@node ~]# cd /usr/share/logstash/bin
[root@node bin]# ./logstash --path.settings /etc/logstash -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
# 修改logstash监控的IP,默认监听127.0.0.1,本地IP无法远程通信。
[root@node ~]# vim /etc/logstash/logstash.yml
118 http.host: "192.168.80.133"
[root@node ~]# chown -R logstash /var/lib/logstash/
[root@node ~]# chown -R logstash /var/log/logstash/
# 重启logstash服务
[root@node ~]# systemctl restart logstash && systemctl enable logstash && systemctl status logstash
[root@node ~]# netstat -lntp | grep 9600
tcp6 0 0 192.168.80.133:9600 :::* LISTEN 27426/java
[root@node ~]# netstat -lntp | grep 10514
tcp6 0 0 :::10514 :::* LISTEN 27426/java
logstash收集的日志索引:http://192.168.80.136:9200/_cat/indices?v
查看日志索引详细内容:
[root@master ~]# curl -XGET '192.168.80.136:9200/system-syslog-2021.01.18?pretty'
4. 在master节点上安装并汉化kibana,以图形界面显示系统日志
4.1 安装kibana
[root@master ~]# ll kibana-7.10.1-x86_64.rpm
-rw-r--r-- 1 root root 250278931 1月 14 19:36 kibana-7.10.1-x86_64.rpm
[root@master ~]# rpm -ivh kibana-7.10.1-x86_64.rpm
[root@master ~]# vim /etc/kibana/kibana.yml
2 server.port: 5601 # 配置kibana的端口
7 server.host: "192.168.80.136" # 配置监听ip
28 elasticsearch.hosts: ["http://192.168.80.136:9200"]
89 logging.dest: /var/log/kibana.log
创建日志文件:
[root@master ~]# touch /var/log/kibana.log && chmod 777 /var/log/kibana.log
[root@master ~]# systemctl start kibana.service && systemctl enable kibana.service && systemctl status kibana.service
[root@master ~]# ps aux | grep kibana
kibana 31415 138 3.1 1332184 254212 ? Ssl 15:55 0:31 /usr/share/kiban/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
root 31510 0.0 0.0 112724 988 pts/0 S+ 15:56 0:00 grep --color=auto kibana
[root@master ~]# netstat -lntp | grep 5601
tcp 0 0 192.168.80.136:5601 0.0.0.0:* LISTEN 31415/node
4.2 汉化kibana
在浏览器访问,如:http://192.168.80.136:5601/
,由于我们并没有安装 x-pack
,所以此时是没有用户名和密码的,可以直接访问的:
[root@master ~]# vim /etc/kibana/kibana.yml
106 # Supported languages are the following: English - en , by default , Chinese - zh-CN .
107 i18n.locale: "zh-CN"
[root@master ~]# systemctl restart kibana.service
4.3 配置kibana显示系统日志
①创建索引模式
②点击“Discover”,选择索引模式:
以上就是ELK集群的基本情况,需要深入了解ELK集群的,可以查阅官网介绍。