一、Elasticsearch 到底是啥?
简单说,ES 就是一个能飞速搜索和分析海量数据的搜索引擎。类似百度、谷歌,但它是给你公司内部的数据用的。
比如:
-
淘宝搜商品,输入"手机 拍照好",毫秒级给你结果------背后就是 ES。
-
公司每天产生几 TB 的日志(服务器记的流水账),你想查"昨天下午3点哪台服务器报错了"------ES 能秒回。
传统数据库(如 MySQL) 做这种事很慢,因为它是按行存的,搜关键词得全表扫描,像大海捞针。ES 用了倒排索引,相当于书的目录:你要找"苹果"这个词,直接翻目录看到它在第几页,不用从头翻全书。
二、ES 牛在哪?
-
快:毫秒级响应,就算数据量上亿。
-
能撑大场面:数据量大了?加机器就行,自动分摊,支持 PB 级(1PB = 100万GB)。
-
灵活:存 JSON 文档,不需要像数据库那样先设计表结构。今天存个用户信息,明天加个字段,不用改表。
-
能算能分析:不光能搜,还能做统计,比如"过去一个月每个小时卖了多少单",一句查询搞定。
三、跟传统数据库有啥不一样?
| 传统数据库 | Elasticsearch |
|---|---|
| 固定表结构,改字段麻烦 | 存 JSON,随你加字段 |
| 查个关键词慢得要死 | 倒排索引,飞一般的速度 |
| 强事务、很严谨(ACID) | 最终一致,牺牲一点严谨换速度 |
| 只能精确匹配或简单模糊查询 | 支持拼音纠错、同义词、相关性排序 |
举个例子:在 MySQL 里搜"苹果"可能把"苹果公司"和"吃苹果"混一起,排序也难。ES 能自动算相关性,把最符合你意图的排前面。
四、ES 主要干啥用?
-
电商搜索:筛选、排序、推荐
-
日志分析:公司所有服务器的日志丢进 ES,出问题可以快速定位(配合 Kibana 画图表)
-
监控告警:API 调用慢了多少毫秒?哪台机器 CPU 爆了?
-
安全分析:检测异常登录、暴力破解等
-
业务报表:实时统计销售额、用户活跃度等
五、ES 7.0 有啥改进?
-
简化了数据模型:以前一个索引里可以分多种"类型",容易乱,7.0 废除了,更清爽。
-
集群协调更稳:用 Raft 协议(一种共识算法)代替旧机制,主节点挂了自动选新的,不需要你手动配。
-
性能优化:搜索省内存、压缩更好、并发能力翻倍。
-
安全加强:默认开启加密,权限控制更细。
六、配置 ES 要注意啥(只记关键点)
配置文件:/etc/elasticsearch/elasticsearch.yml
必改项:
-
cluster.name:集群名,同一集群所有节点必须一样。 -
node.name:节点名,方便辨认。 -
network.host:绑定的 IP,生产环境别用0.0.0.0(不安全)。 -
discovery.seed_hosts:告诉新节点"老节点在哪",用于加入集群。 -
cluster.initial_master_nodes:第一次启动时,哪些节点参与选主。
内存配置(jvm.options):
-
堆内存(
-Xms和-Xmx)设成一样,通常为物理内存的一半,但别超过 32GB(否则压缩指针失效)。 -
生产环境必须
bootstrap.memory_lock: true,禁用 swap(换页),否则性能骤降。
节点角色:
-
小规模:一个节点啥角色都干(主节点+数据节点+协调节点)。
-
大规模:角色分离------主节点只管集群管理(不存数据),数据节点只管存数据,协调节点只管转发请求。避免单点瓶颈。
安全:
-
开启
xpack.security.enabled,设密码。 -
节点间通信开 TLS 加密,否则内网抓包能看到你的数据。
七、常用操作命令(最常用的几条)
bash
# 看集群健康不健康(green/yellow/red)
curl localhost:9200/_cluster/health?pretty
# 看有哪些节点
curl localhost:9200/_cat/nodes?v
# 新建一个索引(相当于数据库的表)
curl -XPUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"settings": { "number_of_shards": 3, "number_of_replicas": 1 }
}'
# 插入一条数据
curl -XPOST "localhost:9200/my_index/_doc" -H 'Content-Type: application/json' -d'
{ "name": "张三", "age": 28 }'
# 搜索一下
curl "localhost:9200/my_index/_search?q=name:张三&pretty"
八、生产环境避坑指南
-
千万别用 root 跑 ES,安全漏洞。
-
文件描述符开大点 (
ulimit -n 65536),否则连接多了报错。 -
不要用网络磁盘(NFS),性能烂。
-
分片数别乱设:每个分片 20~40GB 为宜,太多分片管理开销大。
-
监控磁盘:超过 95% 会锁死索引,只能读不能写。
-
定期备份:用快照功能存到 HDFS 或 S3。
九、一句话总结
ES 就是一个能存海量数据、搜得快、还能做实时统计的分布式搜索引擎。 配置好了,它就像个听话的超级助理,你问什么它秒回;配砸了,它能让你加班到天亮。生产环境务必角色分离、开安全、锁内存、监控磁盘。
一、Logstash 是干啥的?
简单说,Logstash 就是一个"数据管道工"。它从各种地方把数据拽过来,洗一洗、改一改,再送到该去的地方。
比如:
-
从服务器日志文件里读数据 → 提取出时间、错误类型、IP地址 → 存到 Elasticsearch 里,方便搜索和画图。
-
从数据库里查订单 → 转成统一格式 → 发给 Kafka 消息队列。
核心三步走:
-
输入(input):数据从哪来?文件、数据库、Kafka、TCP/UDP 端口、Redis......
-
过滤(filter):数据怎么洗?解析、改字段、删脏数据、加标签......
-
输出(output):数据往哪去?Elasticsearch、文件、stdout(控制台)、Kafka......
二、配置文件长啥样?
配置文件分三块,像三个车间:
ruby
input {
# 从哪里拿数据
}
filter {
# 怎么处理数据
}
output {
# 送到哪里去
}
三、常用输入插件(数据从哪来)
| 插件 | 大白话解释 |
|---|---|
file |
盯着一个日志文件,有新行就立刻读进来。比如 /var/log/nginx/access.log |
beats |
接收 Filebeat、Metricbeat 等小工具发来的数据。默认端口 5044 |
tcp / udp |
监听某个端口,别的程序通过 TCP/UDP 发数据过来 |
http |
开一个 HTTP 接口,别人 POST 数据进来 |
jdbc |
定期查数据库(MySQL、PostgreSQL 等),把表里的数据拉进来 |
kafka |
从 Kafka 主题里消费数据 |
stdin |
从键盘手动输入(一般只用来测试) |
四、常用过滤插件(怎么处理数据)
| 插件 | 大白话解释 |
|---|---|
grok |
最强大的文本解析器 。用正则把杂乱日志拆成有意义的字段。比如 192.168.1.1 - - [10/May/2026:13:55:36 +0800] "GET /index.html" 200 → 拆出 clientip、timestamp、verb、request 等字段。 |
date |
把日志里的时间字符串(比如 10/May/2026:13:55:36 +0800)解析成 Logstash 内部的时间戳,方便按时间排序。 |
mutate |
改字段:重命名、删除、类型转换(字符串变整数)、替换内容...... |
json |
如果字段里存的是 JSON 字符串,把它解析成真正的字段。 |
dissect |
和 grok 类似,但更快,适合用分隔符(比如空格、-)切分,不需要正则。 |
drop |
根据条件扔掉某些事件,比如把 debug 级别的日志全丢掉。 |
clone |
复制一份事件,改完后再输出,原事件保留。 |
五、常用输出插件(数据送到哪)
| 插件 | 大白话解释 |
|---|---|
elasticsearch |
最常见的输出 。把处理后的数据存到 ES 里,建索引时还能按日期滚动(比如 nginx-log-%{+YYYY.MM.dd})。 |
stdout |
打印到控制台,一般用来调试,看数据长啥样。配合 codec => rubydebug 能看到漂亮的字段结构。 |
file |
写到本地文件。 |
kafka |
发回 Kafka,让下游继续处理。 |
redis |
推送到 Redis 列表或频道。 |
http |
通过 HTTP POST 发送到别的 API。 |
六、条件判断(让管道灵活起来)
Logstash 支持 if、else if、else,就像编程一样。常用判断:
ruby
if [log_level] == "ERROR" {
# 只处理错误日志
}
if "nginx" in [tags] {
# 如果打上了 nginx 标签,送到 nginx 索引
elasticsearch { index => "nginx-%{+YYYY.MM.dd}" }
} else if "apache" in [tags] {
elasticsearch { index => "apache-%{+YYYY.MM.dd}" }
}
if [response_time] > 1000 {
# 响应时间超过1秒的,加个慢查询标签
mutate { add_tag => ["slow_request"] }
}
可用的比较符:
-
等于
==,不等于!= -
大于
>,小于<,大于等于>=,小于等于<= -
正则匹配
=~,不匹配!~ -
逻辑与
&&,或|| -
包含
in,不包含not in(常用于[tags]字段)
七、一个真实的配置例子(来自文档)
ruby
input {
beats { port => 5044 } # 从 Filebeat 收数据
}
output {
if "nginx1" in [tags] {
elasticsearch {
hosts => ["192.168.166.9:9200"]
index => "nginx1-%{+YYYY.MM.dd}"
}
}
if "nginx2" in [tags] {
elasticsearch {
hosts => ["192.168.166.9:9200"]
index => "nginx2-%{+YYYY.MM.dd}"
}
}
stdout { codec => rubydebug } # 顺便打印到屏幕,方便看
}
解读:
-
输入:监听 5044 端口,等 Filebeat 发数据。
-
判断:如果数据带
nginx1标签,就存到 ES 的nginx1-2026.05.19索引;如果是nginx2就存到对应索引。 -
同时把每条数据打印到控制台(调试用)。
八、小提示
-
grok 很强大,但也会吃性能 。如果日志格式固定,用
dissect更快。 -
生产环境建议把 stdout 关掉,否则控制台刷屏影响性能。
-
条件判断写在 output 里可以分流,写到不同索引或不同系统。
-
调试时先用 stdin 输入一行数据,用 stdout 输出,确认 filter 写对了再上生产。
九、一句话总结
Logstash 就是一根万能的"数据水管":进水管(input)可以接各种源头,中间可以加各种"净水器"(filter)来清洗、转换数据,最后出水管(output)把干净水送到 ES、文件或其他地方。配置文件就是告诉你这根管子怎么接。
一、Filebeat 是啥?
简单说,Filebeat 就是一个"轻量级日志搬运工"。它专门负责从服务器上的日志文件里读出新内容,然后送到 Elasticsearch 或 Logstash 里去。
比如你有 100 台服务器,每台都产生日志。你不可能一台台 SSH 上去看。Filebeat 就装在这些服务器上,它会盯着日志文件,一有新的日志行就立刻收走、转发到中央系统。这样你就能在一个地方(比如 Kibana)统一查看所有日志。
记住两点:
-
轻量级 ------ 占资源少,不会把服务器拖垮
-
专门收日志 ------ 别的不管,就管日志文件
二、Filebeat 怎么工作的?(两兄弟配合)
Filebeat 内部有两个好兄弟:inputs 和 harvesters。
2.1 Harvester(收割机)
-
一个 harvester 负责一个文件,它打开这个文件,一行一行地读,然后把内容发出去。
-
只要 harvester 还在运行,文件句柄就一直开着(文件删了也不释放空间,这点要注意)。
2.2 Input(输入配置)
-
一个 input 管理一堆 harvesters。你告诉 input"去 /var/log/*.log 里找文件",它就会为每个匹配的文件启动一个 harvester。
-
每个 input 是独立运行的(Go 协程)。
举个例子:
yaml
filebeat.inputs:
- type: log
paths:
- /var/log/*.log # 这里所有 .log 文件都会被监控
- /var/log/nginx/*.log
2.3 怎么记住读到哪里了?(registry 注册表)
Filebeat 会把每个文件已经读到哪里(偏移量)记在一个叫 registry 的文件里。这样即使 Filebeat 重启了,它也知道从上次断开的地方继续读,不会重复读,也不会漏读。
-
重启后从 registry 恢复状态,继续从断点读。
-
如果每天产生海量新文件,registry 可能变大。可以用
clean_inactive等配置清理旧文件的状态。
2.4 保证至少发一次(at-least-once)
Filebeat 承诺每条日志至少发送一次,不会丢数据。它是怎么做到的?
-
它把发送状态也记在 registry 里。
-
如果目标(ES 或 Logstash)挂了,Filebeat 会不断重试,直到对方确认收到。
-
代价是可能重复发送 :如果在发送过程中 Filebeat 被强制关闭,有些已发送但没来得及确认的日志,重启后会再发一次。可以设置
shutdown_timeout让它在关闭前多等一会儿,减少重复。
三、模块(Modules):懒人福音
如果你不想自己写复杂的解析规则,Filebeat 提供了现成的模块,覆盖常见日志格式:
- Nginx、Apache、MySQL、Kafka、Elasticsearch、Redis、System(系统日志)......
一个模块通常包含:
-
默认日志路径(自动适配不同操作系统)
-
Ingest Node 解析管道(自动提取字段)
-
字段类型定义
-
Kibana 仪表盘(直接看图)
使用模块只需要几步:
bash
# 1. 启用模块
filebeat modules enable nginx mysql
# 2. 设置初始环境(加载仪表盘、模板等)
filebeat setup -e
# 3. 运行
filebeat -e
然后去 Kibana 就能看到漂亮的图表。
如果你要改日志路径,可以在 modules.d/nginx.yml 里配:
yaml
- module: nginx
access:
var.paths: ["/var/log/nginx/access.log*"]
四、核心配置(filebeat.yml)
4.1 Inputs 配置(手动,不用模块时)
yaml
filebeat.inputs:
- type: log # 类型是日志文件
enabled: true
paths:
- /var/log/*.log
fields: # 自己加点字段,方便区分
service: web
fields_under_root: true # 让自定义字段变成顶级字段
exclude_lines: ['^DBG'] # 丢掉以 DBG 开头的行
include_lines: ['^ERR', '^WARN'] # 只保留 ERR 或 WARN 开头的行
ignore_older: 24h # 超过 24 小时没改动的文件,忽略
scan_frequency: 10s # 每 10 秒扫一次目录,看有没有新文件
close_inactive: 5m # 文件 5 分钟没新行,就关闭文件句柄
4.2 多行日志处理(像 Java 堆栈)
很多日志一行写不完,比如异常堆栈:
text
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
要把它们合并成一个事件,用 multiline 配置:
yaml
multiline.pattern: '^[[:space:]]' # 匹配以空格开头的行
multiline.negate: false # 不取反
multiline.match: after # 匹配到的行合并到前一行后面
效果:以空格开头的行(堆栈行)会被接到上一行后面,变成一条完整日志。
常用模式还有:
-
时间戳开头 :
pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}',negate: true,match: after -
行尾反斜杠续行 :
pattern: '\\$',match: before
4.3 输出配置
输出到 Elasticsearch(最常见):
yaml
output.elasticsearch:
hosts: ["localhost:9200"]
index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
username: "elastic"
password: "changeme"
输出到 Logstash(如果你想在 Logstash 里做更复杂的处理):
yaml
output.logstash:
hosts: ["localhost:5044"]
loadbalance: true # 如果多个 Logstash,可以负载均衡
4.4 加载外部配置
如果配置太长了,可以拆成小文件:
yaml
filebeat.config.inputs:
enabled: true
path: configs/*.yml # 这个目录下的每个 yml 文件都算一个 input
五、常见问题(FAQ)
5.1 "Too many open files" 错误
Filebeat 默认会一直打开正在读的文件句柄。如果同时监控成千上万个文件,可能超过系统限制。解决办法:
-
调小
close_inactive,让不活跃的文件尽快关闭。 -
增大系统的
ulimit -n。
5.2 Filebeat 不收集某个文件
检查:
-
路径对不对?
-
文件修改时间是否超过了
ignore_older? -
目标输出(ES/Logstash)是否可访问?用
filebeat -e -d "*"调试模式看日志。
5.3 CPU 占用高
可能是 scan_frequency 太短(比如 1 秒扫一次目录)。默认 10 秒就够了,不需要太频繁。文件实时性靠 close_inactive 和 harvester 持续读来保证,不是靠频繁扫描。
六、附录:常用变量(动态索引名)
在配置索引名时可以用变量,例如:
-
%{[agent.version]}→ Filebeat 版本号 -
%{+yyyy.MM.dd}→ 当前日期(2026.05.19) -
%{[host.name]}→ 主机名 -
%{[fields.service]}→ 自定义字段
比如:index: "logs-%{[fields.service]}-%{+yyyy.MM.dd}" 会生成 logs-web-2026.05.19 这样的索引。
七、一句话总结
Filebeat 就是一个装在服务器上的小机器人,你告诉它"盯着哪些日志文件",它就会实时地把新内容捡起来,送到 Elasticsearch 或 Logstash 里。它占用资源少、能记住读到哪里、支持多行合并、还有现成的模块帮你解析常见日志格式。配置好之后,你就不用再 SSH 到每台机器上看日志了。