文章字数:1443,阅读全文大约需要5分钟
在业务中收集需要的数据,并且进行处理和展示的架构。业务中收集数据的工作被称为埋点
,一般使用日志的方式进行。
大致流程
微服务日志埋点:使用日志输出框架,例如Logback
日志收集:收集Logback
输出的日志,使用FileBeat
2.1 消息队列传输:这里可以使用消息队列减轻日志解析压力
数据解析,落盘:将Logback
传来的数据格式化成可用的格式如json
,然后生成ElasticSearch
分片格式并发送(落盘)
数据使用:ElasticSearch
收到后就可以提供查询服务,供使用者获取信息
数据展示:使用Kibana
展示数据
详解
数据生成
数据埋点:数据埋点就是将需要的数据在业务中抽离出来,一般使用日志框架就可以了Logback
。也可以自己输出成文件。
格式:输出的格式需要统一,例如
1 2
| # {时间}|{来源}|{对象id}|{类型}|{对象属性(以&分割)} 2019-11-07 10:32:01|api-gateway|1|request-statistics|ip=171.221.203.106&browser=CHROME&operatingSystem=WINDOWS_10
|
- 埋点输出位置:需要和日志文件分开,使用单独的目录。
Logback
的配置就可以实现
数据收集
- 日志收集中间件有很多,
FileBeat
、Flume
、Fluentd
、rsyslog
等
- 每台服务器需要部署一个收集中间件,即使一个服务器部署了多个微服务也可以只部署一个收集中间件。
- 收集到的信息可以通过消息队列的方式发送给下一个处理环节,使用消息队列可以增加并发性能,削峰填谷,减轻压力。也可以同时发送给多个系统,使数据有多个用途。
数据解析
- 使用
Logstash
的grok
表达式可以解析日志数据,并且格式化。
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' }
|
Logstash
还能完成数据落盘功能,自动创建Elasticsearch
索引,并根据天为单位分片
可以通过索引模板来指定每个字段的类型和分词器等属性
数据使用
除了自己写查询并使用外还可以使用kibana
可视化Elasticsearch
中的日志
ELK
指的是Elasticsearch
+ Logstash
+ kibana
组成的日志处理系统
EFK
将ELK
中的Logstash
替换成轻量级的filebeat
,牺牲了一定的数据格式化能力,但是性能提升很大
安装EFK
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
|
path.logs: /opt/logs/elasticsearch
network.host: 192.168.1.31
http.port: 9200
transport.port: 9300
http.cors.enabled: true http.cors.allow-origin: "*"
|
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
output.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}" 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 keepfiles: 7 permissions: 0600
|
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
server.host: "192.168.1.21"
server.name: "192.168.1.21"
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
|