ELK Stack 部署与架构一、架构总览┌──────────────────────────────────────────────────────────────┐ │ 数据采集层 │ │ Node1(nginx) ─── Filebeat 6.7.2 ─── 采集 /var/log/nginx/* │ │ Apache ──────── Logstash 6.7.2 ──── 采集 httpd 日志 │ └────────────────────────┬─────────────────────────────────────┘ │ (5044 / beats 协议) ▼ ┌──────────────────────────────────────────────────────────────┐ │ 数据处理层 │ │ Apache ──────── Logstash ─── parse / filter / route │ │ (host: 192.168.110.130:5044) │ └────────────────────────┬─────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ 数据存储层 │ │ Node1 (192.168.110.130:9200) ─── ES 6.7.2 ─── my-elk-cluster│ │ Node2 (192.168.110.129:9200) ─── ES 6.7.2 │ │ Index: nginx_access-2024.05.23 │ └────────────────────────┬─────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ 可视化层 │ │ Node1 (192.168.110.130:5601) ─── Kibana 6.7.2 │ │ Index Pattern, Discover, Dashboard │ └──────────────────────────────────────────────────────────────┘节点角色与 IP 规划节点IP部署组件角色Node1192.168.110.130ES Kibana Filebeat(Nginx)ES 数据节点, 可视化Node2192.168.110.129ESES 数据节点Apache—Apache Logstash日志源, 数据处理Filebeat节点192.168.110.130Filebeat → Logstash轻量采集 转发二、各组件核心配置2.1 Elasticsearch双节点集群关键配置文件/etc/elasticsearch/elasticsearch.yml# 集群与节点 cluster.name: my-elk-cluster node.name: node1 # node2 为 node2 # 数据与日志路径 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch # 网络 network.host: 0.0.0.0 http.port: 9200 # 内存锁防止 swap bootstrap.memory_lock: true # 集群发现6.x 用 unicast discovery.zen.ping.unicast.hosts: [node1, node2] # 跨域elasticsearch-head 需要 http.cors.enabled: true http.cors.allow-origin: *启动与状态检查操作命令/URL启动systemctl start elasticsearch开机自启systemctl enable elasticsearch查看节点http://IP:9200集群健康http://IP:9200/_cluster/health?pretty集群状态http://IP:9200/_cluster/state?pretty集群健康三色含义颜色含义green所有主分片和副本都正常分配yellow主分片正常部分副本未分配red有主分片未分配数据不完整2.2 elasticsearch-head可视化管理依赖Node.jsv8.2.1 PhantomJS端口9100启动npm run start 在/opt/elasticsearch-head/下访问http://IP:9100/2.3 Logstash数据采集 处理角色接收 Filebeat 推送 直接读 Apache/Nginx 日志写入 ES。配置文件结构三部分input → 定义数据源文件、beats、stdin 等 filter → 数据处理grok、date、mutate 等 output → 定义输出目标ES、stdout 等核心配置示例接收 Filebeat 写入 ES# /etc/logstash/conf.d/filebeat.conf input { beats { port 5044 # 监听 Filebeat 推送 } } output { elasticsearch { hosts [192.168.110.130:9200, 192.168.110.129:9200] index %{[fields][service_name]}-%{yyyy.MM.dd} } }按日志类型分流示例Apacheinput { file { path /etc/httpd/logs/access_log type access start_position beginning } file { path /etc/httpd/logs/error_log type error start_position beginning } } output { if [type] access { elasticsearch { hosts [192.168.110.130:9200] index apache_access-%{yyyy.MM.dd} } } if [type] error { elasticsearch { hosts [192.168.110.130:9200] index apache_error-%{yyyy.MM.dd} } } }关键参数速查参数含义path日志文件路径支持通配符/var/log/*.logtypeEvent 类型字段output 中可据此分流start_positionbeginning从头读end从尾部读hostsES 集群地址数组格式index写入的索引名支持%{yyyy.MM.dd}日期变量常用生命周期命令# 命令行测试stdin → stdout logstash -e input { stdin{} } output { stdout{ codecrubydebug } } # 指定配置文件运行 logstash -f /etc/logstash/conf.d/filebeat.conf # 后台运行 nohup logstash -f filebeat.conf --log.level error /dev/null 21 # 清理锁文件进程异常退出后 rm -f /var/lib/logstash/.lock2.4 Filebeat轻量日志收集配置文件/usr/local/filebeat/filebeat.ymlfilebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log - /var/log/*.log tags: [filebeat] fields: service_name: nginx log_type: access from: 192.168.110.130 output.logstash: hosts: [192.168.110.130:5044]后台启动nohup ./filebeat -e -c filebeat.yml filebeat.out 21 关键配置项配置说明paths日志路径支持通配符fields自定义字段会随日志发送output 中%{[fields][xxx]}引用tags标签用于筛选output.logstash发送到 Logstash注释掉 output.elasticsearch2.5 Kibana可视化平台配置文件/etc/kibana/kibana.ymlserver.port: 5601 server.host: 0.0.0.0 elasticsearch.hosts: [http://192.168.110.130:9200, http://192.168.110.129:9200] kibana.index: .kibana启动systemctl start kibana首次使用流程访问http://192.168.110.130:5601Management → Index Pattern → Create index pattern输入nginx_access-*或apache_access-*选择timestamp作为时间字段进入 Discover 查看日志三、数据流向总图┌──────────┐ 采集 ┌──────────┐ 处理路由 ┌──────────────┐ 展示 ┌─────────┐ │ Filebeat │ ──5044──→ │ Logstash │ ──9200──→ │ Elasticsearch │ ──5601──→ │ Kibana │ │ (Nginx) │ (beats) │ (Apache) │ (ES写入) │ (双节点集群) │ │ │ └──────────┘ └──────────┘ └──────────────┘ └─────────┘ │ │ │ 也可直接读本地日志 │ Index 命名规则 │ /var/log/xxx │ 服务名-YYYY.MM.DD ▼ ▼ Apache access_log nginx_access-2024.05.23 Apache error_log nginx_error-2024.05.23四、ES 索引管理CRUD# 创建索引 curl -XPUT localhost:9200/index-demo # 查看索引设置 curl -XGET localhost:9200/index-demo/_settings # 修改副本数 curl -XPUT localhost:9200/index-demo/_settings \ -H Content-Type: application/json \ -d {number_of_replicas: 2} # 创建别名 curl -XPOST localhost:9200/_aliases \ -H Content-Type: application/json \ -d {actions:[{add:{index:index-demo,alias:user_info_alicas}}]} # 删除别名 curl -XPOST localhost:9200/_aliases \ -H Content-Type: application/json \ -d {actions:[{remove:{index:index-demo,alias:user_info_alicas}}]} # 删除单个索引 curl -XDELETE localhost:9200/index-demo # 删除多个索引 curl -XDELETE localhost:9200/index-demo,index-demo2五、常见故障场景速查故障现象排查方向ES 集群无法发现status: red, 各节点孤立检查discovery.zen.ping.unicast.hosts主机名是否可解析etchosts 或 DNS集群 yellow副本未分配查看是否有足够节点承载副本单节点集群必然 yellowLogstash BOM 报错启动失败配置文件编码确保是 UTF-8 without BOMLogstash 锁文件无法启动rm -f /var/lib/logstash/.locknpm install 卡住安装超时切换国内镜像npm config set registry https://registry.npmmirror.com内存不足ES 启动失败配置bootstrap.memory_lock: true 调整 JVM 堆内存Filebeat 不采集数据为空检查start_position: beginning或日志文件 read 权限