其他分享
首页 > 其他分享> > 简单ELK配置实现生产级别的日志采集和查询实践

简单ELK配置实现生产级别的日志采集和查询实践

作者:互联网

概述

生产问题

集群规划

集群角色

ES为了处理大型数据集,实现容错和高可用性,ES可运行多服务器组成分布式环境下也称为集群;集群内的节点的cluster.name相同,形成集群的每个服务器称为节点。ES 为分配不同的任务,定义了以下几个节点角色:Master,Data Node,Coordinating Node,Ingest Node:

一个节点可以充当一个或多个角色,默认三个角色都有。

脑裂问题

所谓脑裂问题,就是同一个集群中的不同节点,对于集群的状态有了不一样的理解,比如集群中存在两个master,正常情况下我们集群中只能有一个master节点。如果因为网络的故障,导致一个集群被划分成了两片,每片都有多个node,以及一个master,那么集群中就出现了两个master了。但是因为master是集群中非常重要的一个角色,主宰了集群状态的维护,以及shard的分配,因此如果有两个master,可能会导致数据异常

索引分片

分片数指定后不可变,除非重索引,分片对应的存储实体是索引,分片并不是越多越好,分片多浪费存储空间、占用资源、影响性能。

分片副本

副本数是可以随时调整的,副本的作用是备份数据保证高可用数据不丢失,高并发的时候参与数据查询。

ElasticSearch部署

部署规划

这里我们部署一个3个节点组成的ES集群,因此也不单独分节点类型部署,三台服务器分别为192.168.5.52 es-node-01、192.168.5.53 es-node-02、192.168.12.27 es-node-03,操作系统版本为CentOS 7.8。

部署方式

官网支持二进制部署,也支持使用Docker和K8S部署方式,这里我们使用二进制部署方式,使用最新版本8.2.3

# 官方下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.2.3-linux-x86_64.tar.gz
# 三台服务器都准备好安装包,进行解压
tar -xvf elasticsearch-8.2.3-linux-x86_64.tar.gz
# 进入ES目录,ES安装包已自带的JDK17,无需单独下载安装JDK

image-20220627172526243

前置配置

在每一台服务器上先做下面环境设置

# 创建es用户
useradd es
# 授权es用户
chown -R es:es elasticsearch-8.2.3
vim /etc/security/limits.conf
# 直接末尾添加限制
es soft nofile 65536
es hard nofile 65536
echo vm.max_map_count=262144>> /etc/sysctl.conf
sysctl -p
systemctl stop firewalld
systemctl disable firewalld
cat > /etc/hosts << EOF
192.168.5.52 es-node-01
192.168.5.53 es-node-02
192.168.12.27 es-node-03
EOF

配置文件

先创建logs和data目录;ES的集群名称配置一样es-cluster,三台ES节点的node.name分别为 es-node-01、es-node-02、es-node-03,network.host配置为各自本机的IP地址。修改配置文件信息为如下vi config/elasticsearch.yml

cluster.name: es-cluster
node.name: es-node-01
node.attr.rack: r1
path.data: /home/commons/elasticsearch-8.2.3/data
path.logs: /home/commons/elasticsearch-8.2.3/logs
network.host: 192.168.5.52
discovery.seed_hosts: ["192.168.5.52", "192.168.5.53", "192.168.12.27"]
cluster.initial_master_nodes: ["192.168.5.52", "192.168.5.53","192.168.12.27"]
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length

启动

# 依次启动三台服务器的ES服务
./bin/elasticsearch -d

访问3台服务器9200端口,http://192.168.5.52:9200/ ,如果都看到如下信息则代表ES启动成功

image-20220627174638914

再次查看集群的健康状态,http://192.168.5.52:9200/_cat/health

image-20220627174832419

Kibana部署

下载

Kibana的版本与ES版本保持一致,也是使用最新的8.2.3。我们在192.168.5.52上部署

# Kibana下载
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.2.3-linux-x86_64.tar.gz
# 解压文件
tar -xvf kibana-8.2.3-linux-x86_64.tar.gz 
# 授权
chown -R es:es kibana-8.2.3
# 进入Kibana的目录
cd kibana-8.2.3

配置

vim config/kibana.yml

# 直接再末尾添加以下配置

# 服务器地址
server.host: "0.0.0.0"
# ES服务IP
elasticsearch.hosts: ["http://192.168.5.52:9200/"]
# 设置中文
i18n.locale: "zh-CN"

启动

# 后台启动kibana
nohup ./bin/kibana  > logs/kibana.log 2>&1 &

访问Kibana控制台页面,http://192.168.5.52:5601/

image-20220627180837163

部署IK分词器

默认分词器是不支持中文分词,我们可以安装IK分词器实现中文的分词

# IK分词器在GitHub上,下载最新版本8.2.0
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip
# 解压到elasticsearch目录下的plugins/ik目录
unzip elasticsearch-analysis-ik-8.2.0.zip -d ./plugins/ik

由于ik的版本与ES版本不一致,修改解压目录到ik下的 plugin-descriptor.properties 文件中的

elasticsearch.version=8.2.3

image-20220627180516773

如果版本一致也可以直接在线安装

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.2.0/elasticsearch-analysis-ik-8.2.0.zip

ES索引管理

索引声明周期策略

设置索引生命周期策略和索引模板即可以通过Kibana可视化界面设置也可以通过ES提供的Rest API接口进行设置,我们先通过Kibaba页面来配置,首先通过点击左侧菜单的Management-Stack Management,然后左侧菜单再点击索引生命周期策略
image-20220627181243265

点击索引生命周期策略页面的右上角创建策略

image-20220627182820571

这里如果是测试可以将存在时间设置为分钟级别,便于观察,创建完毕后查看刚创建的demo-log-policy

image-20220627183119412

也可以通过ES提供的Rest API接口进行设置,通过Kibana点击左侧菜单的Management-开发工具进入控制台tab页,然后输入如下生命周期设置策略,返回结果

image-20220627183244325

PUT _ilm/policy/demo-log-policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_size": "200gb",
            "max_primary_shard_size": "50gb",
            "max_age": "7d"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "15d",
        "actions": {
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "60d",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}

索引模板

点击索引管理-索引模板,创建模板

image-20220627190551074

验证模板后提交查看已创建的模板,创建完成后可以通过在索引声明周期绑定模板,也可以直接在模板里增加绑定语句设置

image-20220627190926548

当然也可以通过ES提供的Rest API接口进行设置

PUT _index_template/demo-log-template
{
  "version": 1,
  "priority": 10,
  "template": {
    "settings": {
      "index": {
        "lifecycle": {
          "name": "demo-log-policy",
          "rollover_alias": "demo-log"
        },
        "number_of_shards": "2",
        "number_of_replicas": "1"
      }
    },
    "mappings": {
      "_source": {
        "excludes": [],
        "includes": [],
        "enabled": true
      },
      "_routing": {
        "required": false
      },
      "dynamic": true,
      "numeric_detection": false,
      "date_detection": true,
      "dynamic_date_formats": [
        "strict_date_optional_time",
        "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"
      ],
      "dynamic_templates": []
    }
  },
  "index_patterns": [
    "demo-log-*"
  ],
  "_meta": {
    "description": "测试索引模板"
  }
}

索引

先创建初始索引

PUT demo-log-000001
{
  "aliases": {
    "demo-log": {
      "is_write_index": true
    }
  }
}

image-20220627191536794

如果前面索引生命周期模板的各个周期保留时间设置较短如为分钟,手动提交日志到索引和查看,需要实时查看其效果则可以增加如下设置和演示操作

PUT /_cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "10s" 
  }
}

POST /demo-log/_doc
{
	"message":"world2"
}

GET /demo-log/_search
{  
  "query": {
    "match_all": {}
  }
}

Logstash

修改配置和启动,vi config/logstash.conf

input {
  beats {
    port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["http://192.168.5.52:9200","http://192.168.5.53:9200","http://192.168.12.27:9200"]
    index => "%{app_id}"
  }
}

FileBeat

FileBeat和Logstash部署和配置可以详细查看前面的文章《数仓选型必列入考虑的OLAP列式数据库ClickHouse(中)》,修改配置和启动, parsers.multiline实现多行合并一行配置,比如Java异常堆栈日志打印合并在一行。

vi filebeat.yml

filebeat.inputs:
- type: filestream
  id: demo-log
  enabled: true
  paths:
    # Filebeat处理文件的绝对路径
    - /home/itxs/demo/logs/*.log
  # 使用 fields 模块添加字段
  fields:
    app_id: demo-log
  # 将新增的字段放在顶级
  fields_under_root: true
  parsers:
    - multiline:
        type: pattern
        pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
        negate: true
        match: after
processors:
- drop_fields:
    fields: ["log","input","agent","ecs"]

output.logstash:
  hosts: ["192.168.12.28:5044"]

采集/home/itxs/demo/logs/目录的数据,由App产生日志,然后通过Kibana的数据视图-创建数据视图,匹配我们前面创建的索引和别名

image-20220627193801129

最后通过Kibana左侧菜单的Analytics-Discover选择demo视图然后可以搜索日志,最后日志查询结果如下

image-20220627192914163

**本人博客网站 **IT小神 www.itxiaoshen.com

标签:ELK,查询,索引,集群,分片,elasticsearch,日志,节点,ES
来源: https://www.cnblogs.com/itxiaoshen/p/16418088.html