按照如下順序安裝 你要使用的Elastic Stack
產品:html
下圖爲X-Pack
在Elasticsearch
、Kibana
、Logstash
中所提供的功能。java
注: X-Pack 將於 6.3 版本起開源。( 官方說明)
一、下載所需的軟件包:官方地址node
# mkdir /opt/download/elastic # cd /opt/download/elastic # wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz # wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz # wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz # wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz # wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.2.4.zip
二、服務器資源linux
Elastic Stack
,同時也會有對集羣模式的說明。三、建立普通用戶
不要以root
用戶運行應用程序,這裏我建立一個elastic
普通用戶。nginx
# useradd elastic
四、建立目錄結構
分別建立 程序目錄、日誌目錄、數據目錄,並對elastic
普通用戶受權目錄權限。web
# mkdir -p /opt/soft/elastic # mkdir -p /opt/log/elastic/{elasticsearch,logstash,kibana} # mkdir -p /opt/data/elastic/{elasticsearch,logstash,kibana} # chwon -R elastic:elastic /opt/soft/elastic # chwon -R elastic:elastic /opt/log/elastic # chwon -R elastic:elastic /opt/data/elastic
五、配置java
環境
訪問Oracle官網 下載JAVA
這裏我下載的版本是jdk-8u171-linux-x64.tar.gz
緩存
## 解壓安裝 # tar xzf jdk-8u171-linux-x64.tar.gz -C /opt/soft/ ## 配置JAVA的全局環境變量 # tail -1 /etc/profile export PATH=/opt/soft/jdk1.8.0_171/bin:$PATH ## 從新登陸當前終端或重載環境,可直接執行java命令爲完成配置。 # . /etc/profile # java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
六、補充說明
本文只根據官方資料,對nginx日誌採集處理組織一個比較系統的簡要介紹,沒有針對單個產品的深刻剖析。bash
全文中,代碼字段說明:
##
符號開頭,註釋行#
符號開頭,以超級用戶執行的命令$
符號開頭,以普通用戶執行的命令
全文會圍繞着此圖進行Elastic Stack
介紹。服務器
Beats
服務部署在應用服務器(或稱之邊緣服務器)進行數據採集。Logstash
服務接收數據進行解析,處理數據結構後寫入ES。ElasticSearch
服務搜索、分析和存儲數據。在規模較大時,ES集羣須要進行角色拆分。Kibana
操做 Elastic Stack 可視化 Elasticsearch 中的數據。說明:在生產環境中每層都建議是獨立的主機,避免額外的干擾,提升每層的數據處理能力。另外,在一些網上的資料中,有的會在採集層和解析層中間加一層隊列層
(隊列服務 - REDIS/MQ/Kafka),用來提升突發尖峯等異常狀況的容錯能力。實際上是非必要的,下面會在介紹Logstash時對此說明。數據結構
## 配置用戶的文件打開數及線程數 # grep "elastic" /etc/security/limits.conf elastic - nofile 65536 elastic - nproc 4096 ## 配置虛擬內存 # grep "max_map_count" /etc/sysctl.conf vm.max_map_count = 262144 # sysctl -p ## 解壓即安裝 # su - elastic $ tar xzf /opt/download/elastic/elasticsearch-6.2.4.tar.gz -C /opt/soft/elastic/ ## 配置文件 $ cd /opt/soft/elastic/elasticsearch-6.2.4 $ cat config/elasticsearch.yml cluster.name: elasticsearch node.name: ${HOSTNAME} network.host: 0.0.0.0 path.data: /opt/data/elastic/elasticsearch path.logs: /opt/log/elastic/elasticsearch ## 安裝 X-pack 插件 $ bin/elasticsearch-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 啓動服務 $ bin/elasticsearch -p elasticsearch.pid -d ## 生成 elastic、kibana、logstash_system 用戶密碼 $ bin/x-pack/setup-passwords auto
能夠直接以${...}
的方式,調用系統中的環境變量。
來源參見: 官方說明
cluster.name
相同的節點能夠組建成一個集羣,默認的名稱是elasticsearch
,可是你應該將它更改成一個適當的名稱,它描述了集羣的目的。 確保不會在不一樣的環境中重用相同的集羣名稱,不然可能會遇到鏈接錯誤集羣的節點。elasticsearch
將使用隨機生成的UUID的前七個字符做爲節點id。注意,節點id是持久化的,也就是說當節點從新啓動時不會改變,因此配置一個可讀性更高的節點名是有意義的,這裏我習慣以主機名命名。elasticsearch
只綁定本地迴環地址127.0.0.1
,這適合在單臺服務器上部署單個開發節點。生產環境根據狀況配置爲你要監聽的實際地址,以實現集羣個節點間的通訊。 elasticsearch
進程也能實現集羣功能,但僅適用於測試。Discovery settings elasticsearch
使用Zen Discovery
自定義發現實現節點與節點的集羣創建和主選舉。在生產環境中應該配置兩個重要的發現設置。
Heap size
默認狀況下,Elasticsearch
告訴JVM使用最小和最大的Heap size
爲1GB。生產環境中,配置Heap size
是很重要的,以確保ES有足夠的堆可用。配置法則是:
/var/lib/elasticsearch
,若是此路徑不適合存儲堆轉儲,可修改-XX:HeapDumpPath=/var/lib/elasticsearch
自定義路徑。 若是指定了文件名而不是目錄,則JVM將重複使用相同的文件; 這是一種防止堆轉儲在堆轉儲路徑中積累的機制。或者,你能夠經過配置計劃任務,按期刪除比配置的時間早的堆轉儲。 這裏不作過多的贅述,細節詳情參見:官方說明
Tribe node
經過 tribe.* 配置部落節點。是一種特殊的協調節點,它能夠鏈接到多個集羣,並在全部鏈接的集羣中執行搜索和其餘操做。
注意:Tribe node 從5.4.0版本起已被棄用。被 Cross Cluster Search 功能所取代,並將於 Elasticsearch 7.0 時移除。
Coordinating node
若是 node 禁用了node.master、node.data、node.ingest 能力,那麼就剩下了一個協調節點,該節點只能路由請求、處理搜索減小階段,以及分發批量索引。從本質上說,只協調節點就像智能負載平衡器同樣。這樣的節點須要有足夠的內存和CPU來處理收集階段。
注意:將太多的協調節點添加到集羣中會增長整個集羣的負擔,由於所選的主節點必須等待來自每一個節點的集羣狀態更新的確認!只協調節點的好處不該該被誇大 —— 數據節點能夠很好地服務於相同的目的。
更多細節詳情參見:官方說明
配置爲單機部署的最簡配置。配置完啓動後可經過:http://your_server_ip:5601 訪問kibana的web服務。不要帶端口訪問的話,建議結合nginx來實現。
## 解壓即安裝 $ tar xzf /opt/download/elastic/kibana-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic $ cd /opt/soft/elastic/kibana-6.2.4-linux-x86_64 ## 安裝 X-pack 插件 $ bin/kibana-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 配置文件 $ grep -Ev '^#|^$' config/kibana.yml server.host: "0.0.0.0" elasticsearch.username: "kibana" elasticsearch.password: "Your****Pass****For****Kibana" pid.file: /opt/log/elastic/kibana/kibana.pid ## 啓動服務 $ nohup bin/kibana &> /dev/null &
## 解壓即安裝 $ tar xzf /opt/download/elastic/logstash-6.2.4.tar.gz -C /opt/soft/elastic/ $ cd /opt/soft/elastic/logstash-6.2.4/ ## 安裝 X-pack 插件 $ bin/logstash-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 主配置文件 $ grep -Ev "^#|^$" config/logstash.yml node.name: ${HOSTNAME} path.data: /opt/data/elastic/logstash config.reload.automatic: true path.logs: /opt/log/elastic/logstash xpack.monitoring.elasticsearch.url: ["http://your_es_ip:9200"] xpack.monitoring.elasticsearch.username: "logstash_system" xpack.monitoring.elasticsearch.password: "your***logstash***pass"
接下來配置work文件,用於解析處理數據。
$ mkdir workconfig $ cat workconfig/test-nginx.conf input { beats { port => 5044 host => "0.0.0.0" } } filter { if [fileset][module] == "nginx" { if [fileset][name] == "access" { grok { match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] } remove_field => "message" } mutate { add_field => { "read_timestamp" => "%{@timestamp}" } } date { match => [ "[nginx][access][time]", "dd/MM/YYYY:H:m:s Z" ] remove_field => "[nginx][access][time]" } useragent { source => "[nginx][access][agent]" target => "[nginx][access][user_agent]" remove_field => "[nginx][access][agent]" } geoip { source => "[nginx][access][remote_ip]" target => "[nginx][access][geoip]" } } else if [fileset][name] == "error" { grok { match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] } remove_field => "message" } mutate { rename => { "@timestamp" => "read_timestamp" } } date { match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ] remove_field => "[nginx][error][time]" } } } } output { elasticsearch { hosts => your_es_ip manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
指定work配置文件,啓動服務。
$ bin/logstash -f workconfig/test-nginx.conf
Logstash
工做有三個階段:inputs → filters → outputs
。
上面示例中的work配置,用於接收beats發來的nginx日誌事件,而後進行字段處理實現關鍵字匹配,最後輸出到ES並創建事件索引。每個Logstash
插件都足夠的強大,更多細節性的插件說明請參閱官網:Input Plugins , Filter Plugins , Output Plugins , Codec Plugins.
前面我有提到說Beats
數據採集層與Logstash
解析層之間不須要額外的增長隊列層(緩衝層),緣由是由於:
假如 Logstash 節點發生故障,Logstash 會經過持久化隊列來保證運行中的事件至少一次被送達(at-least-once delivery)。那些未被正常處理的消息會被送往死信隊列(dead letter queue)以便作進一步處理。因爲具有了這種吸取吞吐量的能力,因此如今無需採用額外的隊列層,Logstash 就能平穩度太高峯期。
## 解壓即安裝 $ tar xzf /opt/download/elastic/filebeat-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic/ $ cd /opt/soft/elastic/filebeat-6.2.4-linux-x86_64/ ## 配置文件 $ grep -Pv "^[ ]*#|^$" filebeat.yml filebeat.prospectors: - type: log enabled: false paths: - /var/log/*.log filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: true setup.template.settings: index.number_of_shards: 3 output.logstash: hosts: ["your_logstash_ip:5044"]
使用filebeats
模塊功能
## 啓用nginx模塊 ./filebeat modules enable nginx ## 模塊配置 $ grep -Pv "^[ ]*#|^$" modules.d/nginx.yml - module: nginx access: enabled: true var.paths: - /path/to/log/nginx/access.log* error: enabled: true var.paths: - /path/to/log/nginx/error.log*
啓動服務
$ filebeat
至此,整個配置過程完畢。
參考資料