日志检索系统目的是方便运维、开发及测试等项目相关人员对日志进行检索、分析等操作,没用一个可视化或者友好的平台时,往往通过一些linux命令进行统计,当应用部署在多个服务器上时,这种方式就有点力不从心了,而ELK为这些日志检索及统计中的问题提供了一套完美的解决方案。
组件介绍
什么是ELK?
三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana。
Elasticsearch
Elasticsearch用来存储各种日志文件,它是基于全文检索引擎的架构(Lucene)的实时的、分布式存储检索引擎,允许用户做全文及结构化检索,用户可以通过RESTful Web接口,通过浏览器与其通信。
Logstash
Logstash用来做数据源搜集,并对数据进行过滤、分析、丰富统一格式等操作,然后将处理过的数据存储到指定的位置
Kibana
kibana为Elasticsearch及Logstash提供了可视化的界面,可以对Elasticsearch中存储的日志数据进行检索、查询、汇总及分析等。
FileBeat
既然ELK已经有数据存储与检索、数据采集以及可视化展示的能力,那filebeat是做什么的呢?其实,filebeat与ELK都是elastic公司开发的,可以理解为filebeat替代了logstash的数据采集能力,相比logstash,filebeat更快速、轻量、稳定且低耗,它可以直接对接Elasticsearch或Logstash,Filebeat不能完全取代Logstash,因为后者还具有筛选和过滤能力。
filebeat的架构,可以看到,它是哦那个过spooler可以直接与logstash及Elasticsearch交互。
部署架构
通过上述组件功能描述,不难理解目前一个较为主流的日志采集框架——Filebeat+ELK框架。即filebeat采集日志,然后将采集日志发送到消息队列(redis,kafaka等),logstash去消息队列中获取日志数据,利用自身filter功能进行过滤分析,然后将处理过的数据存储到elasticsearch中,最后在Kibana做查询分析
基于Filebeat+ELK的简单部署架构,选用kafka作消息队列
安装与部署
组件版本的选择说明如下
组件名称 |
组件版本 |
组件说明 |
---|---|---|
filebeat | filebeat-8.4.3-linux-x86_64 | 日志收集 |
logstash | logstash-8.4.3-linux-x86_64 | 日志分析过滤及转发 |
kafka | kafka_3.3.1 | 消息队列 |
zookeeper | apache-zookeeper-3.8.0-bin | 调度 |
elasticsearch | elasticsearch-8.4.3 | 日志存储 |
kibana | kibana-8.4.3-linux-x86_64 | 日志展示分析 |
需要说明的是 Filebeat 和ELK必须部署同样的版本才能保证使用无误
Filebeat安装部署
下载所需版本Filebeat Reference | Elastic并上传到服务器,这里我们选择版本filebeat-8.4.3-linux-x86_64,需要说明的是,filebeat是按照在应用服务器上的
- 上传版本到应用服务器
- 解压到目录/user/local/filebeat下
-
配置修改(filebeat目录下yml文件修改),首先是 inputs,path部分是需要收集日志的目录位置
- 配置outputs,找到outputs部分,可以看到这里有多种不同的输出系统,这里选择输出到Logstash,配置host之后记得将其他的输出配置给注释掉
当然,如果filebeat直接对接Elasticsearch的话,那在Elasticsearch Output部分配置相应host即可 - 使用nohup命令启动
nohup /usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml & - 查看filebeat是否启动成功
Logstash安装部署
- 上传版本到服务器
- 解压到相应目录
-
修改相应配置
- 后台启动 nohup bin/logstash -f first-pipeline.conf &,启动后,日志会默认输出到nohup.out文件中,可以使用如下命令查看
tail -300f nohup.out
Elasticsearch安装部署
- 前提:安装es要确保已安装jdk,这里不再对jdk安装做详细叙述
- 上传版本到服务器
- 解压到相应目录
-
添加安全组及用户,因为Elasticsearch默认是不允许使用root账号运行的
-
新建组:groupadd es
-
组下新建用户:useradd es -g es
-
切换用户:su es
-
- 修改配置
- 启动服务 nohup /opt/elasticsearch-8.4.3/bin/elasticsearch >/dev/null 2>&1 &
Kafka部署方案
这里我们主要介绍下集群部署方案
- 在三台主机173,176,177上面解压kafka
- 修改配置文件,这里与单机部署不一致的地方是zookeeper.connect参数,要改成监听三台机器,同时,将173,176,177的broker.id分别设置为0,1,2
server.propertiesbroker.id=0 // 全局唯一,单击可不动
port=9092
#端口号
listeners=PLAINTEXT
:
//127
.0.0.1:
9092
host.name=xxx.xx.x.xx
#服务器IP地址,修改为自己的服务器IP
log.dirs=/opt/kafka/kafka-logs
#日志存放路径,如果当前账户有权限创建目录,该目录可以不存在,否则必须手动创建的目录
zookeeper.connect=10
.31.81.177:
2181
,
10
.31.81.176:
2181
,
10.31.81.173.2181
#zookeeper地址和端口,集群配置部署,localhost:2181
- 启动zk,在三台服务器上分别执行下述命令
nohup ./zookeeper-server-start.sh ../config/zookeeper.properties >> zookeeper.nohup 2>&1 & - 启动kafka
nohup ./kafka-server-start.sh ../config/server.properties >> kafka.nohup 2>&1 & - 测试kafka连通性
# 创建一个topic 例如在173创建,./kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
# 创建一个producer,在176创建producer ./kafka-console-producer.sh --topic quickstart-events --bootstrap-server xx.xx.xx.177:9092,xx.xx.xx.176:9092,xx.xx.xx.173:9092
# 创建多个consumer,例如173, 176, 177 ./kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server xx.xx.xx.177:9092,xx.xx.xx.176:9092,xx.xx.xx.173:9092
ES添加登录认证
为了提高 ES 集群的数据访问安全,保护我们存在es中的数据,、用户必须通过用户名和密码认证,才被允许访问 ES 集群。无论是通过 Kibana、客户端或者 API 等方式访问集群都需要经过认证。下面我们将认证需要操作的步骤做下简单介绍
-
操作步骤
操作步骤#es未认证漏洞
1. 创建证书elastic-stack-ca.p12,创建证书时输入密码,同es用户密码
.\bin\elasticsearch-certutil ca
2. 生成证书elastic-certificates.p12
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
3. 证书放到certs目录下
cp elastic-certificates.p12 config/certs/
4. ca证书和elasticsearch.p12设置了密码,则执行下述命令,添加上述密码
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
5. 修改elasticsearch.yml配置文件
xpack.security.http.ssl.enabled:
true
xpack.security.http.ssl.keystore.path:
certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path:
certs/elastic-certificates.p12
xpack.security.transport.ssl.enabled:
true
xpack.security.transport.ssl.verification_mode:
certificate
xpack.security.transport.ssl.keystore.path:
certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path:
certs/elastic-certificates.p12
6. 重启es
./bin/elasticsearch -d
7. 访问es
curl http
:
//localhost
:
9200
- 测试验证