1. ELK日志分析架构设计概述
ELK Stack(Elasticsearch, Logstash, Kibana)是一套开源的日志分析平台,用于收集、存储、分析和可视化日志数据。ELK架构设计是确保日志分析系统高效、可靠运行的基础,它涉及到数据收集、处理、存储和可视化等多个方面。本文详细介绍ELK日志分析架构设计的核心要素和最佳实践。更多学习教程www.fgedu.net.cn
$ curl -X GET “http://fgedudb:9200/”
{
“name” : “elasticsearch-node-1”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “abc123def456”,
“version” : {
“number” : “7.17.0”,
“build_flavor” : “default”,
“build_type” : “deb”,
“build_hash” : “747e1cc71def077253878a59143c1f785afa92b9”,
“build_date” : “2022-01-13T00:42:12.435326Z”,
“build_snapshot” : false,
“lucene_version” : “8.11.1”,
“minimum_wire_compatibility_version” : “6.8.0”,
“minimum_index_compatibility_version” : “6.0.0-beta1”
},
“tagline” : “You Know, for Search”
}
# 检查ELK系统状态
$ curl -X GET “http://fgedudb:9200/_cluster/health”
{
“cluster_name” : “elasticsearch”,
“status” : “green”,
“timed_out” : false,
“number_of_nodes” : 3,
“number_of_data_nodes” : 3,
“active_primary_shards” : 10,
“active_shards” : 20,
“relocating_shards” : 0,
“initializing_shards” : 0,
“unassigned_shards” : 0,
“delayed_unassigned_shards” : 0,
“number_of_pending_tasks” : 0,
“number_of_in_flight_fetch” : 0,
“task_max_waiting_in_queue_millis” : 0,
“active_shards_percent_as_number” : 100.0
}
2. 架构组件
ELK架构由多个核心组件组成,包括Elasticsearch、Logstash、Kibana、Filebeat等。学习交流加群风哥微信: itpux-com
$ cat > elk_architecture_components.md << 'EOF' # ELK架构组件 ## 1. Elasticsearch - 分布式搜索引擎:存储和索引日志数据 - 集群管理:管理多个节点组成的集群 - 数据分片:将数据分布到多个节点 - 数据复制:提供数据冗余和高可用性 ## 2. Logstash - 数据收集:从多个来源收集日志数据 - 数据处理:对日志数据进行过滤、转换和 enrichment - 数据输出:将处理后的数据输出到Elasticsearch ## 3. Kibana - 数据可视化:创建仪表板和图表 - 数据查询:执行复杂的搜索查询 - 告警管理:设置基于条件的告警 - 报告生成:生成日志分析报告 ## 4. Filebeat - 轻量级收集器:在服务器上收集日志文件 - 数据传输:将日志数据传输到Logstash或Elasticsearch - 可靠性:确保数据传输的可靠性 - 资源占用:低资源占用 ## 5. 其他组件 - Metricbeat:收集系统和服务指标 - Packetbeat:收集网络数据包 - Heartbeat:监控服务可用性 - APM Server:应用性能监控 EOF # 查看架构组件 $ cat elk_architecture_components.md # ELK架构组件 ## 1. Elasticsearch - 分布式搜索引擎:存储和索引日志数据 - 集群管理:管理多个节点组成的集群 - 数据分片:将数据分布到多个节点 - 数据复制:提供数据冗余和高可用性 ## 2. Logstash - 数据收集:从多个来源收集日志数据 - 数据处理:对日志数据进行过滤、转换和 enrichment - 数据输出:将处理后的数据输出到Elasticsearch ## 3. Kibana - 数据可视化:创建仪表板和图表 - 数据查询:执行复杂的搜索查询 - 告警管理:设置基于条件的告警 - 报告生成:生成日志分析报告 ## 4. Filebeat - 轻量级收集器:在服务器上收集日志文件 - 数据传输:将日志数据传输到Logstash或Elasticsearch - 可靠性:确保数据传输的可靠性 - 资源占用:低资源占用 ## 5. 其他组件 - Metricbeat:收集系统和服务指标 - Packetbeat:收集网络数据包 - Heartbeat:监控服务可用性 - APM Server:应用性能监控
3. 设计原则
ELK架构设计应遵循以下核心原则,确保架构的合理性和有效性。
$ cat > elk_architecture_principles.md << 'EOF' # ELK架构设计原则 ## 1. 可扩展性原则 - 水平扩展:通过增加节点来扩展集群 - 数据分片:将数据分布到多个节点 - 负载均衡:均匀分布工作负载 ## 2. 高可用性原则 - 数据复制:提供数据冗余 - 故障转移:自动检测和处理节点故障 - 集群健康:监控集群状态 ## 3. 性能优化原则 - 索引优化:优化索引结构和设置 - 查询优化:优化搜索查询 - 存储优化:选择合适的存储介质 ## 4. 安全性原则 - 访问控制:基于角色的访问控制 - 数据加密:保护数据传输和存储 - 审计日志:记录所有操作 ## 5. 可管理性原则 - 集中管理:统一管理界面 - 监控和告警:实时监控系统状态 - 自动化运维:自动执行维护操作 EOF # 查看设计原则 $ cat elk_architecture_principles.md # ELK架构设计原则 ## 1. 可扩展性原则 - 水平扩展:通过增加节点来扩展集群 - 数据分片:将数据分布到多个节点 - 负载均衡:均匀分布工作负载 ## 2. 高可用性原则 - 数据复制:提供数据冗余 - 故障转移:自动检测和处理节点故障 - 集群健康:监控集群状态 ## 3. 性能优化原则 - 索引优化:优化索引结构和设置 - 查询优化:优化搜索查询 - 存储优化:选择合适的存储介质 ## 4. 安全性原则 - 访问控制:基于角色的访问控制 - 数据加密:保护数据传输和存储 - 审计日志:记录所有操作 ## 5. 可管理性原则 - 集中管理:统一管理界面 - 监控和告警:实时监控系统状态 - 自动化运维:自动执行维护操作
4. Elasticsearch设计
Elasticsearch是ELK Stack的核心,负责存储和索引日志数据。学习交流加群风哥QQ113257174
$ cat /etc/elasticsearch/elasticsearch.yml
cluster.name: elasticsearch
node.name: ${HOSTNAME}
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: [“es-node1”, “es-node2”, “es-node3”]
cluster.initial_master_nodes: [“es-node1”, “es-node2”, “es-node3”]
# 检查Elasticsearch集群状态
$ curl -X GET “http://fgedudb:9200/_cluster/state”
{
“cluster_name” : “elasticsearch”,
“compressed_size_in_bytes” : 3587,
“cluster_uuid” : “abc123def456”,
“version” : 17,
“state_uuid” : “xyz789”,
“master_node” : “es-node1”,
“nodes” : {
“es-node1” : {
“name” : “es-node1”,
“ephemeral_id” : “node1-ephemeral”,
“transport_address” : “192.168.1.100:9300”,
“attributes” : { “ml.machine_memory” : “67108864”, “ml.max_open_jobs” : “20” }
},
“es-node2” : {
“name” : “es-node2”,
“ephemeral_id” : “node2-ephemeral”,
“transport_address” : “192.168.1.101:9300”,
“attributes” : { “ml.machine_memory” : “67108864”, “ml.max_open_jobs” : “20” }
},
“es-node3” : {
“name” : “es-node3”,
“ephemeral_id” : “node3-ephemeral”,
“transport_address” : “192.168.1.102:9300”,
“attributes” : { “ml.machine_memory” : “67108864”, “ml.max_open_jobs” : “20” }
}
}
}
# 配置索引模板
$ curl -X PUT “http://fgedudb:9200/_template/logs_template” -H “Content-Type: application/json” -d ‘
{
“index_patterns”: [“logs-*”],
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2,
“refresh_interval”: “5s”
},
“mappings”: {
“properties”: {
“@timestamp”: { “type”: “date” },
“message”: { “type”: “text” },
“host”: { “type”: “keyword” },
“service”: { “type”: “keyword” },
“level”: { “type”: “keyword” }
}
}
}
‘
5. Logstash设计
Logstash负责收集、处理和输出日志数据,是ELK Stack的数据处理中心。更多学习教程公众号风哥教程itpux_com
$ cat /etc/logstash/conf.d/logstash.conf
input {
beats {
port => 5044
}
syslog {
port => 514
}
}
filter {
if [type] == “syslog” {
grok {
match => { “message” => “%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:host} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}” }
}
date {
match => [“timestamp”, “MMM d HH:mm:ss”, “MMM dd HH:mm:ss”]
}
}
mutate {
remove_field => [“timestamp”]
}
}
output {
elasticsearch {
hosts => [“http://es-node1:9200”, “http://es-node2:9200”, “http://es-node3:9200”]
index => “logs-%{+YYYY.MM.dd}”
}
}
# 检查Logstash状态
$ systemctl status logstash
● logstash.service – logstash
Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-04-03 10:00:00 CST; 1h ago
Docs: https://www.elastic.co/products/logstash
Main PID: 1234 (java)
Tasks: 20
Memory: 500.0M
CGroup: /system.slice/logstash.service
└─1234 /usr/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/var/lib/logstash/tmp -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/logstash -XX:+ExitOnOutOfMemoryError -Xlog:gc*,gc+age=trace,safepoint:file=/var/log/logstash/gc.log:utctime,pid,tags:filecount=5,filesize=20M -Dls.cgroup.cpuacct.path.override=/ -Dls.cgroup.cpu.path.override=/ -cp /usr/share/logstash/logstash-core/lib/jars/*:/usr/share/logstash/logstash-core/lib/specs/* org.logstash.Logstash
# 测试Logstash配置
$ /usr/share/logstash/bin/logstash -t
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2026-04-03T10:00:00,000][INFO ][logstash.config.source.local.configpathloader] No config files found in path {:path=>”/etc/logstash/conf.d/*.conf”}
[2026-04-03T10:00:00,000][ERROR][logstash.config.sourceloader] No configuration found in the configured sources.
[2026-04-03T10:00:00,000][INFO ][logstash.runner ] Using config.test_and_exit mode.
6. Kibana设计
Kibana负责数据可视化和用户交互,是ELK Stack的用户界面。
$ cat /etc/kibana/kibana.yml
server.port: 5601
server.host: “0.0.0.0”
elasticsearch.hosts: [“http://es-node1:9200”, “http://es-node2:9200”, “http://es-node3:9200”]
kibana.index: “.kibana”
# 检查Kibana状态
$ systemctl status kibana
● kibana.service – Kibana
Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-04-03 10:00:00 CST; 1h ago
Docs: https://www.elastic.co/products/kibana
Main PID: 1234 (node)
Tasks: 10
Memory: 200.0M
CGroup: /system.slice/kibana.service
└─1234 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli
# 测试Kibana连接
$ curl -X GET “http://fgedudb:5601/api/status”
{
“name” : “kibana”,
“uuid” : “kibana-uuid”,
“version” : {
“number” : “7.17.0”,
“build_hash” : “747e1cc71def077253878a59143c1f785afa92b9”,
“build_number” : 30000,
“build_snapshot” : false
},
“status” : {
“overall” : {
“state” : “green”,
“title” : “Green”,
“nickname” : “Everything is Working”,
“icon” : “success”,
“message” : “All services are available”,
“statuses” : [ ]
},
“statuses” : [ ]
}
}
7. Filebeat设计
Filebeat是轻量级的日志收集器,负责在服务器上收集日志文件并传输到Logstash或Elasticsearch。
$ cat /etc/filebeat/filebeat.yml
filebeat.inputs:
– type: log
enabled: true
paths:
– /var/log/*.log
– /var/log/syslog
fields:
service: system
output.logstash:
hosts: [“logstash:5044”]
# 检查Filebeat状态
$ systemctl status filebeat
● filebeat.service – Filebeat sends log files to Logstash or directly to Elasticsearch.
Loaded: loaded (/etc/systemd/system/filebeat.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-04-03 10:00:00 CST; 1h ago
Docs: https://www.elastic.co/products/beats/filebeat
Main PID: 1234 (filebeat)
Tasks: 8
Memory: 50.0M
CGroup: /system.slice/filebeat.service
└─1234 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
# 测试Filebeat配置
$ filebeat test config
Config OK
# 测试Filebeat输出
$ filebeat test output
logstash: logstash:5044…
connection…
parse host… OK
dns lookup… OK
addresses: 192.168.1.103:5044
dial up… OK
TLS… WARN secure connection disabled
talk to server… OK
8. 架构实现
架构实现是将设计转化为实际ELK系统的过程,包括安装、配置、测试等环节。author:www.itpux.com
$ docker-compose up -d
# docker-compose.yml示例
$ cat docker-compose.yml
version: ‘3’
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
environment:
– cluster.name=elasticsearch
– node.name=es-node1
– discovery.type=single-node
– ES_JAVA_OPTS=-Xms1g -Xmx1g
ports:
– “9200:9200”
volumes:
– es-data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:7.17.0
volumes:
– ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
– “5044:5044”
– “514:514”
depends_on:
– elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:7.17.0
environment:
– ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
– “5601:5601”
depends_on:
– elasticsearch
filebeat:
image: docker.elastic.co/beats/filebeat:7.17.0
volumes:
– ./filebeat.yml:/usr/share/filebeat/filebeat.yml
– /var/log:/var/log:ro
depends_on:
– logstash
volumes:
es-data:
# 检查ELK服务状态
$ docker-compose ps
Name Command State Ports
—————————————————————————————-
elk_elasticsearch_1 /bin/tini — /usr/local/bi … Up 0.0.0.0:9200->9200/tcp, 9300/tcp
elk_logstash_1 /usr/local/bin/docker-entr … Up 0.0.0.0:5044->5044/tcp, 0.0.0.0:514->514/tcp
elk_kibana_1 /bin/tini — /usr/local/bi … Up 0.0.0.0:5601->5601/tcp
elk_filebeat_1 /usr/local/bin/docker-entr … Up
# 测试ELK Stack
$ curl -X POST “http://fgedudb:9200/logs-2026.04.03/_doc” -H “Content-Type: application/json” -d ‘
{
“@timestamp”: “2026-04-03T10:00:00Z”,
“message”: “Test log message”,
“host”: “test-host”,
“service”: “test-service”,
“level”: “info”
}
‘
9. 最佳实践
ELK架构设计的最佳实践包括规划、实施、监控等多个方面,以下是一些关键建议。
- 采用分层架构设计,提高系统的可维护性和可扩展性
- 实施数据生命周期管理,定期清理旧数据
- 建立完善的监控体系,及时发现和解决问题
- 定期进行性能优化,提高系统的处理能力
- 制定详细的操作手册,确保系统的正确维护
- 持续优化索引设计,提高查询性能
- 对ELK运维人员进行培训,提高技能水平
$ ab -n 1000 -c 100 http://fgedudb:9200/logs-2026.04.03/_search
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking fgedudb (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: nginx/1.18.0
Server Hostname: fgedudb
Server Port: 9200
Document Path: /logs-2026.04.03/_search
Document Length: 1000 bytes
Concurrency Level: 100
Time taken for tests: 0.500 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1200000 bytes
HTML transferred: 1000000 bytes
Requests per second: 2000.00 [#/sec] (mean)
Time per request: 50.000 [ms] (mean)
Time per request: 0.500 [ms] (mean, across all concurrent requests)
Transfer rate: 2343.75 [Kbytes/sec] received
# ELK可靠性测试
$ curl -X GET “http://fgedudb:9200/_cluster/health?wait_for_status=green&timeout=50s”
{
“cluster_name” : “elasticsearch”,
“status” : “green”,
“timed_out” : false,
“number_of_nodes” : 3,
“number_of_data_nodes” : 3,
“active_primary_shards” : 10,
“active_shards” : 20,
“relocating_shards” : 0,
“initializing_shards” : 0,
“unassigned_shards” : 0,
“delayed_unassigned_shards” : 0,
“number_of_pending_tasks” : 0,
“number_of_in_flight_fetch” : 0,
“task_max_waiting_in_queue_millis” : 0,
“active_shards_percent_as_number” : 100.0
}
通过以上步骤,我们成功设计并实现了一个完整的ELK日志分析架构,包括Elasticsearch、Logstash、Kibana和Filebeat等组件的配置和部署。在实际操作中,应根据具体的业务需求和技术环境进行调整,确保架构的合理性和有效性。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
