前言
ELK 是 Elasticsearch、Logstrash 和 Kibana 的缩写,它们代表的是一套成熟的日志管理系统,ELK Stack 已经成为目前最流行的集中式日志解决管理方案。
Elasticsearch
分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作
Logstrash
数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;
Kibana
数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示
Filebeat
ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发是对它的替代。在需要采集日志数据的服务上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取日志文件数据,迅速发送到 Logstash 进行解析,或直接发送到 Elasticsearch 进行集中式存储和分析。
es集群部署
安装docker
docker和docker-compose一键安装脚本
docker-compose.yml
代码语言:javascript复制version: '3'
services:
es-master:
image: elasticsearch:7.16.2
container_name: es-master
restart: always
user: root
environment:
# 开启内存锁定
- "bootstrap.memory_lock=true"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "TAKE_FILE_OWNERSHIP=true"
- "TZ=Asia/Shanghai"
ulimits:
# 取消内存相关限制 用于开启内存锁定
memlock:
soft: -1
hard: -1
volumes:
- ./conf/es-master.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/ly-elk/master/data:/usr/share/elasticsearch/data
- /data/ly-elk/master/logs:/usr/share/elasticsearch/logs
- /data/ly-elk/master/plugins:/usr/share/elasticsearch/plugins
ports:
- "9200:9200"
- "9300:9300"
mem_limit: 3g
networks:
- elk
es-slave1:
image: elasticsearch:7.16.2
container_name: es-slave1
restart: always
user: root
environment:
# 开启内存锁定
- "bootstrap.memory_lock=true"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "TAKE_FILE_OWNERSHIP=true"
- "TZ=Asia/Shanghai"
ulimits:
# 取消内存相关限制 用于开启内存锁定
memlock:
soft: -1
hard: -1
volumes:
- ./conf/es-slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/ly-elk/slave1/data:/usr/share/elasticsearch/data
- /data/ly-elk/slave1/logs:/usr/share/elasticsearch/logs
- /data/ly-elk/slave1/plugins:/usr/share/elasticsearch/plugins
ports:
- "9201:9201"
- "9301:9301"
mem_limit: 3g
networks:
- elk
kibana:
image: kibana:7.16.2
container_name: kibana
restart: always
depends_on:
- es-master #kibana在elasticsearch启动之后再启动
- es-slave1
environment:
- "ELASTICSEARCH_HOSTS=http://es-master:9200"
- "I18N_LOCALE=zh-CN"
- "TZ=Asia/Shanghai"
ports:
- "5601:5601"
volumes:
- ./conf/kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- elk
logstash:
image: logstash:7.16.2
container_name: logstash
restart: always
depends_on:
- es-master #logstash在elasticsearch启动之后再启动
- es-slave1
environment:
- "elasticsearch.hosts=http://es-master:9200"
- "xpack.monitoring.elasticsearch.hosts=http://es-master:9200"
- "xpack.monitoring.enabled=true"
- "TZ=Asia/Shanghai"
volumes:
- ./conf/logstash/:/usr/share/logstash/pipeline
ports:
- "5044:5044" #设置端口
networks:
- elk
networks:
elk:
es-master.yml
代码语言:javascript复制# 集群名称
cluster.name: es-cluster
# 节点名称
node.name: es-master
# 是否可以成为master节点
node.master: true
# 是否允许该节点存储数据,默认开启
node.data: true
# 网络绑定
network.host: 0.0.0.0
# 设置对外服务的http端口
http.port: 9200
# 设置节点间交互的tcp端口
transport.port: 9300
# 集群发现
discovery.seed_hosts:
- es-master
- es-slave1
# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算
cluster.initial_master_nodes:
- es-master
# 支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
# 安全认证
xpack.security.enabled: false
#http.cors.allow-headers: "Authorization"
es-slave1.yml
代码语言:javascript复制# 集群名称
cluster.name: es-cluster
# 节点名称
node.name: es-slave1
# 是否可以成为master节点
node.master: true
# 是否允许该节点存储数据,默认开启
node.data: true
# 网络绑定
network.host: 0.0.0.0
# 设置对外服务的http端口
http.port: 9200
# 设置节点间交互的tcp端口
transport.port: 9300
# 集群发现
discovery.seed_hosts:
- es-master
- es-slave1
# 手动指定可以成为 mater 的所有节点的 name 或者 ip,这些配置将会在第一次选举中进行计算
cluster.initial_master_nodes:
- es-master
# 支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
# 安全认证
xpack.security.enabled: false
#http.cors.allow-headers: "Authorization"
启动
代码语言:javascript复制docker-compose up -d
健康检查
es 集群状态
通过filebeat传输日志
服务器部署
基于docker的filebeat在需要收集日志的服务器上单独启动
docker-compose.yml
代码语言:javascript复制version: "3"
services:
filebeat:
# 容器名称
container_name: filebeat
# 主机名称
hostname: filebeat
# 镜像
image: elastic/filebeat:8.2.0
# 重启机制
restart: always
# 启动用户
user: root
# 持久化挂载
volumes:
# 映射到容器中[作为数据源]
- /var/log/messages:/log/messages
# 方便查看数据及日志(可不映射)
- /data/ly-elk/filebeat/logs:/usr/share/filebeat/logs
- /data/ly-elk/filebeat/data:/usr/share/filebeat/data
# 映射配置文件到容器中
- ./conf/filebeat.yml:/usr/share/filebeat/filebeat.yml
# 使用主机网络模式
network_mode: host
filebeat.yml
代码语言:javascript复制filebeat.inputs:
- type: log
enabled: true
paths:
- /log/messages
fields:
log_type: syslog
output.logstash:
hosts: ["127.0.0.1:5044"]
enabled: true
worker: 1
compression_level: 3
loadbalance: true
启动
代码语言:javascript复制docker-compose up -d
es集群确认
确认es是否收到日志
代码语言:javascript复制# 检测集群是否健康
# green表示正常
curl '127.0.0.1:9200/_cat/health?v'
# 列出所有索引
# 是否收到日志
curl '127.0.0.1:9200/_cat/indices?v'
kibana 使用
访问
http://ip:5601
首页
message日志
可观测性-->日志-->流式传输