ELK多租户方案

file

一、前言

日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的;ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前的主流选择之一。

本文主要介绍如何实现一套 ELK日志系统 同时给 多套环境多个系统 共同使用/测试,并实现相互之间的数据与视图相互 隔离 互不影响。

 

二、隔离方式

常见的 ELK 架构如下图所示,分别由 ElasticsearchLogstashKibanaFileBeat 组成。
file

分别在每个应用服务器里部署一个 FileBeat 组件作为日志收集器,通过输入插件从文件中获取数据,然后传输给 Logstash 将通过过滤插件加工并结构化处理日志数据后发送至 Elasticsearch 存储,最后通过 Kibana 进行可视化展示分析。

PS:需要对上图中 ELK 的各个组件分别做 隔离 处理

 

2.1. FileBeat隔离

由于每台机器上都会部署一个 Beat 实例作为日志收集,所以 FileBeat 本身无需做任何隔离配置,但是作为数据的入口需要把所属 租户 相关的信息传递给下游,如下图所示

file

通过 project(项目名) 和 env(环境) 作为 租户 隔离标识

 

2.2. Logstash隔离

主要是每个项目的日志格式可能会不一样,所以会存在不同的个性化配置文件,这个 日志解析配置文件 需要定义隔离规则进行分离;

使用以下命令启动 logstash 指定 config/conf/ 为配置存放目录,并指定配置文件热加载。

bin/logstash -f config/conf/ --config.reload.automatic

 

日志解析配置文件隔离方法可参考下图方式:

file

(1)01-input-beats.conf

为通用 输入 配置,每个租户共享,用于接收来自 Filebeat 的数据

input {
  beats {
    port => 5044
  }
}

 

(2)02-output-es.conf

为通用 输出 配置,每个租户共享,用于把日志数据按照定义好的 索引命名规则 创建索引写入到es中

需要在数据来源中添加 projectenvdocType 三个字段分别代表项目名、环境与日志类型

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 的入参变量动态生成规定的索引名。

索引的命名规则为:${项目名}-${环境}-${日志类型}-%{+YYYY.MM.dd}

例如:mp-pre-syslog-2020.12.01

 

2.4. Kibana隔离

可通过多工作区的方式进行隔离,每个租户创建自己独立的工作空间,用于隔离自己的索引数据、展示视图等对象,并且 相互不可见

工作区的配置流程如下:

  1. 创建工作区
  2. 创建角色(配置权限)
  3. 创建用户(关联角色)

2.3.1 创建工作空间

2.3.1.1 超级管理员登录

使用超级管理员账号 elastic 登录Kibana,选择 默认工作区
file

2.3.1.2 进入管理页面

file

2.3.1.3 创建工作空间

创建工作区,并可定制显示的功能点(默认全部显示)
file

 

2.3.2 创建角色绑定工作空间

创建一个新的角色,并分配对应的 索引权限工作区权限 等权限给该角色
file

 

2.3.3 创建用户

创建用户,并绑定自己 工作空间 下的角色
file

PS:该用户只能看到自己所属 工作区 下的 索引仪表板 等对象

 

三、总结

每个 租户 需对 ELK 的各个组件分别做 隔离 处理

  1. Filebeat:负责把区分 租户 相关的信息传递给下游
  2. Logstash:独立分开每个租户的个性化 Filter 配置文件
  3. Elasticsearch:通过规范的索引命名,各租户独立的创建索引实现物理隔离
  4. Kibana:通过多工作区的方式进行隔离,数据与仪表板等互不可见

 

PS:隔离步骤虽然有点繁琐,但是后期大家可以自行开发产品化日志系统,把上述的步骤放在图形化界面上操作实现。

 

扫码关注有惊喜!

file

posted @ 2020-12-07 08:57  zlt2000  阅读(1413)  评论(0编辑  收藏  举报