尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Day 18-ELK 日志栈全链路生产级实操:Logstash 过滤 + Filebeat 采集 + Kibana 可视化 + 备份容灾 + 安全认证 + 集群监控

Day 18-ELK 日志栈全链路生产级实操:Logstash 过滤 + Filebeat 采集 + Kibana 可视化 + 备份容灾 + 安全认证 + 集群监控 目录ELK日志栈全链路进阶实操Logstash过滤Filebeat采集Kibana可视化备份恢复安全认证集群监控一、实验环境主机清单二、Logstash常用输入与过滤插件实战2.1 file输入插件采集本地系统日志2.2 sincedb断点续传机制踩坑2.3 syslog输入插件多节点日志集中采集2.4 multiline多行过滤合并Java异常堆栈2.5 grok过滤插件结构化解析Apache访问日志三、Filebeat轻量化日志采集实战3.1 环境准备与Filebeat安装3.2 Apache模块激活与配置3.3 直接输出到Elasticsearch验证3.4 输出到Logstash做二次清洗四、Kibana数据可视化实战4.1 Kibana安装与基础配置4.2 创建索引模式4.3 可视化图表制作4.4 仪表板组装与保存五、Elasticsearch数据备份与恢复5.1 NFS共享快照仓库搭建5.2 ES集群配置快照路径5.3 滚动重启与分片分配控制5.4 创建快照仓库5.5 全量备份与指定索引备份5.6 快照恢复实战验证六、ES集群安全认证与Xpack配置6.1 生成CA证书与节点证书6.2 集群节点安全配置6.3 设置内置用户密码6.4 上下游组件适配认证七、Metricbeat集群监控实战7.1 启用elasticsearch-xpack模块7.2 输出配置与服务启动7.3 多节点监控部署7.4 监控面板效果验证核心踩坑点汇总与实操总结核心踩坑点汇总实操心得ELK日志栈全链路进阶实操Logstash过滤Filebeat采集Kibana可视化备份恢复安全认证集群监控一、实验环境主机清单本次实操覆盖日志采集、结构化解析、可视化存储、备份容灾、安全认证、集群监控完整链路各节点IP与核心角色如下主机名IP地址核心角色server1192.168.48.136Elasticsearch Master节点、证书生成节点、Metricbeat监控节点server2192.168.48.137Elasticsearch数据节点、Metricbeat监控节点server4192.168.48.138Elasticsearch数据节点、Metricbeat监控节点server5192.168.48.139NFS服务端、Kibana、Cerebro、elasticsearch-head、Filebeat、Apache服务server6192.168.48.140Logstash服务端、Apache服务、单节点ES生成多行异常日志二、Logstash常用输入与过滤插件实战上次只做了最简单的标准输入输出这次深入常用的输入和过滤插件搞定不同场景的日志采集与结构化处理。2.1 file输入插件采集本地系统日志最基础的日志采集场景就是读取本地文件先从系统日志/var/log/messages入手。配置file插件指定日志路径设置从文件开头开始读取同时输出到控制台和Elasticsearch。input{file{path/var/log/messagesstart_positionbeginning}}output{stdout{}elasticsearch{hosts192.168.48.136:9200indexlogstash-%{YYYY.MM.dd}}}启动Logstash后系统日志会被逐行读取每条日志自动附加timestamp、host、path元数据字段原始内容保留在message字段中。2.2 sincedb断点续传机制踩坑第一次跑完我重启Logstash想重新测试结果发现日志一条都不读了以为配置写错了原因是sincedb断点续传机制。Logstash会在数据目录下生成.sincedb_xxx文件记录每个文件的inode、读取偏移量和路径重启后会从上次结束的位置继续读不会重复采集。如果需要重新从头采集删除对应的sincedb文件即可。cd/usr/share/logstash/data/plugins/inputs/filels-a# 删除sincedb文件强制重新采集rm-f.sincedb_452905a167cf4509fd08acb964fdb20c# 写入测试日志验证实时采集logger helloworld写入测试日志后去elasticsearch-head中查看对应索引新日志已经实时同步写入验证采集正常。2.3 syslog输入插件多节点日志集中采集单节点本地采集只能用在单机场景生产环境都是多台服务器统一上报日志。Logstash的syslog插件可以直接接收rsyslog转发的日志还能自动完成结构化解析。先编写Logstash配置启用syslog输入监听默认514端口输出到独立的syslog索引input{syslog{}}output{stdout{}elasticsearch{hosts192.168.48.136:9200indexsyslog-%{YYYY.MM.dd}}}/usr/share/logstash/bin/logstash-f/etc/logstash/conf.d/test.conf然后在所有需要上报日志的节点上修改rsyslog配置添加转发规则把本地syslog转发到Logstash服务器# rsyslog.conf末尾添加192.168.48.140:514重启rsyslog服务后Logstash端就能收到各节点的日志。和file插件不同syslog插件会自动拆分出facility、severity、program、logsource等结构化字段无需额外写过滤规则。在ES中查看syslog索引所有节点的日志都已结构化存储可以直接按日志级别、主机名、程序名进行筛选查询。2.4 multiline多行过滤合并Java异常堆栈普通单行日志好处理但像ES、Java应用的异常堆栈日志一个错误横跨多行按行采集会被拆成多条文档完全没法排查问题。这时候就要用multiline多行过滤插件。为了生成真实的多行错误日志在server6上部署了一个单节点ES故意不配置系统资源限制让它启动时抛出内存锁相关的警告正好生成多行WARN日志。# 把ES安装包传到server6scpelasticsearch-7.6.1-x86_64.rpm server6:简单配置集群名称cluster.name:my-application开启内存锁但不配置系统限制人为制造报错bootstrap.memory_lock:true接下来编写Logstash配置用file插件读取ES日志通过multiline codec合并多行匹配不以[开头的行自动合并到上一行。input{file{path/var/log/elasticsearch/my-application.logstart_positionbeginningcodecmultiline{pattern^\[negatetruewhatprevious}}}output{stdout{}elasticsearch{hosts192.168.48.136:9200indexmyeslog-%{YYYY.MM.dd}}}踩坑提醒negate和what参数非常容易写反。negate: true表示不匹配正则的行执行合并what: previous表示合并到上一行。写反会导致日志完全错乱一定要先用少量日志验证。启动后在ES中查看myeslog索引原本分散多行的异常堆栈已经合并为单条文档排查问题时可以完整查看上下文。2.5 grok过滤插件结构化解析Apache访问日志grok是Logstash最常用的过滤插件可以把非结构化的纯文本日志拆分成多个独立字段最典型的场景就是解析Web服务器访问日志。先在server6上部署httpd服务用ab压测工具生成访问日志echohello/var/www/html/index.html# 100次请求并发数1ab-c1-n100http://192.168.48.140/index.html先查看原始访问日志格式确认是标准组合日志格式cat/var/log/httpd/access_logLogstash自带了大量预定义的grok模式不用从零写正则。在patterns目录下的httpd文件中已经预置了通用日志和组合日志格式的匹配规则。直接引用HTTPD_COMBINEDLOG模式编写配置用grok插件匹配message字段input{file{path/var/log/httpd/access_logstart_positionbeginning}}filter{grok{match{message%{HTTPD_COMBINEDLOG}}}}output{stdout{}elasticsearch{hosts192.168.48.136:9200indexapachelog-%{YYYY.MM.dd}}}启动后查看输出效果原本一整行的访问日志被拆分为clientip、verb、request、response、bytes、agent、referrer等独立字段完全结构化后续统计分析非常方便。在ES中查看apachelog索引所有字段都已正确拆分存储。三、Filebeat轻量化日志采集实战Logstash功能强大但资源占用高每台业务机器都部署不现实。Filebeat是Go语言开发的轻量采集器内存占用只有几十兆适合大规模部署在业务节点上。3.1 环境准备与Filebeat安装本次在server5上部署Filebeat采集本地Apache日志。先安装启动httpd做测试echoserver5/var/www/html/index.html systemctl start httpd安装Filebeat RPM包rpm-ivhfilebeat-7.6.1-x86_64.rpm安装完成后配置文件位于/etc/filebeatmodules.d目录下是官方预置的各类采集模块默认均为禁用状态。3.2 Apache模块激活与配置官方预置了Apache模块已经写好了日志路径和解析规则无需手动编写采集配置直接启用即可filebeat modulesenableapache启用后apache.yml.disabled会变为apache.yml。编辑模块配置指定访问日志和错误日志的实际路径module:apacheaccess:enabled:truevar.paths:[/var/log/httpd/access_log*]error:enabled:truevar.paths:[/var/log/httpd/error_log*]3.3 直接输出到Elasticsearch验证先测试最简单的链路Filebeat采集后直接写入Elasticsearch。修改主配置文件filebeat.yml配置ES输出地址vim/etc/filebeat/filebeat.ymloutput.elasticsearch:hosts:[192.168.48.136:9200]好习惯改完输出配置先执行连通性测试确认没问题再启动服务避免启动失败再翻日志排查。filebeattestoutput-c/etc/filebeat/filebeat.yml测试全部显示OK后启动服务并设置开机自启systemctlenable--nowfilebeat启动成功后在ES中可以看到自动生成的filebeat-7.6.1-日期索引日志数据已正常写入。3.4 输出到Logstash做二次清洗生产环境一般不会让Filebeat直接写ES通常是先发送到Logstash做过滤、清洗、脱敏再写入ES。先修改Logstash配置启用beats输入插件监听5044端口接收Filebeat数据保留grok解析逻辑input{beats{port5044}}filter{grok{match{message%{HTTPD_COMBINEDLOG}}}}output{stdout{}elasticsearch{hosts192.168.48.136:9200indexapachelog-%{YYYY.MM.dd}}}然后修改Filebeat配置关闭ES输出启用Logstash输出output.logstash:hosts:[192.168.48.140:5044]两边重启服务后就形成了「Filebeat采集 → Logstash结构化解析 → Elasticsearch存储」的标准生产链路。四、Kibana数据可视化实战日志存入ES只是完成了存储要直观展示数据、做运营监控大盘还需要Kibana做可视化。4.1 Kibana安装与基础配置Kibana部署在server5节点先修改配置文件开启中文界面i18n.locale:zh-CN配置服务监听地址为0.0.0.0允许外部访问server.host:0.0.0.0启动服务后查看5601端口监听正常。浏览器访问进入Kibana欢迎页界面已切换为中文。4.2 创建索引模式要在Kibana中查询和可视化数据首先要创建索引模式匹配ES中的索引。进入「管理 → 索引模式」页面输入apachelog-*作为索引模式系统会自动匹配到对应索引第二步选择timestamp作为时间筛选字段完成创建。后续就可以基于时间范围筛选数据了。4.3 可视化图表制作先做一个指标统计卡片展示网站总访问量。进入Visualize模块新建指标类型可视化数据源选择apachelog-*聚合方式选择计数。调整完成后保存可视化命名为「网站访问总量」。再制作一个柱状图统计不同客户端IP的访问次数。X轴选择词聚合字段为clientip.keyword按访问量降序排列。4.4 仪表板组装与保存单个图表只能展示单一维度把多个图表组合到仪表板中就形成了完整的监控大盘。新建仪表板添加刚才制作的两个可视化组件调整布局和大小。保存仪表板命名为「Apache网站访问监控」后续打开即可直接查看整体访问情况。五、Elasticsearch数据备份与恢复生产环境数据是核心资产定期备份和可恢复能力是底线要求。ES通过快照机制实现数据备份底层依赖共享存储本次使用NFS搭建共享仓库。5.1 NFS共享快照仓库搭建server5作为NFS服务端先创建备份目录并设置权限mkdir-p/data/es-backupchmod777/data/es-backup/编辑/etc/exports配置共享规则/data/es-backup *(rw,sync,no_root_squash)启动NFS服务并设置开机自启systemctlenable--nownfs所有ES节点作为客户端先创建本地挂载目录mkdir-p/data/es-backup测试NFS共享并挂载到本地showmount-eserver5mount192.168.48.139:/data/es-backup /data/es-backup踩坑提醒如果NFS服务端没开no_root_squash或者目录权限不足ES进程会无法写入快照文件创建快照直接报错。一定要提前验证目录读写权限。5.2 ES集群配置快照路径仅挂载目录不够还需要在ES配置文件中显式声明允许的快照仓库路径否则ES会出于安全限制拒绝使用该目录。三个节点的elasticsearch.yml都添加如下配置path.repo:/data/es-backup5.3 滚动重启与分片分配控制修改配置需要重启集群生产环境不能全量停机必须滚动重启。重启前必须先关闭分片自动分配否则节点离线后集群会自动迁移分片产生大量IO严重影响业务。在Kibana开发工具中执行临时关闭分片分配仅保留主分片PUT_cluster/settings{transient:{cluster.routing.allocation.enable:primaries}}逐个重启节点全部重启完成、集群恢复green状态后恢复默认分片分配PUT_cluster/settings{transient:{cluster.routing.allocation.enable:null}}5.4 创建快照仓库集群重启完成后就可以创建快照仓库了支持API和图形化两种方式。通过Kibana开发工具创建文件系统类型的仓库开启压缩PUT/_snapshot/my_backup{type:fs,settings:{location:/data/es-backup,compress:true}}也可以在Cerebro中图形化创建填写仓库名称、路径选择索引即可。创建完成后通过GET命令验证仓库配置GET/_snapshot/my_backup5.5 全量备份与指定索引备份仓库就绪后即可创建快照先做全量备份备份所有索引PUT/_snapshot/my_backup/snapshot_all_20260811也可以只备份指定索引例如仅备份syslog相关索引节省空间PUT/_snapshot/my_backup/snapshot_syslog_20260811{indices:syslog-*,ignore_unavailable:true,include_global_state:false}在Cerebro的快照管理页面可以查看所有已创建的快照列表。通过API可以查看所有快照详情包含每个快照的索引列表、状态、耗时、分片成功数等信息GET/_snapshot/my_backup/_all查看单个快照的详细信息GET/_snapshot/my_backup/snapshot_syslog_20260811查看快照实时执行状态监控进度、文件数、数据量GET/_snapshot/my_backup/snapshot_syslog_20260811/_status5.6 快照恢复实战验证备份的有效性必须通过恢复来验证。先删除ES中的syslog索引再从快照恢复POST/_snapshot/my_backup/snapshot_syslog_20260811/_restore执行完成后在ES中查看syslog索引已完整恢复数据无丢失验证备份可用。六、ES集群安全认证与Xpack配置默认ES没有任何认证只要能访问端口就能读写删除数据生产环境绝对不可用。本次开启Xpack安全认证配置传输层SSL加密。6.1 生成CA证书与节点证书使用ES自带的证书工具生成先在server1节点生成CA根证书cd/usr/share/elasticsearch bin/elasticsearch-certutil ca再用CA证书签发节点通用证书bin/elasticsearch-certutil cert--caelastic-stack-ca.p12将生成的证书复制到ES配置目录并修改属主为elasticsearch用户cpelastic-certificates.p12 /etc/elasticsearchchownelasticsearch:elasticsearch /etc/elasticsearch/elastic-certificates.p126.2 集群节点安全配置修改server1的elasticsearch.yml添加跨域允许头信息兼容elasticsearch-head带认证访问开启Xpack安全和传输层SSLhttp.cors.enabled:truehttp.cors.allow-origin:*http.cors.allow-headers:Authorization,X-Requested-With,Content-Length,Content-Typexpack.security.enabled:truexpack.security.transport.ssl.enabled:truexpack.security.transport.ssl.verification_mode:certificatexpack.security.transport.ssl.keystore.path:/etc/elasticsearch/elastic-certificates.p12xpack.security.transport.ssl.truststore.path:/etc/elasticsearch/elastic-certificates.p12将证书同步到server2和server4节点scpelastic-certificates.p12 server2:/etc/elasticsearch/scpelastic-certificates.p12 server4:/etc/elasticsearch/每个节点都修改证书属主chownelasticsearch /etc/elasticsearch/elastic-certificates.p12并添加相同的Xpack安全配置。完成后都重启。6.3 设置内置用户密码所有节点重启完成、集群恢复green后执行密码设置工具为所有内置用户设置密码bin/elasticsearch-setup-passwords interactive设置完成后再访问elasticsearch-head就会弹出登录框输入elastic用户密码才能访问。登录成功后可正常查看索引数据说明认证生效。6.4 上下游组件适配认证ES开启认证后所有对接ES的组件都必须配置账号密码否则直接失联。首先修改Logstash输出配置添加认证信息vim/etc/logstash/conf.d/beats.confoutput{elasticsearch{hosts192.168.48.136:9200indexapachelog-%{YYYY.MM.dd}userelasticpassword123456}}/usr/share/logstash/bin/logstash-f/etc/logstash/conf.d/beats.conf重启Logstash验证写入正常。然后修改Kibana配置配置ES访问账号elasticsearch.hosts:[http://192.168.48.137:9200]elasticsearch.username:kibanaelasticsearch.password:123456重启Kibana后可正常登录和读取数据。巨坑提醒开启安全前一定要梳理清楚所有对接ES的组件清单。我一开始只改了Logstash忘了Kibana结果Kibana直接起不来翻了半天日志才发现是认证失败。少改一个组件就会导致整条链路断掉。七、Metricbeat集群监控实战集群运行状态不能全靠手动敲命令查看用Metricbeat采集集群指标对接Kibana可以实现可视化监控。为防止冲突这里换一个访问更换192.168.48.137访问需给配置文件添加7.1 启用elasticsearch-xpack模块在server1节点部署Metricbeat启用官方预置的elasticsearch-xpack监控模块metricbeat modulesenableelasticsearch-xpack编辑模块配置填写ES地址和认证账号开启Xpack监控-module:elasticsearchmetricsets:-ccr-cluster_stats-index-node_stats-shardperiod:10shosts:[http://localhost:9200]username:elasticpassword:123456xpack.enabled:true7.2 输出配置与服务启动修改Metricbeat主配置配置ES输出地址和认证信息output.elasticsearch:hosts:[http://192.168.48.136:9200]username:elasticpassword:123456测试连通性后启动服务systemctlenable--nowmetricbeat.service启动后在Kibana监控页面可以看到server1节点已被监测到。7.3 多节点监控部署按照相同方式在server2和server4节点部署Metricbeat并启用模块。部署过程中遇到个小问题最初Kibana连接136节点时监控显示脱机切换到137节点后恢复正常和节点角色与访问链路有关。7.4 监控面板效果验证所有节点部署完成后退出设置模式即可看到完整的集群监控面板。面板展示了集群整体状态、节点数、索引数、JVM堆内存使用率、CPU使用率、系统负载、磁盘可用空间等核心指标每个节点的详细数据一目了然比命令行直观高效很多。核心踩坑点汇总与实操总结核心踩坑点汇总File插件重启不重新采集sincedb文件会记录读取偏移量默认断点续传。需要重新采集时删除对应.sincedb文件即可。多行合并逻辑写反multiline的negate和what参数极易混淆务必先用少量日志验证确认合并方向正确再全量接入。NFS快照仓库写入失败目录权限不足或未开启no_root_squash会导致ES无法写入必须保证ES进程对共享目录有读写权限。集群重启引发分片风暴滚动重启前未关闭分片自动分配会触发大量分片迁移产生高额IO。生产环境必须先调整分配策略再重启。开启安全后组件集体失联ES开启认证后Logstash、Kibana、Filebeat、Cerebro等所有对接组件都要同步配置账号密码遗漏任何一个都会导致链路中断。Grok匹配失败日志格式与预设模式不匹配时会匹配失败需先确认原始日志格式再选择对应模式必要时自定义正则。实操心得这次完整走通了ELK从采集、清洗、存储、可视化、备份、安全到监控的生产级闭环最大的感受是基础搭建半小时就能跑通但要做到生产可用背后有大量细节和坑点。每增加一个能力就要考虑全链路的兼容性开备份要考虑共享存储权限、集群滚动重启开安全要梳理所有上下游组件逐个适配认证。采集端也要分层重的Logstash做集中清洗轻的Filebeat做边缘采集各司其职。日志平台是个体系化工程这次只是把核心功能跑通后续还可以继续深入索引生命周期管理、日志告警、复杂过滤脱敏、多租户权限这些内容逐步向生产级标准靠拢。
返回列表