概要:
ELK允許你以任何格式搜索,分析和可視化從任何源生成的日志绑蔫,這種做法稱為集中式日志記錄运沦。在嘗試識(shí)別服務(wù)器或應(yīng)用程序的問題時(shí),集中日志記錄非常有用配深,因?yàn)樗试S您在一個(gè)位置搜索所有日志携添。它也很有用,因?yàn)樗试S您通過在特定時(shí)間范圍內(nèi)關(guān)聯(lián)其日志來(lái)識(shí)別跨多個(gè)服務(wù)器的問題篓叶。
組件:
Elasticsearch
是一個(gè)基于Apache Lucene(TM)的開源搜索引擎 烈掠,它的特點(diǎn)有:分布式,零配置缸托,自動(dòng)發(fā)現(xiàn)左敌,索引自動(dòng)分片,索引副本機(jī)制嗦董,RESTful web風(fēng)格接口母谎,多數(shù)據(jù)源瘦黑,自動(dòng)搜索負(fù)載等京革。
Logstash
是一個(gè)用來(lái)搜集、分析幸斥、過濾日志的工具匹摇。它支持幾乎任何類型的日志,包括系統(tǒng)日志甲葬、錯(cuò)誤日志和自定義應(yīng)用程序日志廊勃。它可以從許多來(lái)源接收日志,這些來(lái)源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX坡垫,它能夠以多種方式輸出數(shù)據(jù)梭灿,包括電子郵件、websockets和 Elasticsearch冰悠。
雖然filebeat可以將數(shù)據(jù)直接發(fā)送到elasticseaech數(shù)據(jù)庫(kù)堡妒,但我們建議先使用Logstash處理數(shù)據(jù),這將允許從不用的源數(shù)據(jù)收集數(shù)據(jù)溉卓,將其轉(zhuǎn)換為通用格式皮迟,并將其導(dǎo)出到另一個(gè)數(shù)據(jù)庫(kù)。logstash配置文件以json格式編寫桑寨,配置時(shí)伏尼,可以將logstash作為一個(gè)管道,將一端接收數(shù)據(jù)尉尾,以某種方式處理它爆阶,并將數(shù)據(jù)發(fā)送到ES,logstash有兩個(gè)必要的元素代赁,input和output以及一個(gè)可選元素filter
stdin {} 就是從標(biāo)準(zhǔn)輸入 stdout {} 就是從標(biāo)準(zhǔn)輸出
在這個(gè)字符串中扰她,其實(shí)定義了 Logstash 的兩個(gè)行為input和output。
在 input 中芭碍,我們定義了一個(gè)標(biāo)準(zhǔn)輸入徒役,由于什么都沒有,所以 Logstash 會(huì)從終端的標(biāo)準(zhǔn)輸入中讀取字符串窖壕,這也是為什么剛才在輸入完命令后會(huì)出現(xiàn)等待輸入的情況忧勿。
在 output 中,我們定義了一個(gè)標(biāo)準(zhǔn)輸出瞻讽,也就是說(shuō) Logstash 在處理完后會(huì)將結(jié)果從標(biāo)準(zhǔn)輸出(終端)中輸出鸳吸,而 codec 字段,則說(shuō)明了輸出會(huì)遵循什么樣的格式速勇,這里定義的 codec 為 rubydebug晌砾,所以我們剛才看到了一套標(biāo)準(zhǔn)的輸出格式。
logsatsh
filter
grok: 基于正則表達(dá)式提供豐富可重用的模式烦磁,基于此可以將非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)化數(shù)據(jù)
date: 將字符串類型的時(shí)間字段轉(zhuǎn)換為時(shí)間戳類型的养匈,方便后續(xù)數(shù)處理
Mutate:進(jìn)行增刪改查替換相關(guān)字段
logstash:位于ELK數(shù)據(jù)管道的最前端,其作用主要是收集都伪,過濾呕乎,分析,輸出各種結(jié)構(gòu)化或者非結(jié)構(gòu)化的原始數(shù)據(jù)(典型的如日志系統(tǒng))陨晶,原始數(shù)據(jù)從“無(wú)序變成有序”的重?fù)?dān)就落在了logstash的肩上了猬仁,因此其作用舉足輕重。
說(shuō)到Logstash,不得不說(shuō)其中的 插件機(jī)制湿刽,其幾乎所有的功能都是靠插件來(lái)實(shí)現(xiàn)的的烁,因此靈活易用:
關(guān)于 數(shù)據(jù)收集,Logstash 提供了輸入插件來(lái)支持各種不同的數(shù)據(jù)源
關(guān)于 數(shù)據(jù)分析诈闺,Logstash 則提供了過濾器插件來(lái)支持對(duì)輸入原始數(shù)據(jù)的花式處理
關(guān)于 數(shù)據(jù)輸出撮躁,Logstash 也提供了各種輸出插件,從而支持將結(jié)果數(shù)據(jù)輸出到各種地方买雾,比如標(biāo)準(zhǔn)控制臺(tái)把曼,文件,各種數(shù)據(jù)庫(kù)包括 ElasticSearch 等
Logstash其實(shí)在整個(gè)ELK中環(huán)節(jié)還蠻重要的漓穿,其實(shí)可以理解為一個(gè)“中間人”的角色嗤军。它通過從filebeat中接受數(shù)據(jù),然后進(jìn)行過濾晃危,最后再傳輸給es叙赚。所以一般logstash的配置也包括input,output以及filter的配置。
logstash理解參考>>
https://segmentfault.com/a/1190000015754162
Kibana
是一個(gè)基于Web的圖形界面僚饭,用于搜索震叮、分析和可視化存儲(chǔ)在 Elasticsearch指標(biāo)中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來(lái)檢索數(shù)據(jù)鳍鸵,不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖苇瓣,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。
filebeat
輕量級(jí)偿乖,單用途的數(shù)據(jù)發(fā)送器击罪,可以將數(shù)百或數(shù)千臺(tái)計(jì)算機(jī)的數(shù)據(jù)發(fā)送到logstash或elasticsearch
beats
filebeat 日志文件(yaml)
處理流程:輸入input 處理filter 輸出output
x-pack
X-Pack是一個(gè)Elastic Stack的擴(kuò)展,將安全贪薪,警報(bào)媳禁,監(jiān)視,報(bào)告和圖形功能包含在一個(gè)易于安裝的軟件包中
X-Pack 提供以下幾個(gè)級(jí)別保護(hù)elastic集群
1)用戶驗(yàn)證
2)授權(quán)和基于角色的訪問控制
3)節(jié)點(diǎn)/客戶端認(rèn)證和信道加密
4)審計(jì)
通俗講解:
安全防護(hù)功能:你是不是画切,不想別人直接訪問你的5601竣稽,9200端口,這個(gè)霍弹,x-pack能辦到毫别。
實(shí)時(shí)監(jiān)控功能:實(shí)時(shí)監(jiān)控集群的CPU、磁盤等負(fù)載庞萍;
生成報(bào)告功能:圖形化展示你的集群使用情況拧烦。
還有忘闻,機(jī)器學(xué)習(xí)等功能钝计。
X-Pack 已經(jīng)作為 Elastic 公司單獨(dú)的產(chǎn)品線,前身是 Shield, Watcher, Marvel, Graph, 和 reporting,先來(lái)說(shuō)說(shuō)這幾個(gè)爸爸是做什么的吧:
- Shield: 提供對(duì)數(shù)據(jù)的 Password-Protect私恬,以及加密通信债沮、基于角色的權(quán)限控制,IP 過濾本鸣,審計(jì)疫衩,可以有效地:
- 防止未授權(quán)的訪問:基于 Password-Protect,基于角色的權(quán)限控制荣德,IP過濾闷煤;
- 保證數(shù)據(jù)的完整性:基于消息認(rèn)證和 TLS/SSL 加密;
- 審計(jì)跟蹤:可以知道誰(shuí)在什么時(shí)候?qū)?shù)據(jù)做了什么涮瞻;
- Watcher: 提供對(duì)數(shù)據(jù)操作的變更的監(jiān)控和報(bào)警鲤拿。
- Marvel: 基于 Kibana 的插件,主要用于監(jiān)控 ES 集群署咽〗辏可以看到集群的健康狀況、實(shí)時(shí)的性能指標(biāo)宁否,分析歷史集群窒升、索引、節(jié)點(diǎn)的指標(biāo)等慕匠。
- Graph: 用于分析數(shù)據(jù)間的關(guān)系饱须。
- Reporting: 用于快速生成 Kibana Visualization 和 Dashboard 的報(bào)表,可以對(duì)生成的時(shí)間定制計(jì)劃台谊,并且可以由某些特定條件觸發(fā)冤寿。
再來(lái)看看我們的兒子 X-Pack 是做啥的,哦青伤,他就是他們的兒子督怜,一個(gè)大合集,便于安裝狠角、不用為版本兼容性犯愁号杠,可以靈活 disable / enable 其中的各個(gè)組件。他還多干了一件事兒丰歌,可以監(jiān)控 Logstash姨蟋。
關(guān)于免費(fèi)和收費(fèi)版本,版本功能比較可以查看:https://www.elastic.co/subscriptions
免費(fèi)版本注冊(cè)地址:https://register.elastic.co/xpack_register
付費(fèi)版本(分為黃金立帖、白金級(jí)別)購(gòu)買地址:https://www.elastic.co/subscriptions/xpack
默認(rèn)的免費(fèi)版本有一個(gè)月的 trial 試用期眼溶。免費(fèi)版本試用期只包含 ES 集群監(jiān)控、圖分析和可視化晓勇,基于角色的 ES 權(quán)限控制和搜索用戶信息的功能堂飞。不包含:
- 安全組件 Shield:
- TLS/SSL加密灌旧;
- LDAP的整合;
- 日志審計(jì)绰筛;
- 第三方的認(rèn)證域整合枢泰;
- 報(bào)警組件 Watcher;
- 報(bào)表組件 Reporting铝噩;
總的來(lái)說(shuō)免費(fèi)版本對(duì)于安全組件這塊什么都不支持衡蚂。
參考:http://www.reibang.com/p/a49d93212eca
x-pack尚處于付費(fèi)版本,適用期限:1個(gè)月
應(yīng)用場(chǎng)景
在傳統(tǒng)的應(yīng)用運(yùn)行環(huán)境中骏庸,收集毛甲、分析日志往往是非常必要且常見的,一旦應(yīng)用出現(xiàn)問題具被、或者需要分析應(yīng)用行為時(shí)丽啡,管理員將通過一些傳統(tǒng)工具對(duì)日志進(jìn)行檢查,如cat硬猫、tail补箍、sed、awk啸蜜、perl以及grep坑雅。這種做法有助于培養(yǎng)在常用工具方面的優(yōu)秀技能,但它的適用范圍僅限于少量的主機(jī)和日志文件類型衬横。
隨著應(yīng)用系統(tǒng)的復(fù)雜性與日俱增裹粤,日志的分析也越來(lái)越重要,常見的需求包括蜂林,團(tuán)隊(duì)開發(fā)過程中可能遇到一些和日志有關(guān)的問題:
開發(fā)沒有生產(chǎn)環(huán)境服務(wù)器權(quán)限遥诉,需要通過系統(tǒng)管理員獲取詳細(xì)日志,溝通成本高
系統(tǒng)可能是有多個(gè)不同語(yǔ)言編寫噪叙、分布式環(huán)境下的模塊組成矮锈,查找日志費(fèi)時(shí)費(fèi)力
日志數(shù)量巨大,查詢時(shí)間很長(zhǎng)
es歷史數(shù)據(jù)處理:
hadoop集群睁蕾,把歷史日志都放在hadoop集群上苞笨,直接寫一個(gè)mapreduce想查所長(zhǎng)時(shí)間就查多長(zhǎng)時(shí)間的
elk可以實(shí)現(xiàn)但是對(duì)于超過半年的索引會(huì)關(guān)閉掉,為了查詢效率
ELK流程圖
調(diào)研了ELK技術(shù)棧子眶,發(fā)現(xiàn)新一代的logstash-forward即Filebeat瀑凝,使用了golang,性能超logstash臭杰,部署簡(jiǎn)單粤咪,占用資源少,可以很方便的和logstash和ES對(duì)接渴杆,作為日志文件采集組件寥枝。所以決定使用ELK+Filebeat的架構(gòu)進(jìn)行平臺(tái)搭建宪塔。Filebeat是Beats家族的一員,后續(xù)可以使用Packetbeat進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)采集脉顿、Winlogbeat進(jìn)行Windosw事件采集、Heartbeat進(jìn)行心跳采集点寥、Metricbeat進(jìn)行系統(tǒng)指標(biāo)采集艾疟。這種架構(gòu)解決了 Logstash 在各服務(wù)器節(jié)點(diǎn)上占用系統(tǒng)資源高的問題。相比 Logstash敢辩,Beats 所占系統(tǒng)的 CPU 和內(nèi)存幾乎可以忽略不計(jì)蔽莱。另外,Beats 和 Logstash 之間支持 SSL/TLS 加密傳輸戚长,客戶端和服務(wù)器雙向認(rèn)證盗冷,保證了通信安全。
各組件承擔(dān)的角色和功能:
Elasticsearch:分布式搜索和分析引擎同廉,具有高可伸縮仪糖、高可靠和易管理等特點(diǎn)∑刃ぃ基于 Apache Lucene 構(gòu)建锅劝,能對(duì)大容量的數(shù)據(jù)進(jìn)行接近實(shí)時(shí)的存儲(chǔ)、搜索和分析操作蟆湖。通常被用作某些應(yīng)用的基礎(chǔ)搜索引擎故爵,使其具有復(fù)雜的搜索功能;
Logstash:數(shù)據(jù)處理引擎隅津,它支持動(dòng)態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù)诬垂,并對(duì)數(shù)據(jù)進(jìn)行過濾、分析伦仍、豐富结窘、統(tǒng)一格式等操作,然后存儲(chǔ)到 ES充蓝;
Kibana:數(shù)據(jù)分析和可視化平臺(tái)晦鞋。與 Elasticsearch 配合使用,對(duì)數(shù)據(jù)進(jìn)行搜索棺克、分析和以統(tǒng)計(jì)圖表的方式展示悠垛;
Filebeat:ELK 協(xié)議棧的新成員,一個(gè)輕量級(jí)開源日志文件數(shù)據(jù)搜集器娜谊,使用 golang 基于 Logstash-Forwarder 源代碼開發(fā)确买,是對(duì)它的替代。在需要采集日志數(shù)據(jù)的 server 上安裝 Filebeat纱皆,并指定日志目錄或日志文件后湾趾,F(xiàn)ilebeat 就能讀取數(shù)據(jù)芭商,迅速發(fā)送到 Logstash 進(jìn)行解析。
1.準(zhǔn)備工作
環(huán)境
Linux:Centos7.2
ElasticSearch : elasticsearch-6.7.0
Logstash : logstash-6.7.0
kibana:kibana-6.7.0
JDK: 1.8
占用端口
elasticsearch 9200/9300 它跟其他的節(jié)點(diǎn)的傳輸端口為9300搀缠,接受HTTP請(qǐng)求的端口為9200
logstash 9600/5044 5044接收beat數(shù)據(jù)的端口铛楣,9600是logstash API端口
kibana 5601
官網(wǎng)下載:
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.7.0.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-6.7.0-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-6.7.0.tar.gz
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.7.0-linux-x86_64.tar.gz
注意點(diǎn):
- 安裝Elastic Stack組件需要使用相同的版本
- elasticsearch的配置文件采用YAML格式,這意味著縮進(jìn)非常重要艺普,編輯文件時(shí)簸州,確保不添加任何額外的空格
2.系統(tǒng)配置
創(chuàng)建sudo權(quán)限用戶
[root@elk ~]# useradd -d /elk elk
[root@elk ~]# username=elk
[root@elk ~]# echo "$username ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$
操作系統(tǒng)配置
禁用linux
[root@elk ~]#vi /etc/sysconfig/selinux
將SELINUX=enforcing修改為SELINUX=disabled
安裝jdk1.8
請(qǐng)參考之前博客http://www.reibang.com/p/1b2b00ceef88
selinux設(shè)置
====操作系統(tǒng)優(yōu)化設(shè)置====
[elk@elk config]$ sudo vim /etc/security/limits.conf
* soft nproc 65535
[elk@elk config]$ sudo vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65535
系統(tǒng)參數(shù)配置
[elk@elk config]$ sudo vim /etc/sysctl.conf
fs.file-max=655350
vm.max_map_count=655360
[elk@elk config]$ sudo sysctl -p
防火墻設(shè)置
//臨時(shí)關(guān)閉
systemctl stop firewalld
//禁止開機(jī)啟動(dòng)
systemctl disable firewalld
3.Elasticsearch安裝
安裝
[elk@elk ~]$ tar -xzf elasticsearch-6.7.0.tar.gz
[elk@elk config]$ cd /elk/elasticsearch-6.7.0/config
es單節(jié)點(diǎn)
修改elasticsearch.yml配置文件
[elk@elk config]$ vim elasticsearch.yml
==設(shè)置集群名稱==
17 cluster.name: wp_seclog
==設(shè)置節(jié)點(diǎn)名稱==
23 node.name: ELK-node1
==設(shè)置數(shù)據(jù)存儲(chǔ)路徑==
34 path.data: /elk/data
==設(shè)置日志存儲(chǔ)路徑==
38 path.logs: /elk/data/logs
#集群設(shè)置==綁定IP地址==
#56 network.host: 0.0.0.0
==綁定端口==
60 http.port: 9200
==集群IP集合== #也可以添加端口
69 discovery.zen.ping.unicast.hosts: ["192.168.100.203"]
# 集群設(shè)置:多節(jié)點(diǎn)
#69 discovery.zen.ping.unicast.hosts: ["192.168.100.203","hosts2","host3"]
es集群多節(jié)點(diǎn)
已經(jīng)安裝好單個(gè)節(jié)點(diǎn),添加多節(jié)點(diǎn)時(shí)歧譬,只需要將es安裝包復(fù)制到相應(yīng)的機(jī)器上岸浑,需要配置集群中的另外節(jié)點(diǎn)es-2 和 es-3.配置同es-1,修改一下配置文件里的節(jié)點(diǎn)名和地址即可
如果是集群使用x-pack需要為內(nèi)部節(jié)點(diǎn)通信配置TSL/SSL
集群內(nèi)部證書配置(詳細(xì)可參考上面連接->es內(nèi)部節(jié)點(diǎn)安全認(rèn)證)
cd /elk/elasticsearch-6.7.0
#創(chuàng)建TSL/SSL證書
bin/elasticsearch-certutil ca
bin/elasticsearch-certutil cert --ca config/certs/elastic-stack-ca.p12 --dns 192.168.100.203 --ip 192.168.100.203
##創(chuàng)建cert文件夾
[elk@elk config]$ mkdir -p /elk/elasticsearch-6.7.0/config/certs
[elk@elk config]$ ls -al /elk/elasticsearch-6.7.0/config/certs
-rw------- 1 elk elk 3443 6月 20 10:07 elastic-certificates.p12
注意:如果安裝了x-pack但是不配置內(nèi)部安全通信認(rèn)證瑰步,集群不可用
集群配置:
wp-node1
[elk@elk elasticsearch-6.7.0]$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node1
node.master: true
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
wp-node2
-bash-4.2$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node2
node.master: true
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
wp-node3
-bash-4.2$ egrep -v '^$|#' config/elasticsearch.yml
cluster.name: wupao
node.name: wp-node3
node.master: false
path.data: /elk/elasticsearch-6.7.0/data
path.logs: /elk/elasticsearch-6.7.0/logs
bootstrap.system_call_filter: false
network.host: 0.0.0.0
transport.tcp.compress: true
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.100.203", "192.168.100.202","192.168.100.201"]
discovery.zen.minimum_master_nodes: 2
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
注意:
node.master: false ##注意discovery.zen.minimum_master_nodes: 2 為2兩個(gè)為true矢洲,為1一個(gè)為true
discovery.zen.minimum_master_nodes: 2 ##這個(gè)的參數(shù)為節(jié)點(diǎn)數(shù)N/2+1,因?yàn)槲夷壳暗墓?jié)點(diǎn)是個(gè),所以為2缩焦、所以為2個(gè)節(jié)點(diǎn)填寫為1
node3添加到集群后读虏,node-master日志中會(huì)顯示
報(bào)錯(cuò)解決
報(bào)錯(cuò)1:因?yàn)閯傞_始是一個(gè)節(jié)點(diǎn),后增加了兩個(gè)節(jié)點(diǎn)做集群袁滥,添加的方法是直接copy之前的包到新的服務(wù)器上
剛開始遇到無(wú)法添加集群的報(bào)錯(cuò):
[wp-node2] failed to send join request to master [{wp-node1}{MxvGfK7lR6iI_frh_BOzcg}{M_VIMWHFSPmZT9n2D2_fZQ}{192.168.1.203}{192.168.1.203:9300}{ml.machine_memory=16603000832, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], reason [RemoteTransportException[[wp-node1][192.168.1.203:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {wp-node2}{MxvGfK7lR6iI_frh_BOzcg}{gO2EuagySwq9d5AfDTK6qg}{192.168.1.202}{192.168.1.202:9300}{ml.machine_memory=12411887616, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}, found existing node } with the same id but is a different node instance]; ]
ith the same id but is a different node instance是因?yàn)閺?fù)制虛擬機(jī)時(shí)掘譬,elsticsearch時(shí),將elsticsearch文件夾下的data文件夾一并復(fù)制了呻拌。而在前面測(cè)試時(shí)葱轩,data文件夾下已經(jīng)產(chǎn)生了data數(shù)據(jù),于是報(bào)上面的錯(cuò)誤
解決辦法:刪除elsticsearch文件夾下的data文件夾下的節(jié)點(diǎn)數(shù)據(jù)
報(bào)錯(cuò)2:elasticsearch集群搭建報(bào)錯(cuò):
not enough master nodes discovered during pinging
解決2:
原因是node.master: true 和discovery.zen.minimum_master_nodes: 2 的數(shù)量不匹配藐握,如果為2需要兩個(gè)幾點(diǎn)配置node.master: true
修改jvm.options配置文件
[elk@elk config]$ vim jvm.options
====修改jvm內(nèi)存值====
#按照主機(jī)的內(nèi)存50%進(jìn)行設(shè)置靴拱,默認(rèn)es6.3.2為1g
-Xms2g
-Xmx2g
啟動(dòng)
[elk@elk bin]$ ./elasticsearch -d
==查看log信息,檢查es啟動(dòng)是否正常==
[elk@elk logs]$ tail -f /elk/data/logs/
顯示如下猾普,表示啟動(dòng)成功
[2019-03-28T14:17:00,452][INFO ][o.e.n.Node ] [HCU8cIa] started
[2019-03-28T14:17:00,457][INFO ][o.e.g.GatewayService ] [HCU8cIa] recovered [0] indices into cluster_state
關(guān)閉
直接殺掉進(jìn)程
[elk@elk ~]$ jps
18438 Elasticsearch
18566 Jps
[elk@elk ~]$ kill -9 18328
啟動(dòng)報(bào)錯(cuò)處理
報(bào)錯(cuò):
[2019-03-28T09:38:45,704][ERROR][o.e.b.Bootstrap ] [secnode-1] node validation exception
[1] bootstrap checks failed
[1]: max file descriptors [35536] for elasticsearch process is too low, increase to at least [65536]
解決:修改最大連接數(shù)袜炕,剛開始我修改了沒生效,重啟機(jī)器后生效
查看端口
[elk@elk ~]$ ss -ltnp
LISTEN 0 128 :::9200 :::* users:(("java",pid=18438,fd=488))
LISTEN 0 128 :::9300 :::* users:(("java",pid=18438,fd=374))
驗(yàn)證
[elk@elk bin]$ curl 192.168.100.203:9200
健康狀態(tài)
[elk@elk ~]$ curl -X GET http://192.168.100.203:9200/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1553766910 09:55:10 wp-seclog green 1 1 0 0 0 0 0 0 - 100.0%
注意:
1 network.host: 0.0.0.0 只要不是localhost就是生產(chǎn)模式
2 http://192.168.100.203:9200/_cat/nodes?v 查看集群狀態(tài)
Chrome擴(kuò)展程序
安裝完成后打開瀏覽器
安裝完集群后顯示為
4.logstash安裝
解壓
[elk@elk bin]$tar -xzf logstash-6.7.0.tar.gz
[elk@elk bin]$ cd /elk/logstash-6.7.0/bin/
測(cè)試
進(jìn)行數(shù)據(jù)測(cè)試初家,啟動(dòng)完成后輸入hello 看能否正常輸出
[elk@elk bin]$ ./logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }'
hello
Sending Logstash's logs to /elk/logstash-6.7.0/logs which is now configured via log4j2.properties
[2019-03-28T14:38:25,111][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/elk/logstash-6.7.0/modules/fb_apache/configuration"}
[2019-03-28T14:38:25,129][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/elk/logstash-6.7.0/modules/netflow/configuration"}
[2019-03-28T14:38:25,334][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/elk/logstash-6.7.0/data/queue"}
[2019-03-28T14:38:25,340][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/elk/logstash-6.7.0/data/dead_letter_queue"}
[2019-03-28T14:38:25,811][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2019-03-28T14:38:25,850][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"780df64b-8158-495f-a366-8e4bdbff21c7", :path=>"/elk/logstash-6.7.0/data/uuid"}
[2019-03-28T14:38:26,455][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.7.0"}
[2019-03-28T14:38:26,949][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
[2019-03-28T14:38:29,594][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>32, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2019-03-28T14:38:29,742][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0xd7dc89c run>"}
The stdin plugin is now waiting for input:
[2019-03-28T14:38:29,834][INFO ][logstash.agent ] Pipelines running {:count=>1, :pipelines=>["main"]}
{
"@version" => "1",
"@timestamp" => 2019-03-28T06:38:29.828Z,
"host" => "elk",
"message" => "hello"
}
配置conf文件偎窘,將數(shù)據(jù)傳送到ES
[elk@elk config]$ cd /elk/logstash-6.7.0/config/
vim logstash-simple.conf(創(chuàng)建logstash的配置文件,6.7.0版本無(wú)此文件需自行創(chuàng)建)
input { stdin { } }
output
{
elasticsearch { hosts => ["192.168.100.203:9200"] }
stdout { codec => rubydebug }
}
啟動(dòng)
[elk@elk config]$ cd /elk/logstash-6.7.0/bin/
[elk@elk bin]$ nohup ./bin/logstash -f config/logstash.conf >/dev/null 2>&1 &
查看日志
[elk@elk logs]$ cd /elk/logstash-6.7.0/logs
[elk@elk logs]$ tail -f less logstash-plain.log
端口
[root@elk /]# ss -ltnp
LISTEN 0 50 ::ffff:127.0.0.1:9600 :::* users:(("java",pid=18987,fd=88))
配置示例:
[elk@elk config]$ cat logstash.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
output{
if [fields][env] == "wiki"{
stdout {codec => rubydebug}
elasticsearch {
hosts => "192.168.100.203:9200"
manage_template => false
index => "wiki-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
if [fields][env] == "jira"{
stdout {codec => rubydebug}
elasticsearch {
hosts => "192.168.100.203:9200"
manage_template => false
index => "jira-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
if [fields][env] == "fisheye"{
stdout {codec => rubydebug}
elasticsearch {
hosts => "192.168.100.203:9200"
manage_template => false
index => "fisheye-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
if [fields][env] == "crowd"{
stdout {codec => rubydebug}
elasticsearch {
hosts => "192.168.100.203:9200"
manage_template => false
index => "crowd-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
if [fields][env] == "jenkins"{
stdout {codec => rubydebug}
elasticsearch {
hosts => "192.168.100.203:9200"
manage_template => false
index => "jenkins-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
}
[elk@elk config]$ pwd
/elk/logstash-6.7.0/config
5.kibana安裝
解壓
[elk@elk ~]$ tar -xzf kibana-6.7.0-linux-x86_64.tar.gz
[elk@elk ~]$ mv kibana-6.7.0-linux-x86_64 kibana-6.7.0
修改配置文件
[elk@elk kibana-6.7.0]$ cd /elk/kibana-6.7.0/config/
[elk@elk config]$ vim kibana.yml
2 server.port: 5601
#kibana IP
7 server.host: "192.168.100.203"
#es ip
28 elasticsearch.url: "http://192.168.100.203:9200"
elasticsearch.username: "kibana"
elasticsearch.password: "xxxxxx"
啟動(dòng)
nohup /elk/kibana-6.7.0/bin/kibana > /dev/null 2>&1 &
端口
[root@elk /]# ss -ltnp
LISTEN 0 128 192.168.1.203:5601 *:*
相關(guān)術(shù)語(yǔ)
kibana
discover:數(shù)據(jù)搜索查看
visualize:圖標(biāo)制作
dashboard:儀表盤制作
timelion:時(shí)序數(shù)據(jù)的高級(jí)可視化分析
devtools:開發(fā)者工具
術(shù)語(yǔ)
document:文檔數(shù)據(jù)
index:索引
type:索引中的數(shù)據(jù)類型
field字段:文檔的屬性
query dsl:查詢語(yǔ)言
es CRUD
create:創(chuàng)建文檔
read:讀取文檔
update:更新文檔
delete:刪除文檔
kibana->開發(fā)工具-創(chuàng)建
GET _search
{
"query": {
"match_all": {}
}
}
##create
POST /accounts/persion/1
{
"name":"daisy",
"lastname":"Doe",
"jobdescription":"Systens"
}
#read
GET accounts/persion/1
#update
POST /accounts/persion/1/_update
{
"doc":{
"jobdescription":"Linux"
}
}
#delete
DELETE accounts/persion/1
#query string查詢方式1
Get /accounts/persion/_search?q=daisy
#query DSL 查詢方式2
GET accounts/persion/_search
{
"query":{
"term":{
"name":{
"value":"daisy"
}
}
}
}
6.x-pack安裝
6.1安裝:
cd /elk/elasticsearch-6.7.0/bin && ./elasticsearch-plugin install x-pack
cd /elk/logstash-6.7.0/bin/ && ./logstash-plugin install x-pack
cd cd /elk/kibana-6.7.0/bin/ && ./kibana-plugin install x-pack
提示:
ERROR: this distribution of Elasticsearch contains X-Pack by default 表示es的x-pack包默認(rèn)已安裝
Logstash now contains X-Pack by default, there is no longer any need to install
it as it is already present.
ERROR: Invalid pack for: x-pack, reason: x-pack not an installable plugin, message: x-pack not an installable plugin 表示logstash的x-pack包默認(rèn)已安裝
Plugin installation was unsuccessful due to error "Kibana now contains X-Pack by default, there is no longer any need to install it as it is already present." 表示kibana的x-pack包默認(rèn)已安裝
6.2破解
參考:https://www.linuxea.com/1895.html
破解包下載:51下載
license申請(qǐng):申請(qǐng)license
時(shí)間戳:https://tool.lu/timestamp/
6.2.1將破解包下載下來(lái),包含下面兩個(gè)文件(重寫x-pack的兩個(gè)類)
-rw-rw-r-- 1 elk elk 4786 3月 21 15:34 LicenseVerifier.class
-rw-rw-r-- 1 elk elk 2893 3月 21 15:34 XPackBuild.class
6.2.2 找到目標(biāo)jar包
/elk/elasticsearch-6.7.0/modules/x-pack-core/x-pack-core-6.7.0.jar
6.2.3 替換jar包
為了能夠分辨清楚,創(chuàng)建old哲思,解壓jar包
[elk@elk old]$ jar -xf x-pack-core-6.7.0.jar
-rw-rw-r-- 1 elk elk 994 3月 21 15:34 logstash-index-template.json
drwxrwxr-x 2 elk elk 4096 3月 21 15:34 META-INF
-rw-rw-r-- 1 elk elk 1247 3月 21 15:34 monitoring-alerts.json
-rw-rw-r-- 1 elk elk 24213 3月 21 15:34 monitoring-beats.json
-rw-rw-r-- 1 elk elk 32309 3月 21 15:34 monitoring-es.json
-rw-rw-r-- 1 elk elk 5899 3月 21 15:34 monitoring-kibana.json
-rw-rw-r-- 1 elk elk 11787 3月 21 15:34 monitoring-logstash.json
drwxrwxr-x 3 elk elk 4096 3月 21 15:34 org
-rw-rw-r-- 1 elk elk 294 3月 21 15:34 public.key
-rw-rw-r-- 1 elk elk 556 3月 21 15:34 rollup-dynamic-template.json
-rw-rw-r-- 1 elk elk 1859 3月 21 15:34 security_audit_log.json
-rw-rw-r-- 1 elk elk 6038 3月 21 15:34 security-index-template.json
-rw-rw-r-- 1 elk elk 893 3月 21 15:34 triggered-watches.json
-rw-rw-r-- 1 elk elk 1391 3月 21 15:34 watches.json
-rw-rw-r-- 1 elk elk 19869 3月 21 15:34 watch-history.json
替換jar包中的 LicenseVerifier.class嗓节,XPackBuild.class兩個(gè)類文件
cp -a LicenseVerifier.class old/org/elasticsearch/license/
cp -a XPackBuild.class old/org/elasticsearch/xpack/core/
打包
[elk@elk old]$jar -cvf x-pack-core-6.7.0.jar
將打包好的x-pack-core-6.7.0.jar替換之前的/elk/elasticsearch-6.7.0/modules/x-pack-core/x-pack-core-6.7.0.jar目標(biāo)jar包
6.2.4申請(qǐng)license并上傳
根據(jù)上面的連接申請(qǐng)license屡穗,認(rèn)真填寫郵箱,用來(lái)接收json文件,country寫china讯蒲,其它都可以隨便寫沿盅,點(diǎn)擊申請(qǐng)后郵箱會(huì)馬上收到一個(gè)郵件
“type”:“basic” 替換為 “type”:"platinum" # 基礎(chǔ)版變更為鉑金版
“expiry_date_in_millis”:1561420799999 替換為 “expiry_date_in_millis”:3107746200000# 一個(gè)月變?yōu)?0年
大概格式:
{"license":{
"uid":"2651b126-fef3-480e-ad4c-a60eb696a733",
"type":"platinum", # 白金
"issue_date_in_millis":1533513600000,
"expiry_date_in_millis":3107746200000, # 到期時(shí)間
.............................
當(dāng)修改了時(shí)間和白金類型后把篓,來(lái)到 Management 選擇 License Management,點(diǎn)擊update license上傳以及修改好的License
如上圖腰涧,如果提示錯(cuò)誤韧掩,注意修改打開elasticsearch.yml 配置文件 加入 xpack.security.enabled: false,或者執(zhí)行“ 啟動(dòng)x-pack功能”再更新
破解成功后顯示
6.3啟動(dòng)x-pack功能:
6.3.1 開啟es的登錄功能窖铡,注意使用普通用戶
[elk@elk old]$ cd /elk/elasticsearch-6.7.0/
bin/elasticsearch-setup-passwords interactive ##注意修改elastic/kibana等賬號(hào)的密碼疗锐,elastic是登錄es的最高權(quán)限賬號(hào)
修改elasticsearch.yml配置:
cat /elk/elasticsearch-6.7.0/config/elasticsearch.yml
#添加如下2行,打開安全配置功能
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
6.3.2 修改kibana.yml配置
cat /elk/kibana-6.7.0/config/kibana.yml
#添加如下兩行
29 elasticsearch.username: "kibana"
30 elasticsearch.password: "your passwd"
此處修改完万伤,重啟es和kibana服務(wù)就需要登錄賬號(hào)和密碼了
6.3.3 修改logstash.yml配置
219 xpack.monitoring.enabled: true
220 xpack.monitoring.elasticsearch.username: logstash_system
221 xpack.monitoring.elasticsearch.password: your passwd
222 xpack.monitoring.elasticsearch.hosts: ["http://192.168.100.203:9200"]
配置logstash.conf時(shí)要添加用戶名密碼窒悔,如
配置 5044 端口作為 Filebeat 的連接和創(chuàng)建 ES 索引呜袁,保存在 config 目錄:
[elk@elk config]$ cat logstash-sample.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://192.168.100.203:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "your passwd"
}
}
Logstash 使用該配置使用 ES 的索引敌买,和 Filebeat 做的事情是一樣的,不過擁有了額外的緩存以及強(qiáng)大豐富的插件庫(kù)阶界。
啟動(dòng) logstash :
./bin/logstash -f config/logstash-sample.conf &
此時(shí)開啟filebeat虹钮,就可以在es中查看到log了
7.filebeat安裝
安裝
[root@zabbix data]# tar -xzf filebeat-6.7.0-linux-x86_64.tar.gz
[root@zabbix data]# cd filebeat-6.7.0-linux-x86_64/
修改配置文件
注意:
enabled: true ##true
paths:
- /confluence/confluence_home/logs/catalina.out #填寫具體的日志路徑
reload.enabled: true ##true
fields:
env: wiki ##名稱
output.logstash:
hosts: ["IP:5044"] ##注意輸出到logstash中,需要填寫logstash的IP和端口
[root@zabbix data]# vim filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /confluence/confluence_home/logs/catalina.out
fields:
env: wiki
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
output.logstash:
hosts: ["IP:5044"]
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
啟動(dòng)
測(cè)試是否正常
./filebeat -configtest -e
啟動(dòng)
nohup ./filebeat -c ./filebeat.yml -e >/dev/null 2>filebeat.log &
打開kibana控制臺(tái)可以看到
注意:
如果數(shù)據(jù)無(wú)法傳輸要手動(dòng)加載模板
在 Elasticsearch 中膘融, Index Pattern 用于定義字段應(yīng)如何分析的設(shè)置和映射芙粱。Filebeat 的默認(rèn) Index Pattern 由軟件包安裝。 如果在 filebeat.yml 配置文件中接受模板加載的默認(rèn)配置氧映,則 Filebeat 在成功連接到Elasticsearch后會(huì)自動(dòng)加載模板春畔。 如果模板已存在,默認(rèn)不會(huì)覆蓋岛都,但是可以通過配置進(jìn)行覆蓋律姨。如果要禁用自動(dòng)模板加載,或者要加載自己的模板臼疫,可以在Filebeat配置文件中更改模板加載的設(shè)置择份。 如果選擇禁用自動(dòng)模板加載,則需要手動(dòng)加載模板烫堤。
配置模板加載 - 僅Elasticsearch輸出支持荣赶。
手動(dòng)加載模板 - Logstash輸出所需。
由于我們需要的是輸出到 Logstash鸽斟,所以我們使用手動(dòng)模板加載:
curl -XPUT 'http://192.168.100.203:9200/_template/filebeat' -d@/data/filebeat-6.7.0-linux-x86_64/kibana/6/index-pattern/filebeat.json
8.kibana漢化
漢化方法(6.x)
- 拷貝此項(xiàng)目中的translations文件夾到您的kibana目錄下的src/legacy/core_plugins/kibana/目錄拔创。若您的kibana無(wú)此目錄,那還是嘗試使用此項(xiàng)目old目錄下的漢化方法吧富蓄。
- 修改您的kibana配置文件kibana.yml中的配置項(xiàng):i18n.locale: "zh-CN"
- 重啟Kibana伏蚊,漢化完成
9.Q&&A
- filebeat 數(shù)據(jù)一直傳輸不過去
運(yùn)行filebeat時(shí),log中顯示:
2019-04-04T10:58:39.928+0800 INFO log/input.go:138 Configured paths: [/var/log/logstash/logstash-slowlog-plain*.log]
2019-04-04T10:58:39.929+0800 INFO log/input.go:138 Configured paths: [/var/log/logstash/logstash-plain*.log]
查看/opt/filebeat-6.7.0-linux-x86_64/modules.d格粪,發(fā)現(xiàn)logsatsh模塊時(shí)打開的
./filebeat modules disable logstash
關(guān)閉后再次執(zhí)行就會(huì)發(fā)送到配置文件中的logstash中了
多個(gè)log注意配置logstash
- filebeat修改index默認(rèn)名稱躏吊,filebeat到es(單個(gè))
參考:filebeat
默認(rèn)值為 "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"
# Array of hosts to connect to.
hosts: ["localhost:9200"]
index: "api-access-%{+yyyy.MM.dd}"
setup.template:
name: 'api-access'
pattern: 'api-access-*'
enabled: false
filebeat修改index默認(rèn)名稱氛改,filebeat到es(多個(gè))
10. 參考
原理>>
elk常用架構(gòu)以及場(chǎng)景介紹
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
elk協(xié)議棧介紹
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/
安裝>>
https://segmentfault.com/a/1190000010975383
grok學(xué)習(xí)>>
https://www.elastic.co/guide/en/kibana/7.1/xpack-grokdebugger.html
http://grokconstructor.appspot.com/
http://grokdebug.herokuapp.com/ 調(diào)試工具
https://zhuanlan.zhihu.com/p/26399963
http://docs.flycloud.me/docs/ELKStack/logstash/get-start/install.html
Elasticsearch權(quán)威指南中文版>>
https://es.xiaoleilu.com/030_Data/25_Update.html
ELK安全加固:https://shuwoom.com/?p=2846
日志收集原理