前置说明适用范围:RockyLinux8.x/9.x+ELKStack8.13.x(官方LTS版本),支持采集系统日志、容器日志、应用日志,单集群日处理日志量≥10TB,数据可靠性≥99.999%包含两种部署模式:①单机快速部署(测试/开发环境);②生产级高可用集群部署(生产环境)一、架构与节点说明1.1生产级高可用架构┌─────────────────────────────────────────────────┐│采集端Filebeat(部署在所有业务服务器/K8s节点)││轻量采集日志,过滤后发送到Logstash/ES│└───────────────────────────┬─────────────────────┘↓┌───────────────────────┬───────────────────────┐│Logstash节点1│Logstash节点2│负载均衡,日志清洗、结构化、格式化│192.168.1.60│192.168.1.61│└───────────────────────┴───────────────────────┘↓┌───────────────────┬───────────────────┬───────────────────┐│ES节点1(主节点+数据节点)│ES节点2(主节点+数据节点)│ES节点3(主节点+数据节点)│3节点高可用集群,数据3副本│192.168.1.70│192.168.1.71│192.168.1.72│单节点故障无服务中断└───────────────────┴───────────────────┴───────────────────┘↓┌───────────────────────┐│Kibana可视化节点│日志查询、仪表盘、告警配置│192.168.1.80│└───────────────────────┘1.2生产级节点配置要求角色数量CPU内存磁盘要求Elasticsearch38核16GB每节点挂载≥2TBSSD数据盘,I/O≥1000IOPSLogstash24核8GB系统盘≥100GBKibana14核8GB系统盘≥100GBFilebeat所有业务节点1核512MB无额外磁盘要求1.3单机快速部署配置(测试环境)单节点即可,配置要求:4核CPU/8GB内存/≥200GB磁盘,所有组件部署在同一台服务器上。二、所有节点通用初始化操作(所有服务器执行)#1.关闭防火墙和SELinuxsystemctlstopfirewalldsystemctldisablefirewalldsetenforce0sed-i's/^SELINUX=enforcing$/SELINUX=permissive/'/etc/selinux/config#2.配置系统参数,适配Elasticsearch运行cat/etc/sysctl.conf/etc/security/limits.conf/etc/yum.repos.d/elasticsearch.repo⚠️核心注意事项:Elasticsearch的数据盘必须单独挂载,格式化为XFS,挂载到/data/es目录,禁止使用系统盘存储ES数据,否则会严重影响查询和写入性能。三、部署Elasticsearch3节点高可用集群(3个ES节点都执行)3.1安装ES服务dnfinstall-yelasticsearch#启动服务并设置开机自启systemctldaemon-reloadsystemctlenable--nowelasticsearch#生产环境建议保留内置认证,执行以下命令重置admin密码:#/usr/share/elasticsearch/bin/elasticsearch-reset-password-uelastic-i3.2修改集群配置编辑/etc/elasticsearch/elasticsearch.yml,三个节点仅node.name和network.host配置不同,其余完全一致:#集群名称,所有节点必须一致cluster.name:es-production-cluster#节点名称,每个节点唯一,分别改为node-1、node-2、node-3node.name:node-1#绑定的IP地址,改为当前节点的实际IPnetwork.host:192.168.1.70#服务端口,默认9200http.port:9200#集群发现节点,填写所有3个节点的IPdiscovery.seed_hosts:["192.168.1.70","192.168.1.71","192.168.1.72"]#初始化主节点候选cluster.initial_master_nodes:["node-1","node-2","node-3"]#数据存储路径,改为挂载的数据盘路径path.data:/data/es#日志存储路径path.logs:/var/log/elasticsearch#开启跨域访问,供Kibana和其他工具调用http.cors.enabled:truehttp.cors.allow-origin:"*"#测试环境关闭SSL验证,生产环境建议开启xpack.security.enabled:falsexpack.security.enrollment.enabled:falsexpack.security.http.ssl.enabled:falsexpack.security.transport.ssl.enabled:false修改完成后重启ES生效:systemctlrestartelasticsearch3.3验证集群状态#任意节点执行,查看集群状态,status为green即为正常curlhttp://192.168.1.70:9200/_cluster/health?pretty#正常输出示例:#{#"cluster_name":"es-production-cluster",#"status":"green",#"timed_out":false,#"number_of_nodes":3,#"number_of_data_nodes":3#}四、部署Logstash双节点集群(2个Logstash节点都执行)4.1安装Logstashdnfinstall-ylogstashsystemctlenable--nowlogstash4.2配置日志清洗规则创建配置文件/etc/logstash/conf.d/log-collect.conf,示例为采集Nginx日志并结构化:input{beats{port=5044#监听5044端口接收Filebeat发送的日志}}filter{#结构化Nginx日志if[fields][log_type]=="nginx"{grok{match={"message"='%{IPORHOST:client_ip}-%{DATA:remote_user}\[%{HTTPDATE:time}\]"%{WORD:method}%{DATA:request}HTTP/%{NUMBER:http_version}"%{NUMBER:status}%{NUMBER:body_bytes_sent}"%{DATA:http_referer}""%{DATA:user_agent}"'}remove_field="message"}date{match=["time","dd/MMM/yyyy:HH:mm:ssZ"]target="@timestamp"}}}output{
Rocky Linux 生产级ELK日志系统完整部署方案
前置说明适用范围:RockyLinux8.x/9.x+ELKStack8.13.x(官方LTS版本),支持采集系统日志、容器日志、应用日志,单集群日处理日志量≥10TB,数据可靠性≥99.999%包含两种部署模式:①单机快速部署(测试/开发环境);②生产级高可用集群部署(生产环境)一、架构与节点说明1.1生产级高可用架构┌─────────────────────────────────────────────────┐│采集端Filebeat(部署在所有业务服务器/K8s节点)││轻量采集日志,过滤后发送到Logstash/ES│└───────────────────────────┬─────────────────────┘↓┌───────────────────────┬───────────────────────┐│Logstash节点1│Logstash节点2│负载均衡,日志清洗、结构化、格式化│192.168.1.60│192.168.1.61│└───────────────────────┴───────────────────────┘↓┌───────────────────┬───────────────────┬───────────────────┐│ES节点1(主节点+数据节点)│ES节点2(主节点+数据节点)│ES节点3(主节点+数据节点)│3节点高可用集群,数据3副本│192.168.1.70│192.168.1.71│192.168.1.72│单节点故障无服务中断└───────────────────┴───────────────────┴───────────────────┘↓┌───────────────────────┐│Kibana可视化节点│日志查询、仪表盘、告警配置│192.168.1.80│└───────────────────────┘1.2生产级节点配置要求角色数量CPU内存磁盘要求Elasticsearch38核16GB每节点挂载≥2TBSSD数据盘,I/O≥1000IOPSLogstash24核8GB系统盘≥100GBKibana14核8GB系统盘≥100GBFilebeat所有业务节点1核512MB无额外磁盘要求1.3单机快速部署配置(测试环境)单节点即可,配置要求:4核CPU/8GB内存/≥200GB磁盘,所有组件部署在同一台服务器上。二、所有节点通用初始化操作(所有服务器执行)#1.关闭防火墙和SELinuxsystemctlstopfirewalldsystemctldisablefirewalldsetenforce0sed-i's/^SELINUX=enforcing$/SELINUX=permissive/'/etc/selinux/config#2.配置系统参数,适配Elasticsearch运行cat/etc/sysctl.conf/etc/security/limits.conf/etc/yum.repos.d/elasticsearch.repo⚠️核心注意事项:Elasticsearch的数据盘必须单独挂载,格式化为XFS,挂载到/data/es目录,禁止使用系统盘存储ES数据,否则会严重影响查询和写入性能。三、部署Elasticsearch3节点高可用集群(3个ES节点都执行)3.1安装ES服务dnfinstall-yelasticsearch#启动服务并设置开机自启systemctldaemon-reloadsystemctlenable--nowelasticsearch#生产环境建议保留内置认证,执行以下命令重置admin密码:#/usr/share/elasticsearch/bin/elasticsearch-reset-password-uelastic-i3.2修改集群配置编辑/etc/elasticsearch/elasticsearch.yml,三个节点仅node.name和network.host配置不同,其余完全一致:#集群名称,所有节点必须一致cluster.name:es-production-cluster#节点名称,每个节点唯一,分别改为node-1、node-2、node-3node.name:node-1#绑定的IP地址,改为当前节点的实际IPnetwork.host:192.168.1.70#服务端口,默认9200http.port:9200#集群发现节点,填写所有3个节点的IPdiscovery.seed_hosts:["192.168.1.70","192.168.1.71","192.168.1.72"]#初始化主节点候选cluster.initial_master_nodes:["node-1","node-2","node-3"]#数据存储路径,改为挂载的数据盘路径path.data:/data/es#日志存储路径path.logs:/var/log/elasticsearch#开启跨域访问,供Kibana和其他工具调用http.cors.enabled:truehttp.cors.allow-origin:"*"#测试环境关闭SSL验证,生产环境建议开启xpack.security.enabled:falsexpack.security.enrollment.enabled:falsexpack.security.http.ssl.enabled:falsexpack.security.transport.ssl.enabled:false修改完成后重启ES生效:systemctlrestartelasticsearch3.3验证集群状态#任意节点执行,查看集群状态,status为green即为正常curlhttp://192.168.1.70:9200/_cluster/health?pretty#正常输出示例:#{#"cluster_name":"es-production-cluster",#"status":"green",#"timed_out":false,#"number_of_nodes":3,#"number_of_data_nodes":3#}四、部署Logstash双节点集群(2个Logstash节点都执行)4.1安装Logstashdnfinstall-ylogstashsystemctlenable--nowlogstash4.2配置日志清洗规则创建配置文件/etc/logstash/conf.d/log-collect.conf,示例为采集Nginx日志并结构化:input{beats{port=5044#监听5044端口接收Filebeat发送的日志}}filter{#结构化Nginx日志if[fields][log_type]=="nginx"{grok{match={"message"='%{IPORHOST:client_ip}-%{DATA:remote_user}\[%{HTTPDATE:time}\]"%{WORD:method}%{DATA:request}HTTP/%{NUMBER:http_version}"%{NUMBER:status}%{NUMBER:body_bytes_sent}"%{DATA:http_referer}""%{DATA:user_agent}"'}remove_field="message"}date{match=["time","dd/MMM/yyyy:HH:mm:ssZ"]target="@timestamp"}}}output{