一、ELK Stack 概述
1.1 核心組件
ELK Stack(現更名為 Elastic Stack)是一套開源的日志收集、存儲、分析和可視化平臺,由三個核心組件構成:
- Elasticsearch:分布式搜索引擎,負責日志數據的存儲、索引和快速查詢
- Logstash:日志數據收集和處理管道,支持多種數據源和數據轉換
- Kibana:日志數據可視化平臺,提供豐富的圖表和儀表盤
隨著發展,ELK Stack 逐漸擴展為包含 Beats 的 Elastic Stack,形成更完整的日志管理生態:
1.2 核心特性
- 分布式架構:可水平擴展以處理海量日志數據
- 實時處理:支持日志數據的實時收集、存儲和分析
- 全文檢索:強大的搜索功能,支持復雜查詢和過濾
- 靈活的可視化:通過 Kibana 創建自定義儀表盤和報表
- 豐富的集成:支持與多種系統和工具集成(如 Docker、Kubernetes、AWS 等)
- 可擴展性:通過插件擴展功能,滿足特定需求
1.3 應用場景
ELK Stack 適用于多種日志管理場景:
- 應用程序日志集中管理和分析
- 系統和基礎設施監控
- 安全事件日志分析與審計
- 用戶行為追蹤與分析
- 業務數據可視化與報表
- 故障排查與問題定位
二、ELK Stack 安裝與部署
2.1 環境準備
2.1.1 系統要求
組件 | 最低配置 | 推薦配置 |
Elasticsearch | 2CPU、4GB 內存 | 4CPU、16GB 內存 |
Logstash | 2CPU、4GB 內存 | 4CPU、8GB 內存 |
Kibana | 1CPU、2GB 內存 | 2CPU、4GB 內存 |
Beats | 1CPU、1GB 內存 | 2CPU、2GB 內存 |
2.1.2 操作系統支持
- Linux(推薦 CentOS 7/8、Ubuntu 18.04/20.04、Debian 10)
- Windows Server(有限支持)
- macOS(開發環境)
2.1.3 依賴項
- Java 8 或 11(Elasticsearch 和 Logstash 需要)
- 網絡:各組件間需開放相應端口(9200、9300、5044、5601 等)
2.2 Elasticsearch 安裝
2.2.1 安裝 Java
# CentOS安裝Java 11
yum install -y java-11-openjdk-devel# Ubuntu安裝Java 11
apt update
apt install -y openjdk-11-jdk# 驗證Java安裝
java -version
2.2.2 安裝 Elasticsearch
# 導入Elasticsearch GPG密鑰
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch # CentOS
# 或
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add - # Ubuntu# 添加Elasticsearch倉庫
# CentOS
cat > /etc/yum.repos.d/elasticsearch.repo << EOF
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF# Ubuntu
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic.list
apt update# 安裝Elasticsearch
yum install -y elasticsearch # CentOS
# 或
apt install -y elasticsearch # Ubuntu
2.2.3 配置 Elasticsearch
# 編輯配置文件
vim /etc/elasticsearch/elasticsearch.yml# 核心配置
cluster.name: elk-cluster # 集群名稱
node.name: es-node-1 # 節點名稱
path.data: /var/lib/elasticsearch # 數據存儲路徑
path.logs: /var/log/elasticsearch # 日志路徑
network.host: 0.0.0.0 # 監聽地址,0.0.0.0表示所有地址
http.port: 9200 # HTTP端口
discovery.seed_hosts: ["127.0.0.1"] # 種子節點
cluster.initial_master_nodes: ["es-node-1"] # 初始主節點# 可選性能配置
bootstrap.memory_lock: true # 鎖定內存,防止swap
配置系統參數:
# 配置內存鎖定
vim /etc/elasticsearch/jvm.options
# 設置JVM堆大小(建議為物理內存的50%,不超過31GB)
-Xms4g
-Xmx4g# 配置系統限制
vim /etc/security/limits.conf
# 添加
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch - nofile 65536
elasticsearch - nproc 4096# 配置系統內核參數
vim /etc/sysctl.conf
# 添加
vm.max_map_count=262144# 應用配置
sysctl -p
2.2.4 啟動并驗證 Elasticsearch
# 啟動服務
systemctl start elasticsearch
systemctl enable elasticsearch# 檢查服務狀態
systemctl status elasticsearch# 驗證服務
curl -X GET "http://localhost:9200/"# 預期輸出
{"name" : "es-node-1","cluster_name" : "elk-cluster","cluster_uuid" : "xxxxxxxxxxxxxxxxxxxx","version" : {"number" : "7.14.0","build_flavor" : "default","build_type" : "rpm","build_hash" : "dd5a0a2acaa2045e41b5de95cb3e88ec9e074d","build_date" : "2021-07-29T20:49:32.864135063Z","build_snapshot" : false,"lucene_version" : "8.9.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}
2.3 Kibana 安裝與配置
2.3.1 安裝 Kibana
# CentOS安裝
yum install -y kibana# Ubuntu安裝
apt install -y kibana
2.3.2 配置 Kibana
# 編輯配置文件
vim /etc/kibana/kibana.yml# 核心配置
server.port: 5601 # 端口
server.host: "0.0.0.0" # 監聽地址
elasticsearch.hosts: ["http://localhost:9200"] # Elasticsearch地址
kibana.index: ".kibana" # Kibana索引名稱
2.3.3 啟動并驗證 Kibana
# 啟動服務
systemctl start kibana
systemctl enable kibana# 檢查服務狀態
systemctl status kibana# 開放防火墻端口(如需要)
firewall-cmd --permanent --add-port=5601/tcp
firewall-cmd --reload
通過瀏覽器訪問 http://<kibana-host>:5601 驗證 Kibana 是否正常運行。
2.4 Logstash 安裝與配置
2.4.1 安裝 Logstash
# CentOS安裝
yum install -y logstash# Ubuntu安裝
apt install -y logstash
2.4.2 基本配置
創建一個簡單的 Logstash 配置文件,從標準輸入讀取數據并輸出到 Elasticsearch:
# 創建配置文件
vim /etc/logstash/conf.d/stdin_to_es.conf# 配置內容
input {stdin {codec => "json"}
}filter {# 可以添加過濾規則
}output {elasticsearch {hosts => ["http://localhost:9200"]index => "logstash-stdin-%{+YYYY.MM.dd}"}stdout { codec => rubydebug } # 同時輸出到控制臺
}
2.4.3 啟動并驗證 Logstash
# 測試配置文件
/usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/stdin_to_es.conf# 啟動Logstash(測試模式)
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/stdin_to_es.conf# 作為服務啟動
systemctl start logstash
systemctl enable logstash# 檢查服務狀態
systemctl status logstash
2.5 Filebeat 安裝與配置
Filebeat 是輕量級日志收集器,用于替代 Logstash 在邊緣節點的日志收集工作。
2.5.1 安裝 Filebeat
# CentOS安裝
yum install -y filebeat# Ubuntu安裝
apt install -y filebeat
2.5.2 配置 Filebeat
配置 Filebeat 收集系統日志并發送到 Elasticsearch:
# 編輯配置文件
vim /etc/filebeat/filebeat.yml# 配置輸入
filebeat.inputs:
- type: logenabled: truepaths:- /var/log/messages- /var/log/securetags: ["system"]# 配置輸出到Elasticsearch
output.elasticsearch:hosts: ["localhost:9200"]index: "filebeat-system-%{+YYYY.MM.dd}"# 可選:配置輸出到Logstash
# output.logstash:
# hosts: ["localhost:5044"]# 啟用Kibana儀表盤加載
setup.kibana:host: "localhost:5601"# 加載系統模塊
setup.module:system:enabled: true
2.5.3 啟動并驗證 Filebeat
# 加載儀表盤模板
filebeat setup --dashboards# 啟動服務
systemctl start filebeat
systemctl enable filebeat# 檢查服務狀態
systemctl status filebeat
三、ELK Stack 核心配置
3.1 Elasticsearch 核心配置
Elasticsearch 的主要配置文件為/etc/elasticsearch/elasticsearch.yml,關鍵配置項:
# 集群配置
cluster.name: elk-cluster
node.name: ${HOSTNAME}
node.master: true # 是否可作為主節點
node.data: true # 是否存儲數據# 路徑配置
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch# 網絡配置
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300 # 節點間通信端口# 發現與集群形成
discovery.seed_hosts: ["es-node1.example.com", "es-node2.example.com"]
cluster.initial_master_nodes: ["es-node1.example.com"]# 安全配置(基礎)
xpack.security.enabled: false # 生產環境建議開啟
# xpack.security.transport.ssl.enabled: true# 索引生命周期管理
action.auto_create_index: .monitoring*,* # 自動創建索引規則# 內存配置
bootstrap.memory_lock: true
3.2 Logstash 管道配置
Logstash 使用管道配置定義數據處理流程,由 input、filter 和 output 三部分組成:
3.2.1 多輸入配置
# /etc/logstash/conf.d/multiple_inputs.conf
input {# 文件輸入file {path => "/var/log/nginx/access.log"start_position => "beginning"sincedb_path => "/dev/null" # 每次重啟都從頭讀取(測試用)tags => ["nginx", "access"]type => "nginx-access"}# 系統日志輸入syslog {port => 514type => "syslog"}# Beats輸入beats {port => 5044}
}filter {# 對nginx日志進行解析if [type] == "nginx-access" {grok {match => { "message" => '%{NGINXACCESS}' }}date {match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]target => "@timestamp"}geoip {source => "clientip"}}
}output {# 根據類型輸出到不同索引if [type] == "nginx-access" {elasticsearch {hosts => ["http://localhost:9200"]index => "nginx-access-%{+YYYY.MM.dd}"}} else if [type] == "syslog" {elasticsearch {hosts => ["http://localhost:9200"]index => "syslog-%{+YYYY.MM.dd}"}} else {elasticsearch {hosts => ["http://localhost:9200"]index => "logstash-%{+YYYY.MM.dd}"}}# 控制臺輸出(調試用)stdout { codec => rubydebug }
}
3.2.2 常用過濾器
- Grok 過濾器:解析非結構化日志為結構化數據
filter {grok {match => { "message" => "%{COMBINEDAPACHELOG}" } # 匹配Apache日志# 自定義模式match => { "message" => "%{TIMESTAMP_ISO8601:logtime} %{LOGLEVEL:loglevel} \[%{DATA:thread}\] %{DATA:class} - %{GREEDYDATA:msg}" }patterns_dir => ["/etc/logstash/patterns"] # 自定義模式文件目錄tag_on_failure => ["_grokparsefailure"] # 解析失敗時添加標簽}
}
? ? 2. Date 過濾器:解析日志中的時間戳
filter {date {match => [ "logtime", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601" ] # 匹配多種格式target => "@timestamp" # 存儲到@timestamp字段timezone => "Asia/Shanghai" # 指定時區}
}
? ? 3. Mutate 過濾器:修改字段
filter {mutate {rename => { "old_field" => "new_field" } # 重命名字段add_field => { "new_field" => "static_value" } # 添加字段update => { "existing_field" => "new_value" } # 更新字段remove_field => [ "message", "logtime" ] # 刪除字段convert => { "response_time" => "float" } # 轉換字段類型gsub => [ "message", "password=\w+", "password=***" ] # 替換敏感信息}
}
? ? 4. GeoIP 過濾器:根據 IP 地址添加地理位置信息
filter {geoip {source => "clientip" # 源IP字段target => "geo" # 結果存儲字段database => "/etc/logstash/geoip/GeoLite2-City.mmdb" # 自定義數據庫}
}
3.3 Filebeat 配置詳解
Filebeat 配置文件/etc/filebeat/filebeat.yml的核心配置:
# 輸入配置
filebeat.inputs:
- type: log # 輸入類型(log、stdin、tcp等)enabled: true # 是否啟用paths: # 日志文件路徑- /var/log/*.log- /var/log/nginx/*.logexclude_files: ['\.gz$'] # 排除的文件tags: ["system", "nginx"] # 標簽fields: # 自定義字段environment: productionservice: webserverfields_under_root: false # 自定義字段是否在根級別scan_frequency: 10s # 掃描新文件的頻率harvester_buffer_size: 16384 # 收割機緩沖區大小max_bytes: 10485760 # 單個日志條目最大字節數multiline.type: pattern # 多行日志處理multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' # 多行匹配模式multiline.negate: true # 是否否定匹配multiline.match: after # 匹配后如何處理# 模塊配置(預定義的日志類型處理)
filebeat.config.modules:path: ${path.config}/modules.d/*.yml # 模塊配置路徑reload.enabled: false # 是否自動重載# 輸出配置
output.elasticsearch:hosts: ["localhost:9200"] # Elasticsearch地址index: "filebeat-%{[fields.environment]}-%{+YYYY.MM.dd}" # 索引名稱username: ${ELASTICSEARCH_USERNAME} # 用戶名password: ${ELASTICSEARCH_PASSWORD} # 密碼ssl.enabled: true # 是否啟用SSLssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"] # CA證書# 或輸出到Logstash
# output.logstash:
# hosts: ["localhost:5044"]
# loadbalance: true # 是否負載均衡
# worker: 2 # 工作線程數# 處理器配置(在發送前處理事件)
processors:- add_host_metadata: # 添加主機元數據when.not.contains.tags: forwarded- add_cloud_metadata: ~ # 添加云服務元數據- add_docker_metadata: ~ # 添加Docker元數據- add_kubernetes_metadata: ~ # 添加Kubernetes元數據- drop_fields: # 刪除字段fields: ["beat", "input", "source"]- dissect: # 解析字段tokenizer: "%{key1}=%{value1};%{key2}=%{value2}"field: "message"target_prefix: "dissect"# 日志配置
logging.level: info # 日志級別
logging.to_files: true # 是否輸出到文件
logging.files:path: /var/log/filebeatname: filebeatkeepfiles: 7permissions: 0644# Kibana配置(用于設置儀表盤)
setup.kibana:host: "localhost:5601"username: ${KIBANA_USERNAME}password: ${KIBANA_PASSWORD}# 索引生命周期管理
setup.ilm:enabled: truepolicy_name: "filebeat-policy"rollover_alias: "filebeat"
3.3.1 Filebeat 模塊配置
Filebeat 提供多種預定義模塊,簡化常見日志類型的處理:
# 列出可用模塊
filebeat modules list# 啟用Nginx模塊
filebeat modules enable nginx# 禁用Nginx模塊
filebeat modules disable nginx
配置模塊:
# /etc/filebeat/modules.d/nginx.yml
- module: nginxaccess:enabled: truevar.paths: ["/var/log/nginx/access.log*"] # 日志路徑error:enabled: truevar.paths: ["/var/log/nginx/error.log*"] # 日志路徑ingress_controller:enabled: false # 禁用Ingress Controller日志收集
3.4 Kibana 使用指南
3.4.1 索引模式創建
- 登錄 Kibana 控制臺(http://<kibana-host>:5601)
- 進入Management > Stack Management > Index Patterns
- 點擊Create index pattern
- 輸入索引模式(如nginx-access-*)
- 選擇時間字段(通常為@timestamp)
- 點擊Create index pattern
3.4.2 發現與搜索
在Discover頁面可以搜索和瀏覽日志數據:
- 使用 KQL(Kibana Query Language)搜索:
- response:500 - 查找響應碼為 500 的日志
- clientip:192.168.1.* - 查找特定 IP 段的客戶端
- method:GET AND response:200 - 組合條件
- url:"/api/users/*" - 通配符匹配
- 時間范圍過濾:通過右上角時間選擇器設置
3.4.3 可視化創建
在Visualize Library頁面創建可視化圖表:
- 點擊Create visualization
- 選擇可視化類型(如 Line chart、Bar chart、Pie chart 等)
- 選擇索引模式
- 配置 X 軸、Y 軸和聚合方式:
- 對于訪問量趨勢:X 軸選擇@timestamp(按小時聚合),Y 軸選擇Count
- 對于狀態碼分布:使用Terms聚合,字段選擇response
5. 保存可視化
3.4.4 儀表盤創建
在Dashboard頁面創建儀表盤:
- 點擊Create dashboard
- 點擊Add添加已創建的可視化
- 調整圖表位置和大小
- 設置自動刷新時間
- 保存儀表盤
四、ELK Stack 安全配置
4.1 Elasticsearch 安全配置
啟用 Elasticsearch 安全功能(X-Pack Security):
# /etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
設置內置用戶密碼:
# 自動生成隨機密碼
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto# 或手動設置密碼
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
創建自定義用戶:
# 使用Kibana控制臺或API創建用戶
# 示例:創建具有管理員權限的用戶
curl -X POST "http://localhost:9200/_security/user/admin" \-H "Content-Type: application/json" \-u elastic:elastic_password \-d '{"password" : "admin_password","roles" : ["superuser"],"full_name" : "Administrator"}'
4.2 Kibana 安全配置
配置 Kibana 使用 Elasticsearch 認證:
# /etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "kibana_system_password"
xpack.security.enabled: true
xpack.monitoring.ui.container.elasticsearch.enabled: true
設置 Kibana 空間和角色:
- 登錄 Kibana(使用 elastic 用戶)
- 進入Management > Stack Management > Security > Spaces創建空間
- 進入Roles創建自定義角色,分配權限
- 進入Users創建用戶并分配角色
4.3 加密通信配置
配置 Elasticsearch、Kibana 和 Filebeat 之間的 SSL/TLS 通信:
# 創建證書頒發機構
/usr/share/elasticsearch/bin/elasticsearch-certutil ca# 生成證書
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12# 配置Elasticsearch SSL
cp elastic-certificates.p12 /etc/elasticsearch/certs/
chown elasticsearch:elasticsearch /etc/elasticsearch/certs/*
# Elasticsearch SSL配置
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
# Kibana SSL配置
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/kibana.crt
server.ssl.key: /etc/kibana/certs/kibana.key
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/ca.crt"]
五、ELK Stack 實戰案例
5.1 Nginx 日志分析平臺
5.1.1 架構設計
Nginx服務器 → Filebeat → Logstash → Elasticsearch → Kibana
5.1.2 配置 Filebeat 收集 Nginx 日志
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: logenabled: truepaths:- /var/log/nginx/access.logtags: ["nginx", "access"]fields:log_type: nginx_access- type: logenabled: truepaths:- /var/log/nginx/error.logtags: ["nginx", "error"]fields:log_type: nginx_erroroutput.logstash:hosts: ["logstash-host:5044"]
5.1.3 配置 Logstash 處理 Nginx 日志
# /etc/logstash/conf.d/nginx.conf
input {beats {port => 5044}
}filter {if [fields][log_type] == "nginx_access" {grok {match => { "message" => '%{NGINXACCESS}' }}date {match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"}geoip {source => "clientip"}useragent {source => "agent"target => "user_agent"}mutate {convert => {"bytes" => "integer""response" => "integer""responsetime" => "float"}remove_field => ["message", "timestamp", "agent"]}} else if [fields][log_type] == "nginx_error" {grok {match => { "message" => '(?<timestamp>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[%{LOGLEVEL:loglevel}\] %{NUMBER:pid:int}#%{NUMBER:tid:int}: %{GREEDYDATA:error_message}(?:, client: %{IP:clientip})?(?:, server: %{DATA:server})?(?:, request: "%{DATA:request}")?(?:, host: "%{DATA:host}")?(?:, referrer: "%{DATA:referrer}")?' }}date {match => ["timestamp", "yyyy/MM/dd HH:mm:ss"]target => "@timestamp"}mutate {remove_field => ["message", "timestamp"]}}
}output {elasticsearch {hosts => ["elasticsearch-host:9200"]index => "nginx-%{[fields][log_type]}-%{+YYYY.MM.dd}"user => "elastic"password => "elastic_password"}stdout { codec => rubydebug }
}
5.1.4 創建 Kibana 可視化和儀表盤
- 創建索引模式nginx-*-*
- 創建訪問量趨勢圖(Line chart):
- X 軸:@timestamp(按小時聚合)
- Y 軸:Count
? ? ?3. 創建狀態碼分布(Pie chart):
- 聚合:Terms
- 字段:response
? ? ?4. 創建客戶端地理位置分布(Tile map):
- 坐標字段:geoip.location
? ? ?5. 創建響應時間分布(Histogram):
- X 軸:responsetime
- 間隔:0.1
? ? ?6. 將以上可視化添加到儀表盤
5.2 應用程序日志集中管理
5.2.1 架構設計
應用服務器 → Filebeat → Elasticsearch → Kibana
5.2.2 配置 Filebeat 收集 JSON 格式日志
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: logenabled: truepaths:- /var/log/app/*.logjson.keys_under_root: true # JSON字段放在根級別json.overwrite_keys: true # 覆蓋已有字段fields:service: myappenvironment: productionoutput.elasticsearch:hosts: ["elasticsearch-host:9200"]index: "app-%{[fields.service]}-%{+YYYY.MM.dd}"username: "filebeat_writer"password: "password"
setup.template.name: "app-logs"
setup.template.pattern: "app-*"
setup.template.enabled: false
setup.template.overwrite: true
5.2.3 在 Kibana 中分析應用日志
- 創建索引模式app-*
- 設置日志等級過濾器:loglevel: ERROR
- 創建錯誤趨勢圖:按時間和日志級別聚合
- 設置告警:當 ERROR 級別日志在 5 分鐘內超過 10 條時觸發告警
六、ELK Stack 擴展與優化
6.1 Elasticsearch 集群擴展
配置 Elasticsearch 集群以提高可用性和性能:
# 節點1(主節點和數據節點)
cluster.name: elk-cluster
node.name: es-node-1
node.master: true
node.data: true
network.host: 192.168.1.101
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]# 節點2(主節點和數據節點)
cluster.name: elk-cluster
node.name: es-node-2
node.master: true
node.data: true
network.host: 192.168.1.102
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
cluster.initial_master_nodes: ["es-node-1", "es-node-2"]# 節點3(僅數據節點)
cluster.name: elk-cluster
node.name: es-node-3
node.master: false
node.data: true
network.host: 192.168.1.103
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]
檢查集群健康狀態:
curl -X GET "http://localhost:9200/_cluster/health?pretty" -u elastic:password
6.2 索引生命周期管理
配置索引生命周期策略自動管理索引:
- 在 Kibana 中進入Management > Stack Management > Index Lifecycle Policies
- 創建策略:
- 熱階段:存儲最新數據,允許寫入和查詢
- 溫階段:數據不再寫入,僅查詢,可壓縮
- 冷階段:很少查詢的數據,進一步壓縮
- 刪除階段:過期數據自動刪除
? ? ?3. 應用策略到索引模板
示例 ILM 策略配置:
{"policy": {"phases": {"hot": {"min_age": "0ms","actions": {"rollover": {"max_age": "1d","max_size": "50gb"},"set_priority": {"priority": 100}}},"warm": {"min_age": "7d","actions": {"shrink": {"number_of_shards": 1},"forcemerge": {"max_num_segments": 1},"set_priority": {"priority": 50}}},"cold": {"min_age": "30d","actions": {"freeze": {},"set_priority": {"priority": 10}}},"delete": {"min_age": "90d","actions": {"delete": {}}}}}
}
6.3 性能優化
6.3.1 Elasticsearch 性能優化
- JVM 配置優化:
# /etc/elasticsearch/jvm.options
-Xms16g # 初始堆大小
-Xmx16g # 最大堆大小(不超過物理內存的50%,且不超過31GB)
-XX:+UseG1GC # 使用G1垃圾收集器
-XX:G1ReservePercent=25 # 保留內存百分比
? ? ?2. 索引優化:
# 索引模板優化
{"index_patterns": ["logs-*"],"settings": {"number_of_shards": 3, # 主分片數量(根據節點數調整)"number_of_replicas": 1, # 副本數量"refresh_interval": "30s", # 刷新間隔(提高寫入性能)"translog.durability": "async", # 異步提交translog"translog.flush_threshold_size": "1gb" # translog刷新閾值}
}
? ? ?3. 操作系統優化:
# 禁用swap
swapoff -a
# 永久禁用swap(編輯/etc/fstab注釋swap行)# 配置網絡
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf
sysctl -p
6.3.2 Logstash 性能優化
# /etc/logstash/jvm.options
-Xms4g
-Xmx4g# 管道工作線程配置
pipeline.workers: 4 # 通常設置為CPU核心數
pipeline.batch.size: 1000
pipeline.batch.delay: 50
6.3.3 Filebeat 性能優化
# /etc/filebeat/filebeat.yml
filebeat.registry.flush: 5s # 注冊表刷新間隔
queue.mem:events: 4096 # 內存隊列大小flush.min_events: 512 # 刷新最小事件數flush.timeout: 5s # 刷新超時
6.4 與其他工具集成
6.4.1 與 Kubernetes 集成
# Filebeat DaemonSet 配置示例
apiVersion: apps/v1
kind: DaemonSet
metadata:name: filebeatnamespace: kube-system
spec:selector:matchLabels:app: filebeattemplate:metadata:labels:app: filebeatspec:serviceAccountName: filebeatterminationGracePeriodSeconds: 30containers:- name: filebeatimage: docker.elastic.co/beats/filebeat:7.14.0args: ["-c", "/etc/filebeat.yml","-e",]volumeMounts:- name: configmountPath: /etc/filebeat.ymlsubPath: filebeat.yml- name: datamountPath: /usr/share/filebeat/data- name: varlibdockercontainersmountPath: /var/lib/docker/containersreadOnly: truevolumes:- name: configconfigMap:defaultMode: 0600name: filebeat-config- name: varlibdockercontainershostPath:path: /var/lib/docker/containers- name: datahostPath:path: /var/lib/filebeat-datatype: DirectoryOrCreate
6.4.2 與 Prometheus 集成
# prometheus.yml 配置
scrape_configs:- job_name: 'elasticsearch'metrics_path: '/_prometheus/metrics'static_configs:- targets: ['elasticsearch-host:9200']- job_name: 'kibana'metrics_path: '/metrics'static_configs:- targets: ['kibana-host:5601']
在 Kibana 中安裝 Prometheus 插件,實現 metrics 數據可視化。
七、最佳實踐與總結
7.1 最佳實踐
- 部署架構:
- 小規模部署:單節點 ELK Stack
- 中大規模:Elasticsearch 集群 + 獨立 Logstash 節點 + 獨立 Kibana 節點
- 超大規模:引入 Kafka 作為緩沖層,實現解耦和峰值處理
? ? ?2. 安全實踐:
- 啟用 X-Pack Security 保護敏感數據
- 配置 SSL/TLS 加密所有組件間通信
- 實施最小權限原則,為不同組件創建專用用戶
- 定期輪換證書和密碼
? ? ?3. 數據管理:
- 使用索引生命周期管理自動處理過期數據
- 根據日志重要性設置不同的保留策略
- 對敏感日志數據進行脫敏處理
- 定期備份重要索引
? ? ?4. 監控與告警:
- 監控 ELK Stack 自身健康狀態
- 設置關鍵指標告警(如磁盤使用率、集群健康狀態、錯誤率)
- 監控日志處理延遲,確保及時發現處理瓶頸
7.2 總結
ELK Stack 作為一套完整的日志管理解決方案,通過 Elasticsearch、Logstash、Kibana 和 Beats 的協同工作,提供了從日志收集、處理、存儲到分析和可視化的全流程能力。其主要優勢包括:
- 強大的全文檢索能力,支持復雜查詢和過濾
- 靈活的日志處理管道,可應對各種日志格式和轉換需求
- 豐富的可視化選項,幫助用戶從海量日志中發現有價值的信息
- 高度可擴展的架構,可從單節點部署擴展到大規模集群
- 活躍的社區和豐富的插件生態,不斷擴展功能邊界
在實際應用中,應根據業務需求和規模選擇合適的部署架構,并遵循最佳實踐進行配置和優化。隨著云原生和微服務架構的普及,ELK Stack 與容器平臺、云服務的集成將更加緊密,成為現代運維和監控體系中不可或缺的組成部分。
通過合理使用 ELK Stack,組織可以實現日志數據的集中管理,提高故障排查效率,增強系統安全性,為業務決策提供數據支持,最終提升整體 IT 運營效率和業務連續性。