0%

微服务业务监控elk和efk

文章字数:1443,阅读全文大约需要5分钟

在业务中收集需要的数据,并且进行处理和展示的架构。业务中收集数据的工作被称为埋点,一般使用日志的方式进行。

大致流程

  1. 微服务日志埋点:使用日志输出框架,例如Logback

  2. 日志收集:收集Logback输出的日志,使用FileBeat

2.1 消息队列传输:这里可以使用消息队列减轻日志解析压力

  1. 数据解析,落盘:将Logback传来的数据格式化成可用的格式如json,然后生成ElasticSearch分片格式并发送(落盘)

  2. 数据使用:ElasticSearch收到后就可以提供查询服务,供使用者获取信息

  3. 数据展示:使用Kibana展示数据

详解

数据生成

  1. 数据埋点:数据埋点就是将需要的数据在业务中抽离出来,一般使用日志框架就可以了Logback。也可以自己输出成文件。

  2. 格式:输出的格式需要统一,例如

1
2
# {时间}|{来源}|{对象id}|{类型}|{对象属性(以&分割)}
2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10
  1. 埋点输出位置:需要和日志文件分开,使用单独的目录。Logback的配置就可以实现

数据收集

  1. 日志收集中间件有很多,FileBeatFlumeFluentdrsyslog
  2. 每台服务器需要部署一个收集中间件,即使一个服务器部署了多个微服务也可以只部署一个收集中间件。
  3. 收集到的信息可以通过消息队列的方式发送给下一个处理环节,使用消息队列可以增加并发性能,削峰填谷,减轻压力。也可以同时发送给多个系统,使数据有多个用途。

数据解析

  1. 使用Logstashgrok表达式可以解析日志数据,并且格式化。
1
2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10

格式化后

1
2
3
4
5
6
7
8
9
{
timestamp: '2019-11-07 10:32:01',
appName: 'api-gateway',
resouceid: '1',
type: 'request-statistics',
ip: '171.221.203.106',
browser: 'CHROME',
operatingSystem: 'WINDOWS_10'
}
  1. Logstash还能完成数据落盘功能,自动创建Elasticsearch索引,并根据天为单位分片
    可以通过索引模板来指定每个字段的类型和分词器等属性

数据使用

除了自己写查询并使用外还可以使用kibana可视化Elasticsearch中的日志

ELK

指的是Elasticsearch + Logstash + kibana组成的日志处理系统

EFK

ELK中的Logstash替换成轻量级的filebeat,牺牲了一定的数据格式化能力,但是性能提升很大

安装EFK

  • 安装Elasticsearch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建并进入文件夹
mkdir -p /opt/software && cd /opt/software
# 拉取软件包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.2-linux-x86_64.tar.gz
# 解压 z:使用gzip x:解压,c是压测 v:显示正在处理的文件名 f:指定文件(必须在最后面,因为后面需要跟文件名)
tar -zxvf elasticsearch-7.3.2-linux-x86_64.tar.gz
# 移动到指定文件夹
mv elasticsearch-7.3.2 /opt/elasticsearch
# 添加一个用户[elasticsearch]并绑定用户根目录[-d /opt/elasticsearch] 设置用户为不能用来登录的[-s /sbin/nologin], 如果需要登录,可以不加[-s ...]并且设置[-p pwd]设置登录密码
useradd elasticsearch -d /opt/elasticsearch -s /sbin/nologin
# 添加两个文件夹的权限
chown elasticsearch.elasticsearch /opt/elasticsearch -R
chown elasticsearch.elasticsearch /opt/logs/elasticsearch -R
# 设置单个进程可拥有的虚拟内存数量,防止elasticsearch内存不够
echo "vm.max_map_count = 655350" >> /etc/sysctl.conf
# 刷新系统配置
sysctl -p
  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 集群名字
#cluster.name: my-application

# 节点名字
#node.name: 192.168.1.31

# 日志位置
path.logs: /opt/logs/elasticsearch

# 本节点访问IP
network.host: 192.168.1.31

# 本节点访问
http.port: 9200

# 节点运输端口
transport.port: 9300

# 集群中其他主机的列表
#discovery.seed_hosts: ["192.168.1.31", "192.168.1.32", "192.168.1.33"]

# 首次启动全新的Elasticsearch集群时,在第一次选举中便对其票数进行计数的master节点的集合
#cluster.initial_master_nodes: ["192.168.1.31", "192.168.1.32", "192.168.1.33"]

# 启用跨域资源共享
http.cors.enabled: true
http.cors.allow-origin: "*"

# 只要有2台数据或主节点已加入集群,就可以恢复
#gateway.recover_after_nodes: 2
  • 安装filebeat
1
2
3
4
5
6
mkdir -p /opt/software && cd /opt/software
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.2-linux-x86_64.tar.gz
mkdir -p /opt/logs/filebeat/
tar -zxvf filebeat-7.3.2-linux-x86_64.tar.gz
mv filebeat-7.3.2-linux-x86_64 /opt/filebeat
# 不另外创建用户,因为filebeat需要监听elasticsearch的日志文件
  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 文件输入
filebeat.inputs:
# 文件输入类型
- type: log
# 开启加载
enabled: true
# 文件位置
paths:
- /var/log/nginx/access.log
# 自定义参数
fields:
type: nginx_access # 类型是nginx_access,和上面fields.type是一致的

# 输出至elasticsearch
output.elasticsearch:
# elasticsearch集群
hosts: ["http://192.168.1.31:9200",
"http://192.168.1.32:9200",
"http://192.168.1.33:9200"]

# 索引配置
indices:
# 索引名
- index: "nginx_access_%{+yyy.MM}"
# 当类型是nginx_access时使用此索引
when.equals:
fields.type: "nginx_access"

# 关闭自带模板
setup.template.enabled: false

# 开启日志记录
logging.to_files: true
# 日志等级
logging.level: info
# 日志文件
logging.files:
# 日志位置
path: /opt/logs/filebeat/
# 日志名字
name: filebeat
# 日志轮转期限,必须要2~1024
keepfiles: 7
# 日志轮转权限
permissions: 0600
  • 安装kibana
1
2
3
4
5
6
mkdir -p /opt/software && cd /opt/software
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.2-linux-x86_64.tar.gz
tar -zxvf kibana-7.3.2-linux-x86_64.tar.gz
mv kibana-7.3.2-linux-x86_64 /opt/kibana
useradd kibana -d /opt/kibana -s /sbin/nologin
chown kibana.kibana /opt/kibana -R
  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
# 本节点访问端口
server.port: 5601

# 本节点IP
server.host: "192.168.1.21"

# 本节点名字
server.name: "192.168.1.21"

# elasticsearch集群IP
elasticsearch.hosts: ["http://192.168.1.31:9200",
"http://192.168.1.32:9200",
"http://192.168.1.33:9200"]
  • 启动所有服务
1
2
3
4
5
6
7
8
# elasticsearch启动(3台es均启动)
sudo -u elasticsearch /opt/elasticsearch/bin/elasticsearch

# filebeat启动
/opt/filebeat/filebeat -e -c /opt/filebeat/filebeat.yml -d "publish"

# kibana启动
sudo -u kibana /opt/kibana/bin/kibana -c /opt/kibana/config/kibana.yml