ELK使用指引

[TOC]

1.ELK概述

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 是一个日志搜集、分析的整体解决方案。

1.1.为什么要使用ELK

日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、程序日志、安全日志。通过对日志分析,了解服务器软硬件信息、检查配置过程中的错误以及错误发生的原因。

往往单台机器的日志,使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存在不同的设备上,或者管理上百台服务器,依次登录每台机器查阅日志就会很繁琐且效率低下。而使用开源的 syslog 虽然可以将所有服务器上的日志集中化管理,但对于要求更高的查询、排序和统计等要求和庞大的机器数量,仍然使用grep、awk和wc等Linux命令难免有点力不从心。

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

1.2.ELK架构图

1.3.ELK工作原理

在所有需要收集日志的服务器上部署Logstash,或者先将日志进行集中化管理在日志服务器上,再在日志服务器上部署Logstash。

  • Logstash 收集日志,将日志格式化并输出到 ElasticSearch 中
  • ElasticSearch 对格式化后的数据进行索引和存储
  • Kibana 从 ES 中查询数据生成图表,并进行前端数据的展示

注:Filebeat是一种轻量级的开源日志文件数据搜集器,它能快速收集数据,并发送给 logstash 进行解析,或是直接发给Elasticsearch存储,性能上相比运行于JvM上的logstash优势明显,是对它的替代。常应用于EFLK架构当中。

2.安装部署

2.1.前提条件

  • 硬件:至少使用2核CPU、16G内存、60G磁盘,推荐8核CPU、64G内存、500G磁盘
  • 软件:推荐操作系统 Centos 7.9 x64,elk示例ip为 192.168.4.222

2.2.安装服务端

  • 1.安装Docker CE
curl -sL 'http://iso.sqlfans.cn/docker/install_docker_2401.sh' | bash
sudo docker --version
  • 2.安装docker-compose
curl -sL 'http://iso.sqlfans.cn/docker/install_docker_compose_2181.sh' | bash
sudo docker-compose --version
  • 3.调整防火墙规则(内网环境可关闭防火墙)
/usr/sbin/iptables -F
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
  • 4.配置vm.max_map_count
sed -i 's/^vm.max_map_count.*/vm.max_map_count=655360/g' /etc/sysctl.conf
cat /etc/sysctl.conf | grep "^vm.max_map_count" > /dev/null || sudo bash -c "echo 'vm.max_map_count=655360' >> /etc/sysctl.conf"
sudo /sbin/sysctl -p /etc/sysctl.conf
  • 5.配置dns并安装基础软件
sed -i 's/^nameserver.*/nameserver 223.5.5.5/g' /etc/resolv.conf
cat /etc/resolv.conf | grep "^nameserver" > /dev/null || echo "nameserver 223.5.5.5" > /etc/resolv.conf
yum install -y -q curl wget ntp ntpdate lrzsz telnet zip unzip net-tools
  • 6.修改时区并同步时间
timedatectl set-timezone Asia/Shanghai
/usr/sbin/ntpdate -u ntp.aliyun.com
  • 7.编辑yml配置文件
sudo mkdir -p /data/docker/elk/{elasticsearch/{config/certs,data,plugins},kibana}
sudo chmod 777 /data/docker/elk/elasticsearch/data
sudo curl -sL http://iso.sqlfans.cn/docker/yml/docker-elk-single-es.yml -o /data/docker/elk/docker-elk.yml
sudo curl -sL http://iso.sqlfans.cn/docker/yml/elk-env.yml -o /data/docker/elk/.env
sudo curl -sL http://iso.sqlfans.cn/docker/yml/elk-kibana.yml -o /data/docker/elk/kibana/kibana.yml
sudo cat /data/docker/elk/.env | egrep "(VERSION|PASSWORD|MEM_LIMIT)"
  • 8.下载yml文件中配置的镜像并启动
docker-compose -f /data/docker/elk/docker-elk.yml up -d
netstat -lnpt | grep "0.0.0.0" | egrep "(5601|9200|9300)"
docker ps
  • 9.浏览器访问(防火墙开放5601、9200)
# elk地址:http://192.168.4.222:5601
# es地址:https://192.168.4.222:9200
# 账密:elastic / AdMin_147

2.3.配置客户端

  • 服务端:将es证书从容器内拷贝出来
sudo docker cp elk-es-1:/usr/share/elasticsearch/config/certs/ca/ca.crt /data/docker/elk/elasticsearch/config/certs/
sudo docker cp elk-es-1:/usr/share/elasticsearch/config/certs/ca/ca.key /data/docker/elk/elasticsearch/config/certs/
ll /data/docker/elk/elasticsearch/config/certs/
  • 服务端:请将ca.crt和ca.key放到文件服务器中,以便filebeat批量配置使用
http://iso.sqlfans.cn/docker/yml/elk-ca.crt
http://iso.sqlfans.cn/docker/yml/elk-ca.key
  • 客户端:下载es证书到本地
sudo mkdir -p /etc/filebeat/certs
sudo curl -sL http://iso.sqlfans.cn/docker/yml/elk-ca.crt -o /etc/filebeat/certs/ca.crt
sudo curl -sL http://iso.sqlfans.cn/docker/yml/elk-ca.key -o /etc/filebeat/certs/ca.key
  • 客户端:配置filebeat收集本地日志并输出给es
#.下载安装文件
sudo curl -L http://iso.sqlfans.cn/linux/filebeat-8.2.2-x86_64.rpm -o /opt/filebeat-8.2.2-x86_64.rpm
sudo yum localinstall -y /opt/filebeat-8.2.2-x86_64.rpm

#.修改filebeat配置
sudo mkdir -p /etc/filebeat/certs
sudo curl -sL http://iso.sqlfans.cn/docker/yml/elk-filebeat.yml -o /etc/filebeat/filebeat.yml
sudo cat /etc/filebeat/filebeat.yml | egrep "(host:|hosts:|password:|index:)"

#.启动filebeat服务
sudo filebeat test config /etc/filebeat/filebeat.yml
sudo filebeat modules enable system
sudo sed -i "s/enabled: false/enabled: true/" /etc/filebeat/modules.d/system.yml
sudo filebeat setup
sudo systemctl restart filebeat
sudo systemctl status filebeat
sudo filebeat version
  • 服务端:确认es索引
curl -k https://elastic:AdMin_147@192.168.4.222:9200/_cat/indices?v

3.使用指导

3.1.初次登陆

3.2.创建数据视图

  • 1.进入主页,打开 Management

  • 2.创建数据视图,假设filebeat推送的es索引为 sam-gateway-YYYYMMDD,可将数据视图命名为 sam-gateway-*,则会自动匹配相关的es索引

  • 3.返回 Discover,从下拉框中选择某个数据视图,就可以查看相关的日志记录

  • 4.打开某个数据视图的日志,还可以根据多个字段对日志进行筛选,比如:只看 host.ip 是 10.30.4.192 的日志

3.3.权限设置

  • 1.创建 spcae 管理空间,用来分离不用的权限

  • 2.创建 role 角色

  • 3.创建 user 用户

  • 4.定时更新spcae,用户可以看到新的dashboard。同时更新roles index权限,用户可以看到新的index

4.使用规范

4.1.基本规范

所有接入elk的服务日志都应该遵循下述原则:

  • 非必要不采集,避免日志过大而占用过多的es存储空间
  • es日志只保留15天,超过15天则自动清理
  • 日志存放统一路径:/data/logs,再根据应用创建子目录
  • 日志切分和过期处理标准:单个日志文件不超过100M、存放时间7天
  • 日志格式统一采用 JSON,便于 ELK 解析处理,比如
2022-08-10 16:15:09,155 INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping {"orderId": 1, "userId":30, "payed":1, "exception":"failed to ....."}

4.2.服务索引命名规范

使用ES存储日志的时候,可以按照索引名切分后再存储,切分方式有:

  • 业务切分,比如 xxx-gateway 代表 xxx系统网关服务
  • 日期切分,日志量小就可以按月、年来做切分,量大就按天来做切分

通常会结合上面两种方式对索引名做切割,比如 xxx-gateway-20200122 代表xxx系统网关服务2020年1月22日的日志

4.3.日志采集来源

日志类型 日志来源 备注
访问日志 Apache、Nginx、Tomcat
业务日志 程序写入的日志文件 推荐开发同事采集异常日志用于分析
系统日志 /var/log/*、rsyslog
网络日志 防火墙、交换机、路由器 可以不采集

4.4.日志采集模板

根据“非必要不采集”的原则,请开发同事参考如下模板,填写需要采集的日志清单:

业务系统 ip地址 服务名称 服务日志路径 建议索引名称 备注
xxx系统 192.168.x.x gateway服务 /data/logs/gateway/application.log xxx-gateway 这是一个样例

4.5.filebeat客户端配置模板

  • 范例1:假设 elk 服务端为 192.168.4.222:5601,es账密为 elastic/xxx,以下则是 filebeat 客户端配置模板:
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - "/data/logs/gateway/application.log"
filebeat.config.modules:
  path: /etc/filebeat/modules.d/*.yml
  reload.enabled: false
setup.template.enabled: false
setup.template.overwrite: true
setup.ilm.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
  host: "192.168.4.222:5601"
output.elasticsearch:
  hosts: ["192.168.4.222:9200"]
  protocol: "https"
  username: "elastic"
  password: "AdMin_147"
  ssl.certificate_authorities: "/etc/filebeat/certs/ca.crt"
  indices:
    - index: "xxx-gateway-%{+yyyyMMdd}"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  • 范例2:单机多日志监控并写入不同es索引
#================ input =====================
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - "/var/log/*.log"
  tags: ["syslog"]
  fields:
    index: "syslog"
  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/error.log
  tags: ["nginx"]
  fields:
    index: "nginx"
  multiline.pattern: '^\s'
  multiline.negate: true
  multiline.match: after
#================ output =====================
output.elasticsearch:
# hosts: ["192.168.0.21:9200","192.168.0.22:9200"]
  hosts: ["192.168.4.222:9200"]
  protocol: "https"
  username: "elastic"
  password: "xxx"
  ssl.certificate_authorities: "/etc/filebeat/certs/ca.crt"
  indices:
    - index: "syslog-log-%{+yyyyMMdd}"
      when.contains:
        fields:
          index: "syslog"
    - index: "nginx-log-%{+yyyyMMdd}"
      when.contains:
        fields:
          index: "nginx"
#============== Elasticsearch template setting ==========
filebeat.config.modules:
  path: /etc/filebeat/modules.d/*.yml
  reload.enabled: false
setup.template.enabled: false
setup.template.overwrite: true
setup.ilm.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
  host: "192.168.4.222:5601"
#================== processors config ===================
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~

5.服务器维护

5.1.ES索引定期清理

当elk运行一段时间之后,ES中会保存大量的日志,需要定时清理。下面将创建一个定时清理14天以前es索引的任务。

  • 将如下脚本保存为:/scripts/crontab/es_clear_daily.sh
#!/bin/bash

iport=192.168.4.222:9200
user=elastic
pwd=AdMin_147
dte=`date -d "14 days ago" +%Y%m%d`

for idx in `curl -sk https://$user:$pwd@$iport/_cat/indices?v|awk '{print $3}'|grep $dte`;
do 
curl -k -X DELETE "https://$user:$pwd@$iport/$idx";
done
  • 添加计划任务
echo "9 2 * * * /scripts/crontab/es_clear_daily.sh > /dev/null 2>&1" >> /var/spool/cron/`whoami`
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2024-06-17 17:20:44

results matching ""

    No results matching ""