ELK-V7.9.3 部署
- 为什么用到ELK?
平时我们需要进行日志分析的时候,可以直接在日志文件中 grep、awk 就可以过滤出自己想要的信息及关键字,但规模较大的场景中,此方法极大的减低了效率,面临的问题,包括日志量过大,如何归档、文本搜索太慢、如何多维度查询,需要集中化的日志管理,所有服务器上的日志并收集汇总。常见解决思路就是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问,一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率;
- 完整的集中式日志系统,需要包含以下几个主要特点:
1、收集-能够采集多种来源的日志数据
2、传输-能够稳定的把日志数据传输到*系统
3、存储-如何存储日志数据
4、分析-可以支持 UI 分析
5、警告-能够提供错误报告,监控机制
- ELK提供了一套优越的解决方案,并且开源,互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统
ELK是三款开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 新增了一个FileBeat,轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash
1、Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
2、Logstash 主要是日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机,server端负责将收到的各节点日志进行过滤、修改等操作一并发送至elasticsearch。
3、Kibana 是开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
4、Filebeat 涉及两个组件:查找器prospector和采集器harvester,来读取文件(tail file)并将事件数据发送到指定的输出elasticsearch中或者Kibana;
5、概述:
filebeat隶属于beats,目前Beats包含工具有:Packetbeat(搜集网络流量数据),Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)Filebeat(搜集文件,日志数据汇总),Winlogbeat(搜集 Windows 事件日志数据)等;
- 官方文档
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html
Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中文社区:
https://elasticsearch.cn/
此文档以容器化部署elk,es为集群,除filebeat为源码包的方式
- Centos 7.x 系统
- 2.4Hz 8核32G内存
- 注意内存需给大,否则会出现es挂的情况
容器化部署elk
- elasticsearch+filebeat+kibana v7.9.3(最新)
- docker 服务安装
# 更新yum源
yum update
# 删除旧版本的docker
yum remove docker docker-common docker-selinux docker-engine -y
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 下载安装docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce
# 启动docker服务
systemctl start docker && systemctl enable docker
# 查看docker版本
docker version
- 下载elasticsearch,kibana镜像
docker pull elasticsearch:7.9.3
docker pull kibana:7.9.3
docker pull lmenezes/cerebro:latest (es索引管理工具)
- 创建elk数据目录,用于映射容器数据到宿主机
# 创建存放配置文件,数据,日志目录
mkdir -p /data/elk/{conf,data,logs}
# 由于我们ES是以集群的方式,所以数据跟日志要创建master,slave1,slave2三个节点目录
mkdir -p /data/elk/data/{master,slave1,slave2}
mkdir -p /data/elk/logs/{master,slave1,slave2}
- 创建es-master,slave1,slave2节点配置文件
# master:/data/elk/conf/master/master.yml
cluster.name: yunwei_cluster
node.name: master
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- 172.17.0.2:9300 # master,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
- 172.17.0.3:9301 # slave1,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
- 172.17.0.4:9301 # slave2,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
cluster.initial_master_nodes:
- 172.17.0.2 # 此IP为master容器ip地址,主节点
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave1:/data/elk/conf/slave1/slave1.yml
cluster.name: yunwei_cluster
node.name: slave1
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9201
transport.port: 9301
discovery.seed_hosts:
- 172.17.0.2:9300 # master
- 172.17.0.3:9302 # slave1
- 172.17.0.4:9301 # slave2
cluster.initial_master_nodes:
- 172.17.0.2
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave2:/data/elk/conf/slave2/slave2.yml
cluster.name: yunwei_cluster
node.name: slave2
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9202
transport.port: 9302
discovery.seed_hosts:
- 172.17.0.2:9300 # master
- 172.17.0.3:9302 # slave2
- 172.17.0.4:9301 # slave3
cluster.initial_master_nodes:
- 172.17.0.2
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
- 启动elasticsearch容器: master,slave1,slave2节点
# master
docker run -d --name=master -p 9200:9200 -p 9300:9300 -v /data/elk/config/master.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/master:/usr/share/elasticsearch/data -v /data/elk/logs/master:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave1
docker run -d --name=slave1 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave1:/usr/share/elasticsearch/data -v /data/elk/logs/slave1:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave2
docker run -d --name=slave2 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave2:/usr/share/elasticsearch/data -v /data/elk/logs/slave2:/usr/share/elasticsearch/logs elasticsearch:7.3.1
- 修改es的运行内存,防止出现内存溢出,es挂的情况
# 进入es容器:master,slave1,slave2
docker exec -it master/slave1/slave2 /bin/bash
# 修改es启动内存
/usr/share/elasticsearch/config/jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms3g # 根据实际内存分配
-Xmx3g
# 重启master,slave1,slave2容器
- 浏览器访问测试:http://ip:{9200,9201,9202}
- cerebro容器的创建及启动
docker run -d -p 9001:9000 --name=cerebro lmenezes/cerebro
- 浏览器访问cerebro:http://IP地址或域名:9001
- kibana容器的创建及启动
docker run -d -p 5601:5601 --name=kibana -e "I18N_LOCALE=zh-CN" -e "ELASTICSEARCH_URL=http://物理机的IP地址或域名:9200" kibana:7.3.1
- 修改kibana配置文件,添加elasticsearch地址
# 登录kibana容器,修改配置文件
docker exec -it kibana /bin/bash
/usr/share/kibana/config/kibana.yml
# 添加elasticsearch
elasticsearch.hosts: [ "http://宿主机IP:9200" ]
# 重启kibana容器
docker restart kibana
- 查看已创建启动的容器:docker ps
- 浏览器访问kibana: http://IP或域名:5601
filebeat 收集汇总日志
-
日志在单个文件:根据不同的服务编写不同的yml文件并在主配置文件中导入子yml加载执行采集即可;
-
日志在多个文件:直接可以在主配置yml文件中编写采集动作即可;
-
filebeat 源码包下载:
# 下载filebeat源码包 -- elk官网下载即可 filebeat-7.9.3-linux-x86_64.tar.gz
日志收集端服务节点:/srv/filebeat-7.9.3-linux-x86_64.tar.gz
# 解压
tar -zxf filebeat-7.9.3-linux-x86_64.tar.gz
cd filebeat-7.9.3
- 示例一:日志在单个文件(采集详细级别的日志: debug,info,warn,error)
目录结构:
filebeat-7.9.3
- modules # 子yml文件、具体某个服务日志
- asset-service.yml
- user-service.yml
- filebeat-new.yml # 主yml文件
- 主yml配置文件:filebeat-new.yml
filebeat.config.inputs:
path:
modules/*.yml # 导入子服务配置文件
reload.enabled: true # 启动加载
reload.period: 10s # 每10秒检查一次
# 自定义索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true
# 删除索引中不需要的字段
processors:
- drop_fields:
fields: ["input","agent"]
# 收集日志输出到elasticsearch
output.elasticsearch:
hosts: ["IP地址:9200"]
index: "test-%{+yyy.MM.dd}"
- 子服务yml配置文件:asset-service.yml
# DEBUG 日志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
# 过滤debug日志
include_lines: ['DEBUG']
# 项目环境
tags: ["tangpiao","pro"]
# 定义字段
fields:
level: DEBUG
module: asset
# 如果设置为true,则在es中新增的字段格式为:"level":"debug","module":"asset"
fields_under_root: true
# 处理一行日志占据多行的情况
# 多行日志开始的那一行的pattern
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
# ERROR 日志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['ERROR']
tags: ["tangpiao","pro"]
fields:
level: ERROR
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
# WARN 日志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['WARN']
tags: ["tangpiao","pro"]
fields:
level: WARN
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
# INFO 日志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['INFO']
tags: ["tangpiao","pro"]
fields:
level: INFO
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
- 示例二:日志在多个文件(采集详细级别的日志: debug,info,warn,error)
- 主配置文件:filebeat-new.yml
# 创建新的filebeat收集模板配置文件,不在原有的filebeat.yml修改: vim filebeat-new.yml
filebeat.inputs:
- type: log
enabled: true
# # 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /home/opsabc/deploy/debug/user-service/debug-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义日志级别,添加新的字段
fields:
level: DEBUG
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"debug"
fields_under_root: true
# 处理一行日志占据多行的情况
# 多行日志开始的那一行的pattern
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
- type: log
enabled: true
# # 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /home/opsabc/deploy/error/user-service/error-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义日志级别,添加新的字段
fields:
level: ERROR
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理一行日志占据多行的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
- type: log
enabled: true
# # 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /home/opsabc/deploy/info/user-service/info-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义日志级别,添加新的字段
fields:
level: INFO
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理一行日志占据多行的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
- type: log
enabled: true
# # 指定要监控的日志,可以指定具体得文件或者目录
paths:
- /home/opsabc/deploy/warn/user-service/warn-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义日志级别,添加新的字段
fields:
level: WARN
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理一行日志占据多行的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.negate: true
multiline.match: after
# 自定义索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true
# 删除索引中不需要的字段
processors:
- drop_fields:
fields: ["input","agent"]
# 收集日志输出到elasticsearch
output.elasticsearch:
hosts: ["IP地址:9200"]
index: "test-%{+yyy.MM.dd}"
- 启动filebeat进行日志监控收集
nohup /srv/filebeat-7.9.3/filebeat -e -c /srv/filebeat-7.9.3/filebeat-new.yml &
- Stack Management ——> 索引管理