一、前言
日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前的主流选择之一。
本文主要介绍如何实现一套 ELK系统
同时给 「多套环境」 、「多个系统」 共同使用/测试,并实现相互之间的数据与视图相互 「隔离」 互不影响。
二、隔离方式
常见的 ELK
架构如下图所示,分别由 Elasticsearch
、Logstash
、Kibana
与 FileBeat
组成。
分别在每个应用服务器里部署一个 FileBeat
组件作为日志收集器,通过输入插件从文件中获取数据,然后传输给 Logstash
将通过过滤插件加工并结构化处理日志数据后发送至 Elasticsearch
存储,最后通过 Kibana
进行可视化展示分析。
「PS」:需要对上图中
ELK
的各个组件分别做 「隔离」 处理
2.1. FileBeat隔离
由于每台机器上都会部署一个 Beat
实例作为日志收集,所以 FileBeat
本身无需做任何隔离配置,但是作为数据的入口需要把所属 「租户」 相关的信息传递给下游,如下图所示
通过 project(项目名) 和 env(环境) 作为 「租户」 隔离标识
2.2. Logstash隔离
主要是每个项目的日志格式可能会不一样,所以会存在不同的个性化配置文件,这个 「日志解析配置文件」 需要定义隔离规则进行分离;
使用以下命令启动 logstash
指定 config/conf/
为配置存放目录,并指定配置文件热加载。
bin/logstash -f config/conf/ --config.reload.automatic
日志解析配置文件隔离方法可参考下图方式:
「(1)01-input-beats.conf」
为通用 「输入」 配置,每个租户共享,用于接收来自 Filebeat 的数据
代码语言:javascript复制input {
beats {
port => 5044
}
}
「(2)02-output-es.conf」
为通用 「输出」 配置,每个租户共享,用于把日志数据按照定义好的 「索引命名规则」 创建索引写入到es中
代码语言:javascript复制需要在数据来源中添加
project
、env
和docType
三个字段分别代表项目名、环境与日志类型
output {
elasticsearch {
hosts => ["localhost"]
user => "elastic"
password => "changeme"
index => "%{[fields][project]}-%{[fields][env]}-%{[fields][docType]}-%{ YYYY.MM.dd}"
}
}
ip、用户名和密码按实际情况修改
「(3)mp.conf」
为个性化 「日志解析」 配置,每个租户单独新建一个配置文件配置自己的 filter
内容
filter {
if [fields][project] == "mp" and [fields][env] == "pre" and [fields][docType] == "syslog" {
grok {
..........
}
}
}
「PS」:必需增加
if
语句来确认是否属于自己租户的日志数据!
2.3. Elasticsearch隔离
通过不同的索引命名,创建各自独立的索引实现物理隔离;由前面的 Logstash
在结构化数据后生成索引时,已自动通过 Filebeat
的入参变量动态生成规定的索引名。
索引的命名规则为:{项目名}-{环境}-
例如:mp-pre-syslog-2020.12.01
2.4. Kibana隔离
可通过多工作区的方式进行隔离,每个租户创建自己独立的工作空间,用于隔离自己的索引数据、展示视图等对象,并且 「相互不可见」。
工作区的配置流程如下:
- 创建工作区
- 创建角色(配置权限)
- 创建用户(关联角色)
2.3.1 创建工作空间
2.3.1.1 超级管理员登录
使用超级管理员账号 elastic
登录Kibana,选择 「默认工作区」
2.3.1.2 进入管理页面
2.3.1.3 创建工作空间
创建工作区,并可定制显示的功能点(默认全部显示)
2.3.2 创建角色绑定工作空间
创建一个新的角色,并分配对应的 索引权限
与 工作区权限
等权限给该角色
2.3.3 创建用户
创建用户,并绑定自己 工作空间
下的角色
「PS」:该用户只能看到自己所属
工作区
下的索引
和仪表板
等对象
三、总结
每个 「租户」 需对 ELK
的各个组件分别做 「隔离」 处理
- 「Filebeat」:负责把区分
租户
相关的信息传递给下游 - 「Logstash」:独立分开每个租户的个性化
Filter
配置文件 - 「Elasticsearch」:通过规范的索引命名,各租户独立的创建索引实现物理隔离
- 「Kibana」:通过多工作区的方式进行隔离,数据与仪表板等互不可见
「PS」:隔离步骤虽然有点繁琐,但是后期大家可以自行开发产品化日志系统,把上述的步骤放在图形化界面上操作实现。