一、搜索引擎
1炫七、搜索引擎是由索引組件、搜索組件和用戶接口組成:
流程:
- 索引組件:獲取數(shù)據(jù)-->建立文檔-->文檔分析-->文檔索引(倒排索引)
- 搜索組件:用戶搜索接口-->建立查詢(將用戶鍵入的信息轉(zhuǎn)換為可處理的查詢對象)-->搜索查詢-->展現(xiàn)結(jié)果
- 用戶接口:輸入和輸出
2谭网、搜索和索引組件的實現(xiàn)軟件
索引組件:Lucene
- Apache LuceneTM是一個高性能达罗、功能完全的文本搜索引擎庫完全用Java編寫。這是一個技術(shù)適合幾乎任何應(yīng)用程序需要全文搜索,尤其是跨平臺俐筋。
搜索組件:Solr
- SolrTM高性能搜索服務(wù)器使用Lucene是一個核心,使用XML / HTTP和JSON / Python / Ruby api,顯示在平面的搜索牵素、緩存、復(fù)制和web管理界面澄者。
搜索組件:ElasticSearch
-
Elasticsearch是一種分布式的笆呆、基于rest的搜索和分析引擎可以解決越來越多的用例。彈性堆棧的核心,它集中存儲您的數(shù)據(jù),這樣你就可以發(fā)現(xiàn)預(yù)期和意想不到的發(fā)現(xiàn)粱挡。
3赠幕、抽取數(shù)據(jù)組件的實現(xiàn)軟件
什么是ETL工具
- ETL,是英文 Extract-Transform-Load 的縮寫询筏,用來描述將數(shù)據(jù)從來源端經(jīng)過抽取(extract)榕堰、轉(zhuǎn)換(transform)、加載(load)至目的端的過程嫌套。ETL 是構(gòu)建數(shù)據(jù)倉庫的重要一環(huán)逆屡,用戶從數(shù)據(jù)源抽取出所需的數(shù)據(jù)圾旨,經(jīng)過數(shù)據(jù)清洗,最終按照預(yù)先定義好的數(shù)據(jù)倉庫模型康二,將數(shù)據(jù)加載到數(shù)據(jù)倉庫中去碳胳。
ETL工具開源實現(xiàn):Logstash
- Logstash 是一個應(yīng)用程序日志、事件的傳輸沫勿、處理挨约、管理和搜索的平臺。你可以用它來統(tǒng)一對應(yīng)用程序日志進行收集管理产雹,提供 Web 接口用于查詢和統(tǒng)計诫惭。Logstash 現(xiàn)在是 ElasticSearch 家族成員之一。
Logstash是一個開源的,服務(wù)器端數(shù)據(jù)處理管道,同時收集多個數(shù)據(jù)源的數(shù)據(jù),轉(zhuǎn)換,然后將其發(fā)送給你能夠“儲備蔓挖∠ν粒”(一般是Elasticsearch),Logstash性能比較差瘟判。
ETL工具開源實現(xiàn):Beats
- Filebeat:Log Files 處理日志文件
- Metricbeat:Metrics 收集計量數(shù)據(jù)例如cpu信息
- Packetbeat:Network Data 收集網(wǎng)絡(luò)報文數(shù)據(jù)
- Winlogbeat:Windows Event Logs 視窗系統(tǒng)日志
- Heartbeat:Uptime Monitoring 運行監(jiān)控日志
4怨绣、用戶組件的實現(xiàn)軟件
Kibana:
- Kibana允許您可視化Elasticsearch數(shù)據(jù)和導(dǎo)航彈性堆棧,非常精確的計算統(tǒng)計并展現(xiàn)出來。
官方網(wǎng)站:https://www.elastic.co/cn/
二拷获、ElasticSearch
1. ES是什么篮撑?
- Elasticsearch 是一個開源的搜索引擎,建立在全文搜索引擎庫 Apache Lucene 基礎(chǔ)之上用 Java 編寫的匆瓜,它的內(nèi)部使用 Lucene 做索引與搜索赢笨,但是它的目的是使全文檢索變得簡單, 通過隱藏Lucene 的復(fù)雜性驮吱,取而代之的提供一套簡單一致的 RESTful API茧妒。
- Elasticsearch 是一個全文搜索引擎,也是一個分布式的實時文檔存儲左冬,每個字段可以被索引與搜索作數(shù)據(jù)庫用桐筏,也可做一個分布式實時分析搜索引擎 能勝任上百個服務(wù)節(jié)點的擴展,并支持 PB 級別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)拇砰。
特性:
速度快九昧、易擴展、彈性毕匀、靈活铸鹰、操作簡單、多語言客戶端皂岔、X-Pack蹋笼、hadoop/spark結(jié)合使用、開啟即用。
分布式:橫向擴展非常靈活
全文檢索:基于lucene的強大的全文檢索能力剖毯;
近實時搜索和分析:數(shù)據(jù)進入ES圾笨,可達到近實時搜索,還可進行聚合分析
高可用:容錯機制逊谋,自動發(fā)現(xiàn)新的或失敗的節(jié)點擂达,重組和重新平衡數(shù)據(jù)
模式自由:ES的動態(tài)mapping機制可以自動檢測數(shù)據(jù)的結(jié)構(gòu)和類型,創(chuàng)建索引并使數(shù)據(jù)可搜索胶滋。
RESTful API:JSON + HTTP
2板鬓、ES的核心物理組件
Cluster 集群:
- 一個集群由一個唯一的名字標識,默認為“elasticsearch”究恤。集群名稱非常重要俭令,具有相同集群名的節(jié)點才會組成一個集群。集群名稱可以在配置文件中指定部宿。集群 狀態(tài):有三個分別是green, yellow, red
Node 節(jié)點:
- 存儲集群的數(shù)據(jù)抄腔,參與集群的索引和搜索功能。像集群有名字理张,節(jié)點也有自己的名稱赫蛇,默認在啟動時會以一個隨機的UUID的前七個字符作為節(jié)點的名字,你可以為其指定任意的名字雾叭。通過集群名在網(wǎng)絡(luò)中發(fā)現(xiàn)同伴組成集群悟耘。一個節(jié)點也可是集群。
Shard 分片:
- 在創(chuàng)建一個索引時可以指定分成多少個分片來存儲拷况。每個分片本身也是一個功能完善且獨立的“索引”,可以被放置在集群的任意節(jié)點上掘殴。分片的好處:允許我們水平切分/擴展容量可在多個分片上進行分布式的赚瘦、并行的操作,提高系統(tǒng)的性能和吞吐量奏寨。注意分片數(shù)創(chuàng)建索引時指定起意,創(chuàng)建后不可改了。備份數(shù)可以隨時改病瞳。
Primary Shard主分片
Replica Shard副本分片
- 一個分片可以有多個備份(副本)揽咕。備份的好處:高可用。一個主分片掛了套菜,副本分片就頂上去亲善;備份可擴展搜索的并發(fā)能力、吞吐量逗柴。搜索可以在所有的副本上并行運行蛹头。在高并發(fā)下副本也可搜索。
分片狀態(tài):green代表所有分片都存在
yellow代表主副部分分片缺失
red代表主副分片都缺失
3、Lucene的核心組件:
Near Realtime(NRT) 近實時:
- 數(shù)據(jù)提交索引后渣蜗,立馬就可以搜索到屠尊。
索引(index):數(shù)據(jù)庫
- Index 索引: 一個索引是一個文檔的集合(等同于solr中的集合)。每個索引有唯一的名字耕拷,通過這個名字來操作它讼昆。一個集群中可以有任意多個索引。
類型(type):表
- Type 類型:指在一個索引中骚烧,可以索引不同類型的文檔浸赫,如用戶數(shù)據(jù)、博客數(shù)據(jù)止潘。從6.0.0 版本起已廢棄掺炭,一個索引中只存放一類數(shù)據(jù)。
文檔(Document):行
- Document 文檔:被索引的一條數(shù)據(jù)凭戴,索引的基本信息單元涧狮,以JSON格式來表示。
映射(Mapping):
- 映射可以看作是建表的過程么夫。但與數(shù)據(jù)庫不同的是者冤,映射可以為一個字段建立不同的映射以滿足不同的場景,可以對數(shù)據(jù)進行清洗档痪,容錯涉枫,建立倒排索引。
4腐螟、域選項
域選項是用來來控制Lucene將文檔添加進域
- 索引后對該域執(zhí)行的操作有三個控制方法:
Index.ANALYZED:切詞和分析愿汰;
Index.NOT_ANALYZED:做索引,但不做分析乐纸;
Index.NO:不做索引衬廷;
5、ElasticSearch 程序環(huán)境:
配置文件:
/etc/elasticsearch/elasticsearch.yml主配置文件
/etc/elasticsearch/jvm.options
/etc/elasticsearch/log4j2.properties日志配置文件
Unit File:elasticsearch.service
程序文件:
/usr/share/elasticsearch/bin/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch-keystore:加密配置文件目錄
/usr/share/elasticsearch/bin/elasticsearch-plugin:管理插件程序
工作端口
- 搜索服務(wù)工作在tcp的9200端口
- 集群服務(wù)工作在tcp的9300端口
6汽绢、els集群的工作邏輯
- 所有節(jié)點選舉一個主節(jié)點吗跋,負責管理整個集群的狀態(tài)(green/yellow/red),以及各shards的分布方式宁昭;
ES中默認采用的節(jié)點發(fā)現(xiàn)方式是 zen(基于組播(多播)跌宛、單播)。在應(yīng)用于生產(chǎn)前有兩個重要參數(shù)需配置:
discovery.zen.ping.unicast.hosts: ["host1","host2:port","host3[portX-portY]"]
- 單播模式下积仗,設(shè)置具有master資格的節(jié)點列表疆拘,新加入的節(jié)點向這個列表中的節(jié)點發(fā)送請求來加入集群
discovery.zen.minimum_master_nodes: 1
- 這個參數(shù)控制的是,一個節(jié)點需要看到具有master資格的節(jié)點的最小數(shù)量寂曹,然后才能在集群中做操作入问。官方的推薦值是(N/2)+1丹锹,其中N是具有master資格的節(jié)點的數(shù)量
- 另外elastic還有很多插件,來完善各自功能芬失。
7楣黍、集群配置方法流程:
elasticsearch.yml配置文件:
cluster.name: myels #集群名稱
node.name: node1 #節(jié)點名稱
path.data: /data/els/data #數(shù)據(jù)存儲目錄
path.logs: /data/els/logs #日志目錄
network.host: 0.0.0.0 #監(jiān)聽地址
http.port: 9200 #監(jiān)聽端口
discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"] #集群成員
discovery.zen.minimum_master_nodes: 2 ##當主節(jié)點丟失時布蔗,定義法定票數(shù)轨香,投票選擇新master
8、el訪問通過RESTful API:
格式:curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
<BODY>:json格式的請求主體喊儡;
<VERB>動作:GET獲取或搜索颊糜,POST哩治,PUT上傳存儲,DELETE刪除
<PATH>指明特定索引的特定類型
例如:/index_name/type/Document_ID/
- 特殊端點:/_cat, /_search請求查詢由search端點發(fā)出, /_cluster集群端點
向集群端點查詢成員健康狀態(tài)
curl -XGET 'http://10.1.0.67:9200/_cluster/health?pretty=true'
向集群端點查詢成員信息
curl -XGET 'http://10.1.0.67:9200/_cluster/stats?pretty=true'
向搜索端點查詢主機信息
curl -XGET 'http://10.1.0.67:9200/_cat/nodes?pretty'
向搜索端點查詢健康信息
curl -XGET 'http://10.1.0.67:9200/_cat/health?pretty'
創(chuàng)建文檔:
curl -XPUT {"key1": "value1", "key2": value, ...}
三衬鱼、搭建elk服務(wù)
1业筏、安裝elasticsearch集群
節(jié)點一 192.168.1.61
節(jié)點二 192.168.1.62
節(jié)點三 192.168.1.63
- 注意:三個節(jié)點都要操作安裝配置
elasticsearch和kibana、filebeat鸟赫、logstash的版本必須一致
下載地址:https://artifacts.elastic.co/
#同步時間
#三個節(jié)點設(shè)置主機名
[root@node-61 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.61 node1 node1.localdomain
192.168.1.62 node2 node2.localdomain
192.168.1.63 node3 node3.localdomain
#三個節(jié)點安裝jdk
yum install java-1.8.0-openjdk-devel -y
#三個節(jié)點下載安裝elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.rpm
rpm -ivh elasticsearch-6.5.3.rpm
#節(jié)點一下載安裝kibanna
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.3-x86_64.rpm
#配置三個節(jié)點elasticsearch配置文件
vim /etc/elasticsearch/elasticsearch.yml
------ Cluster ------
cluster.name: myels #定義集群名稱
---- Node -----
node.name: node1 #當前節(jié)點名稱
----- Paths ----
path.data: /els/data #索引數(shù)據(jù)存儲位置
path.data: /els/data #索引數(shù)據(jù)存儲位置
----- Memory -----
#bootstrap.memory_lock: true #開機后是否鎖定內(nèi)存使用蒜胖,jvm.options 文件中的最大最小保持一致此選項設(shè)置為true,不一致設(shè)置為fail
------ Network ------
network.host: 192.168.1.61 #監(jiān)控在本機的那個地址抛蚤,不設(shè)置默認所有地址
#http.port: 9200 #默認端口
----- Discovery -----
discovery.zen.ping.unicast.hosts: ["node1", "node2","node3"] #判定集群成員名稱
discovery.zen.minimum_master_nodes:2 #當主節(jié)點丟失時台谢,定義法定票數(shù),投票選擇新master
##配置三個節(jié)點vm.options 文件
[root@node-61 ~]# vim /etc/elasticsearch/jvm.options
.............
-Xms1g #最小初始化內(nèi)存
-Xmx1g #最大使用內(nèi)存
##三個節(jié)點創(chuàng)建索引數(shù)據(jù)和日志目錄
[root@node-61 ~]# mkdir -pv /els/{data,logs}
mkdir: created directory ‘/els’
mkdir: created directory ‘/els/data’
mkdir: created directory ‘/els/logs’
[root@node-61 ~]# chown -R elasticsearch.elasticsearch /els/
##配置三個節(jié)點啟動elasticsearch
[root@node-61 ~]# systemctl status elasticsearch
[root@node-61 ~]# ss -tnl
.....
::ffff:192.168.1.61:9200
#查詢節(jié)點集群信息
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes
192.168.1.63 11 96 3 0.00 0.06 0.10 mdi - node3
192.168.1.61 10 95 3 0.00 0.03 0.08 mdi * node1 #有*號的是主節(jié)點
192.168.1.62 10 96 2 0.07 0.11 0.12 mdi - node2
#查詢集群健康狀態(tài)
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/health
1544710687 14:18:07 myels green 3 3 0 0 0 0 0 0 - 100.0%
#查看每個節(jié)點負載情況
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.63 12 96 0 0.02 0.04 0.09 mdi - node3
192.168.1.61 11 95 1 0.03 0.04 0.07 mdi * node1
192.168.1.62 10 96 0 0.06 0.07 0.11 mdi - node2
#查詢有幾個插件
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/plugin?v
#查詢有幾個索引
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/indices?v
#自定義信息使用幫助
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?
help
#顯示集群自定義信息岁经,名稱朋沮,ip,啟動時間缀壤,jdk版本
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?
h=name,ip,port,uptime,jdk
node3 192.168.1.63 9300 23.6m 1.8.0_191
node1 192.168.1.61 9300 25.3m 1.8.0_191
node2 192.168.1.62 9300 24m 1.8.0_191
#顯示當前節(jié)點摘要信息
[root@node-61 ~]# curl http://node1:9200
{
"name" : "node1",
"cluster_name" : "myels",
"cluster_uuid" : "XGFCSZW9QPKfLv7N0q1qtA",
"version" : {
"number" : "6.5.3",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "159a78a",
"build_date" : "2018-12-06T20:11:28.826501Z",
"build_snapshot" : false,
"lucene_version" : "7.5.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search" #看到此句表名服務(wù)啟動正常
}
2樊拓、安裝elasticsearch-head插件
- 為了便于觀察集群狀況和管理,安裝elasticsearch-head插件塘慕,使用網(wǎng)頁管理集群筋夏,到GitHub克隆head插件
[root@node-61 ~]# yum install epel-release -y
[root@node-61 ~]# yum install npm -y
#克隆head插件
[root@node-61 ~]# git clone https://github.com/mobz/elasticsearch-head.git
#在elasticsearch配置文件最后添加
[root@node-61 ~]# vim /etc/elasticsearch/elasticsearch.yml
......
#文件的最后添加
http.cors.enabled: true #啟動http插件
http.cors.allow-origin: "*" #允許那些地址訪問,實際使用不能使用*
#安裝插件
[root@node-61 ~]# cd elasticsearch-head/
[root@node-61 elasticsearch-head]# npm install --ignore-scripts
#啟動head插件苍糠,并在后臺運行
[root@node-61 elasticsearch-head]# nohup npm run start &
[root@node-61 elasticsearch-head]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:9100
3叁丧、測試集群
- 上傳信息啤誊,el自動生成索引
[root@node-61 ~]# curl -H "Content-Type: application/json" -XPUT 'node1:9200/students/major/1?pretty' -d '{"name":"Jerry","age":17,"course":"jisuanji"}'
{
"_index" : "students",
"_type" : "major",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
#查詢索引
[root@node-61 ~]# curl -XGET 'node1:9200/students/_search?q="jisuanji"&pretty'
{
"took" : 637,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "students",
"_type" : "major",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"name" : "Jerry",
"age" : 17,
"course" : "jisuanji"
}
}
]
}
}
四岳瞭、查詢
ELS有很多API 例如:_cluster, _cat, _search
格式:curl -X GET '<SCHEME://<HOST>:<PORT>/[INDEX/TYPE/]_search?q=KEYWORD&sort=DOMAIN:[asc|desc]&from=#&size=#&_source=DOMAIN_LIST'
- /_search:搜索所有的索引和類型;
- /INDEX_NAME/_search:搜索指定的單個索引蚊锹;
- /INDEX1,INDEX2/_search:搜索指定的多個索引瞳筏;
- /s*/_search:搜索所有以s開頭的索引;
- /INDEX_NAME/TYPE_NAME/_search:搜索指定的單個索引的指定類型牡昆;
示例:
[root@node-61 ~]# curl -XGET 'node1:9200/students/major/2?pretty'
{
"_index" : "students", #索引
"_type" : "major", #類型
"_id" : "2", #id
"_version" : 1, #版本
"found" : true, #是否找到
"_source" : { #內(nèi)容
"name" : "Tom",
"age" : 19,
"course" : "dianzixinxi"
}
}
1姚炕、查詢類型:
第一種:Query DSL帶有查詢語句的查詢
第二種:簡單字符串
- 簡單字符串的語法格式說明連接:
http://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description
文本匹配的查詢條件:
- (1) q=KEYWORD, 相當于q=_all:KEYWORD
- (2) q=DOMAIN:KEYWORD
#單個詞條搜索
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?q=name:Tom&pretty'
{
"took" : 45,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "students",
"_type" : "major",
"_id" : "2",
"_score" : 0.2876821,
"_source" : {
"name" : "Tom",
"age" : 19,
"course" : "dianzixinxi"
}
}
]
}
}
以字段范圍查找
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?pretty' -d '
{
"query": {
"query_string": {
"fields": ["age"],
"query": "[17 TO 20]"
}
}
}
查詢修飾符說明連接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
自定義分析器:
analyzer=
默認操作符:OR/AND
default_operator, 默認值為OR
返回字段:
fields=
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?q=“Tom"&stored_fields=name&pretty'
注:5.X不支持摊欠;
結(jié)果排序:
sort=DOMAIN:[asc|desc]
#升序排序
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?sort=age&pretty'
#降序排序
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?sort=age:desc&pretty'
搜索超時:
timeout=搜索超時間
查詢結(jié)果窗口:
from=,默認為0,偏移量柱宦,從多少開始
size=, 默認為10些椒,顯示幾個結(jié)果
[root@node-61 ~]# curl -XGET 'node1:9200/_search/?q=name:"Tom"&from=0&size=2&pretty'
五、Kibana安裝使用
Kibana要和elasticsearch版本一致掸刊,安裝在節(jié)點一上
1免糕、安裝kibana
節(jié)點一:
#安裝kibana
[root@node-61 ~]# ls
kibana-6.5.3-x86_64.rpm
elasticsearch-6.5.3.rpm
[root@node-61 ~]# yum install kibana-6.5.3-x86_64.rpm -y
#修改配置文件
[root@node-61 ~]# vim /etc/kibana/kibana.yml
server.port: 5601 #監(jiān)聽端口
server.host: "192.168.1.61" #主機地址
server.name: "node1" #主機名稱
elasticsearch.url: "http://192.168.1.61:9200" #el地址端口
#elasticsearch.username: "user" #認證用戶
#elasticsearch.password: "pass" #認證密碼
#啟動kibana
[root@node-61 ~]# systemctl start kibana.service
[root@node-61 ~]# ss -tnl
LISTEN 0 128 192.168.1.61:5601
2、在kibana添加索引
六忧侧、fiebeat和logstash
1石窑、beat的種類:
- PacketBeat:網(wǎng)絡(luò)報文分析工具,統(tǒng)計收集報文信息蚓炬;
- Filebeat:是logstash forwarder的替換者松逊,因此是一個日志收集工具;
- Topbeat:用來收集系統(tǒng)基礎(chǔ)數(shù)據(jù)肯夏,如cpu经宏、內(nèi)存、io等相關(guān)的統(tǒng)計信息熄捍;
- Winlogbeat:用于搜集windows事件日志
- Metricbeat:可以定期收集操作系統(tǒng)和服務(wù)器的運行指標(CPU,內(nèi)存,硬盤,IO,讀寫速度,進程等等)
2烛恤、filebeat介紹
簡介:
- Filebeat 是一款輕量級的日志傳輸工具,它有輸入和輸出兩端余耽,通常是從日志文件中讀取數(shù)據(jù)缚柏,輸出到 Logstash 或 Elasticsearch 。其作用是收集業(yè)務(wù)服務(wù)器的日志碟贾,輸出到一個日志系統(tǒng)便于集中管理币喧。
filebeat參考配置示例
? 主配置文件 /etc/filebeat/filebeat.yml
示例(與本次試驗無關(guān)):
###################### Filebeat Configuration Example #########################
#=========================== Filebeat inputs =============================
filebeat.inputs:
# 這里每一個 type 表示定義了一個日志讀取源,這個源是收集 Nginx 的訪問日志
- type: log
enabled: true
paths:
- /usr/log/nginx/access/access.log
fields_under_root: true
fields:
alilogtype: nginxacclog
# 收集某一個服務(wù)的錯誤日志
- type: log
enabled: true
paths:
- /var/www/service/storage/logs/error.log
fields_under_root: true
fields:
alilogtype: service_error
serverip: ${serverip}
# 收集某一個服務(wù)的錯誤日志袱耽,并且使用了多行合并
- type: log
enabled: true
paths:
- /var/www/user_center/storage/logs/SERVER*.log
fields_under_root: true
fields:
alilogtype: usercenter_serverlog
serverip: ${serverip}
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
#============================= Filebeat modules ===============================
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: false
# Period on which files under path should be checked for changes
#reload.period: 10s
#================================ Outputs =====================================
#-------------------------- Elasticsearch output ------------------------------
# 這部分是用于配置日志輸出到 Elasticsearch 的部分
#----------------------------- Logstash output --------------------------------
# 將日志發(fā)送到 logstash 主機的 5044 端口杀餐,對應(yīng)的這臺 logstash 主機需要配置一個 input 監(jiān)聽于 5044 (配置過程,參考 Logstash 文檔)
output.logstash:
hosts: ["10.26.10.15:5044"]
參數(shù)解釋:
## 默認值 log 朱巨,表示一個日志讀取源
type : log
## 該配置是否生效史翘,如果設(shè)置為 false 將不會收集該配置的日志
enabled: true
## 要抓取的日志路徑,寫絕對路徑
paths: /to/file.log
## fields 表示自定義字段冀续,在下面縮進兩格處寫要自己添加的字段琼讽。如: alilogtype: usercenter_serverlog 表示在輸出的每條日志中加入該字段,key:alilogtype 洪唐, value:usercenter_serverlog 用于標識該日志源的類別钻蹬,在傳輸?shù)较乱粚?logstash 時可以根據(jù)該字段分類處理。
fields:
alilogtype: usercenter_serverlog
## 意思相同凭需,增加一個自定義字段问欠,key:serverip 肝匆,value: ${serverip} 這個值是讀取的系統(tǒng)環(huán)境變量,如果系統(tǒng)中沒有定義這個環(huán)境變量顺献,那么啟動 filebeat 的時候會報錯旗国,找到這個值.
serverip: ${serverip}
## 設(shè)置系統(tǒng)環(huán)境變量,創(chuàng)建文件 /etc/profile.d/serverip.sh 加入內(nèi)容:
export serverip=`ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d':' -f2`
## 這里拿的是本機 IP
## 多行合并參數(shù)注整,正則表達式
multiline.pattern: '^\['
## true 或 false粗仓;默認是false,匹配pattern的行合并到上一行设捐;true借浊,不匹配pattern的行合并到上一行
multiline.negate: true
## after 或 before,合并到上一行的末尾或開頭
multiline.match: after
## ['ERROR','WARN'] 該屬性可以配置只收集error級別和warn級別的日志,如果有配置多行收集,一定要將這個配置放在多行的后面
include_lines:
## ['DEBUG'] 該屬性配置不收集DEBUG級別的日志,如果配置多行 這個配置也要放在多行的后面
exclude_lines:
## Logstash所在的主機
hosts:
## 如果設(shè)置為TRUE和配置了多臺logstash主機萝招,輸出插件將負載均衡的發(fā)布事件到所有l(wèi)ogstash主機蚂斤。如果設(shè)置為false,輸出插件發(fā)送所有事件到隨機的一臺主機上槐沼,如果選擇的不可達將切換到另一臺主機曙蒸。默認是false。
loadbalance
## 每個配置的主機發(fā)布事件到Logstash的工作者數(shù)量岗钩。這最適用于啟用負載平衡模式纽窟。示例:如果您有2個主機和3個工作人員,則共有6個工作人員啟動(每個主機3個)兼吓。
worker
3臂港、安裝nginx做web服務(wù)器
- web服務(wù)器上
安裝nginx做web服務(wù)器
[root@node-60 ~]# yum install epel-release -y
[root@node-60 ~]# yum install nginx -y
[root@node-60 ~]# systemctl start nginx.service
4、安裝fiebeat视搏,收集日志
- 注意:版本和elasticsearch一致
#下載
[root@node-60 ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.3-x86_64.rpm
#安裝
[root@node-60 ~]# rpm -ivh filebeat-6.5.3-x86_64.rpm
#配置文件
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml
......
- type: log #文件類型
enabled: true #是否使用改變
paths:
- /var/log/nginx/access.log #設(shè)置日志路徑
output.elasticsearch:
hosts: ["node1:9200","node3:9200"] #el節(jié)點名稱
.....
#啟動filebeat
[root@node-60 ~]# systemctl start filebeat.service
5审孽、安裝logtash,對取到的日志處理
因為日志內(nèi)容復(fù)雜浑娜,filebeat無法對日志標準化處理(切詞)佑力,所以要安裝logtash
- 注意:版本和elasticsearch一致,建議安裝單個主機上面
#安裝jdk
[root@node-60 ~]# yum install java-1.8.0-openjdk-devel -y
#下載
[root@node-60 ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.3.rpm
#安裝
[root@node-60 ~]# rpm -ivh logstash-6.5.3.rpm
#以logstash用戶運行
[root@node-60 ~]# id logstash
uid=996(logstash) gid=994(logstash) groups=994(logstash)
[root@node-60 ~]# usermod -s /bin/bash logstash
#使用幫助信息
[root@node-60 ~]# /usr/share/logstash/bin/logstash --help
#設(shè)置輸入輸出配置
[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf
input {
stdin{ #標準輸入
type => "stdandardinput" #自定義判斷類型條件
}
}
output {
stdout { codec => rubydebug }
}
#切換用戶
[root@node-60 ~]# su - logstash
#查詢配置文件語法
-bash-4.2$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -t -f /etc/logstash/conf.d/test.conf
.........
The stdin plugin is now waiting for input:
[INFO ] 2018-12-16 20:41:36.268 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
等待輸入:hello world
hello world
{
"type" => "stdandardinput",
"host" => "node-60",
"@version" => "1", #系統(tǒng)自動添加版本
"@timestamp" => 2018-12-16T12:44:24.507Z,
"message" => "hello world"
}
配置logstash端口筋遭,使用beats插件傳入logstash
#修改filebeast配置文件
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml
- type: log #文件類型
enabled: true #是否使用改變
paths:
- /var/log/nginx/access.log #設(shè)置日志路徑
#---------- Logstash output --------
output.logstash:
hosts: ["192.168.1.60:5044"]
#重啟filebeat
[root@node-60 ~]# systemctl restart filebeat
#設(shè)置logstash輸入輸出配置
[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf
input {
beats {
host => '0.0.0.0'
port => 5044
}
}
output {
stdout { codec => rubydebug } #標準輸出
}
#切換用戶
[root@node-60 ~]# su - logstash
#啟動logstash
-bash-4.2$ /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/test.conf
- web服務(wù)器測試curl命令打颤,logstash是否在前臺輸出
6、安裝redis
- redis對大量日志緩存隊列處理
#安裝redis
[root@node-60 ~]# yum install redis -y
#配置redis文件
bind 0.0.0.0 #監(jiān)聽地址
requirepass 123 #認證密碼
#啟動redis
[root@node-60 ~]# systemctl start redis
修改filebeat配置文件漓滔,使filebeat輸出到redis
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml
- type: log #文件類型
enabled: true #是否使用改變
paths:
- /var/log/nginx/access.log #設(shè)置日志路徑
#---------- Logstash output --------
.........
output.redis: #添加
hosts: ["localhost"]
password: "123"
key: "filebeat"
db: 0 #默認是0號庫编饺,最多16個庫,表示為0-15
timeout: 5
#重啟filebeat
[root@node-60 ~]# systemctl restart filebeat
#redis以獲取filebeat數(shù)據(jù)
[root@node-60 ~]# redis-cli -a 123
127.0.0.1:6379> keys *
1) "filebeat"
127.0.0.1:6379>LPOP filebeat #從左邊查詢內(nèi)容
127.0.0.1:6379>RPOP filebeat #從右邊查詢內(nèi)容
127.0.0.1:6379>LLEN filebeat #查看里面條目
七次和、logstash的GrokBasics 插件使用
- grok可以提取結(jié)構(gòu)化字段的一個文本字段在一個文檔中反肋。你選擇哪個字段可以做字段匹配,模糊匹配那伐,正則表達式匹配踏施,別名表達式匹配,這些匹配可以重用石蔗。
- 這個工具非常適合syslog日志,apache和其他網(wǎng)絡(luò)服務(wù)器日志,mysql日志,可以一起打包的許多可重用的模式畅形。
格式:
%{SYNTAX:SEMANTIC}
SYNTAX:預(yù)定義的模式名稱养距;
SEMANTIC:給模式匹配到的文本所定義的鍵名;
例如:
1.2.3.4 GET /logo.jpg 203 0.12
%{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
自動匹配語法日熬,并截取詞后棍厌,加個鍵值(詞1:值,詞2:值竖席,詞3:值.......)
{ clientip: 1.2.3.4, method: GET, request: /logo.jpg, bytes: 203, duration: 0.12}
1耘纱、修改logstash配置文件,用來獲取redis數(shù)據(jù)
[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf
input {
redis{
key => "filebeat"
data_type => "list"
password => "123"
}
}
filter { #過濾器
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"
}
date {
match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]" #日期格式轉(zhuǎn)換
}
useragent { #替換易識別的格式
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "geoip"
database => "/etc/logstash/GeoLite2-City.mmdb" #城市地址庫
}
}
output { #輸出
elasticsearch {
hosts => ["node1:9200","node2:9200","node3:9200"] #定義elasticsearch節(jié)點
index => "logstash-ngxaccesslog-%{+YYYY.MM.dd}" #定義取到當天的時間加日志在后面
}
}
2毕荐、使用城市地址庫展示用戶ip來源
下載地址庫:https://dev.maxmind.com/geoip/geoip2/geolite2/
[root@node-60 ~]# cd /etc/logstash/
#下載
[root@node-60 logstash]#wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
[root@node-60 logstash]# tar xf GeoLite2-City.tar.gz #解壓縮
[root@node-60 logstash]# ll
..........
GeoLite2-City.mmdb #提取此文件到當前目錄束析,與test.conf對應(yīng)
測試:
#修改nginx日志模擬外網(wǎng)地址
[root@node-60 ~]# echo '10.228.1.60 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '10.228.1.78 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '10.228.1.18 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '221.221.42.212 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
注意:
1、輸出的日志文件名必須以“l(fā)ogstash-”開頭憎亚,方可將geoip.location的type自動設(shè)定為"geo_point"员寇;
2、target => "geoip"
八第美、json格式使用
- 除了使用grok filter plugin實現(xiàn)日志輸出json化之外蝶锋,還可以直接配置服務(wù)輸出為json格式,因此可以不用logstash什往,直接送到elasticsearch集群扳缕;
1、為什么不用logstash在web端收集别威?
- 依賴java環(huán)境第献,一旦java出問題,可能影響到web服務(wù)
- 系統(tǒng)資源占用率高兔港,且存在bug風險
- 配置比較復(fù)雜庸毫,支持匹配過濾
- Filebeat的優(yōu)點,專注日志收集衫樊,語法簡單飒赃,安裝快捷,配置方便
2科侈、nginx配置文件json格式示例
編輯nginx配置文件nginx.conf:
......
log_format main '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
3载佳、編輯tomcat配置文件json格式示例
#vim /apps/tomcat/conf/server.xml
pattern="{"clientip":"%h","ClientUser":"%
l","authenticated":"%u","AccessTime":&q
uot;%t","method":"%r","status":"%
s","SendBytes":"%b","Query?string":&qu
ot;%q","partner":"%{Referer}i","AgentVersion
":"%{User-Agent}i"}"/>
4、filebeat配置
filebeat.inputs:
#nginx日志提取
- type: log
enabled: true # 該配置是否生效臀栈,如果設(shè)置為 false 將不會收集該配置的日志
paths:
- /var/log/nginx/access.log #日志路徑
fields_under_root: true
fields: # 自定義字段蔫慧,在下面縮進兩格處寫要自己添加的字段
alilogtype: nginxacclog
#Tomcat日志提取
- type: log
enabled: true # 該配置是否生效,如果設(shè)置為 false 將不會收集該配置的日志
paths:
- /var/log/tomcat/catalina.*.log #日志路徑
fields_under_root: true
fields: # 自定義字段权薯,在下面縮進兩格處寫要自己添加的字段
alilogtype: tomcatlog
..............
output.elasticsearch: #直接輸出到elasticsearch集群
hosts: ["192.168.1.61:9200","192.168.1.62:9200"]
九姑躲、遇到的錯誤
curl -XPUT 'XXXXX:XXXX'
{
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
}
#解決方法
curl -XPUT -H "Content-Type: application/json" 'XXXXX:XXXX'
參考鏈接:https://www.cnblogs.com/leeSmall/p/9189078.html
https://www.linuxidc.com/Linux/2018-10/154669.htm