L ==> E · L · K

三劍客:Elastic Stackhtml

在學習ELK前,先對 Lucene做基本瞭解。java

今天才知道關係型數據庫的索引是 B-Tree,罪過...node

  • 減小磁盤尋道次數 ---> 提升查詢性能

Lucene

原始數據基礎查詢 + 原始數據聚合查詢git

  • 物化視圖
  • 實時聚合

核心:反向倒排索引github

//關鍵詞
document ---> term ---> posting list<docid>
term dictionary --->  term index
  • Term Index:以 FST(finite state transducers)形式保存
  • Term Dictionary: 以分 block 形式式保存,block 內公共前綴壓縮 term

聯合索引查詢正則表達式

  • skip list 數據結構:同時遍歷 A和 B的 posting list,互相 skip
    • Frame Of Reference編碼壓縮 docid
  • bitset 數據結構:對 A和 B兩個 filter分別求出 bitset,對兩個 bitset作 AND 操做
    • Roaring Bitmap

關於二者的性能比較,參見:Frame of Reference and Roaring Bitmaps 算法

Nested Document數據庫

按期行數據合併:子文檔 ---> 父文檔npm

DocValuesbootstrap

主存儲按列組織,隨機讀操做很快

  • 底層讀文件方式:memory mapped byte buffer(mmp)

時間序列數據庫祕密:https://segmentfault.com/a/1190000003502849?mType=Group

E:Elasticsearch

基於Lucene實現,接近實時(NRT,Near Realtime)的搜索平臺,基於 JSON的分佈式搜索和分析引擎

  • 開源分佈式搜索與數據分析引擎
  • 面向文檔型,文檔Json序列化
  • PB 級的數據處理
  • 開箱即用,RESTful WebApi:Json

官網:https://www.520mwx.com/view/44635

版本演進:5.x --> 6.x --> 7.x

從5.x支持拆分紅text和keyword,在6.x廢棄string
在7.x廢棄TransportClient,建議High-level-rest-client
在7.x使用默認的_doc做爲type,在8.x移除type
從7.x默認節點名稱爲主機名,分片數改成1
在7.x默認自帶jdk
從7.x Kibana支持全局開啓「黑暗」模式
從7.x時間戳從毫秒級支持至納秒級
  • Weak-AND算法:取 TOP-N 結果集,估算命中記錄數
  • 間隔查詢(Intervals query)

關於7.x版本參見:Elastic Stack 7.0.0Breaking changes in 7.0

ES每日持續性能監控:https://benchmarks.elastic.co/index.html

基本概念

關係數據庫 --> 數據庫 --> 表 --> 行(Rows) --> 列(Columns)
Elasticsearch --> 索引(Index) --> 類型(type) --> 文檔(Docments) --> 字段(Fields)  

其中,document 是能夠被索引的基本信息單元,Index 名字務必小寫 。

Elasticsearch系列 - JaJian 

最佳場景:一、檢索  二、統計監控  三、(日誌)分析

ES使用場景深刻探究

docid --> block --> Segment --> Shards/Replicas --> Index

分片 shards:

  • 支持水平分割/擴展內容容量
  • 支持在分片之上進行分佈式、並行操做

複製 replicas:

  • 在分片/節點失敗的狀況下,提供了高可用性
  • 在全部的複製上並行運行,擴展搜索量/吞吐量

默認狀況下,Elasticsearch中的每一個索引配置5個主分片和每一個分片的1個複製。

節點數 <= 主分片數 *(副本數+1)  

Mapping映射

動態映射 --> 定製映射

  • 建立索引同時建立映射
  • 先建立索引,再建立映射

mapping一經建立沒法修改,若要修改需從新創建索引和定義映射,具體方法:
step1.給現有索引定義別名,並把現有索引指向該別名,PUT /現有索引/_alias/別名A 
step2.新建立一個索引,定義新的映射關係
step3.將別名指向新的索引,而且取消以前索引的執行

POST /_aliases
{
    "actions":[
        {"remove": { "index": "現有索引名", "alias":"別名A" }},
        {"add"   : { "index": "新建索引名", "alias":"別名A" }}
    ]
}

性能:實現索引的平滑過渡,而且是零停機。

索引+檢索

精髓:一切設計都是爲了提升搜索的性能

  • Java API
  • HTTP Restful API

強烈推薦:Elasticsearch 的性能優化億級 Elasticsearch 性能優化 

Pipeline Aggregation

先了解下聚合

  • metric:相似sum、avg等
  • bucket:相似group by

可優化網絡傳輸量

  • Shard本地聚合 ---> 多Shards最終聚合
  • Hyperloglog算法

Pipeline Aggregation 做爲聚合的 plus版本

elasticsearch安裝

推薦 ES 6.x版本,暫用 -v6.8.0 & -v6.2.0

鑑於 .net Framework生產最高 4.6,也採用 ES v6.2.0版本

同時考慮 Java技術棧中 NodeClient已過時,當前流行的 Transport Client在 7.x版本開始將再也不支持

運行:elasticsearch.bat

9300:java/.Net 程序訪問的端口(tcp)
9200:瀏覽器、postman 訪問端口(http)

默認 ES只容許本機訪問,修改 config/elasticsearch.yml文件,修改 network.host 爲 0.0.0.0或指定IP,再重啓便可

建議在文件最後新增以下配置

http.cors.enabled: true //是否支持跨域
http.cors.allow-origin: "*" //支持全部域名 (以上2個配置解決:使用 Head 插件鏈接不上集羣)
node.master: true
node.data: true

注意,根據規劃 ES 6.x版每一個 Index只容許包含一個 Type,7.x版將會完全移除 Type:Removal of mapping types 

若遇報錯

ERROR: bootstrap checks failed
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

則在配置文件中新增

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

經常使用命令

http://localhost:9200/_cat/indices?v //當前結點的全部Index
http://localhost:9200/_mapping?pretty=true //當前Index包含的全部Type
http://ip:9200/_nodes #查看節點信息
http://ip:9200/_template #查看模板

GET /Index/Type/_search?pretty  #返回索引記錄,默認size=10
GET /index_name/_mapping/type_name #查詢映射
GET /index_Name/_mapping  #獲取映射關係
GET /_all/_mapping/  #獲取集羣內的全部映射關係

安裝教程:http://www.javashuo.com/article/p-dqhvkyhe-nn.html

elasticsearch-head插件 

下載地址:https://github.com/mobz/elasticsearch-head

在 Gruntfile.js的 connect配置項中新增 hostname:'*',

注意,es5 以上版本安裝 head須要安裝 node和 grunt

重點了解下grunt

JavaScript 任務運行器,基於 Node.js的項目構建工具,能夠進行打包壓縮、測試、執行等工做

npm install -g grunt-cli  #全局安裝
grunt -version #查看版本號

head 插件經過 grunt 啓動。

安裝教程:http://www.javashuo.com/article/p-gmyswcin-mb.html

head/_site/app.js 下配置修改

#這裏改爲es的IP和端口
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://99.6.150.141:9200";     

暫時未用到,先 mark 備用。

安裝:npm install
運行:grunt server 或 npm run start 

安裝時若出現 FetchError: request to https://registry.npmjs.com/grunt-karma failed,reason connect EACCES 104.16.27.35:443
解決:更新npm:npm install -g npm
若出現 notarget No matching version found for grunt-karma@2.0.0
解決:從新安裝grunt
若出現 error phantomjs-prebuilt@2.1.16 install: 'node install.js'
解決:執行npm install -g phantomjs-prebuilt@2.1.16 --ignore-scrip
相關信息可參考:npm install error | stackoverflow
至於出現 Local Npm module "grunt-contrib-jasmine" not found. Is it installed?
解決:能夠忽略,尚不影響使用,也能夠安裝 npm install grunt-contrib-jasmine解決

注意,出現 connect EACCES 或 connect ETIMEDOUT,優先啓用重試大法命令。

安裝教程:http://www.javashuo.com/article/p-wdbumflm-dy.html 

ik分詞器

ES 內置分詞器(standard、simple)效果不理想,推薦插件安裝:IK Analyzer v3.0

  •  面向Java的公用分詞組件,獨立於Lucene項目
  •  正向迭代最細粒度切分算法
  •  多子處理器分析模式

選擇與 ES配套的版本便可,下載地址,或選擇其餘分詞器 smartcn

  • analyzer:字段文本的分詞器
  • search_analyzer:搜索詞的分詞器
  • ik_max_word:插件ik提供的分詞器,可對文本進行最大數量的分詞

重命名爲 ik,放在 elasticsearch\plugins 目錄下重啓 es 便可

  • IKAnalyzer.cfg.xml:擴展詞和停用詞文件

分詞在線測試地址:grokdebug

注意,ES中一個字段不能同時支持全文和聚合搜索,除非採用以下方式

"url": {
 "type": "string", "analyzer": "simple",
  "fields": {
	"keyword": {
		"type": "keyword", "ignore_above": 256
	  }
	}
},

基本使用

全文搜索引擎ElasticSearch教程 | 阮一峯

幾個重要的配置

# (master_eligible_nodes / 2) + 1
discovery.zen.minimum_master_nodes:集羣主節點最小可見數量,爲提升集羣的可用性,避免集羣腦裂
discovery.zen.ping.unicast.hosts:節點發現機制,unicast通訊方式
discovery.zen.ping_timeout:發現過程當中的等待時間,默認3秒

 

L:Logstash

動態數據收集管道,日誌解析引擎,擁有可擴展的插件生態系統。

官網:https://www.elastic.co/cn/products/logstash

下載版本與 es一致便可:下載地址

安裝教程:

  • 組成部分:input、filter、output、codec
  • Grok:filter核心插件,文本格式字符串 ---> 結構化數據 + 正則表達式:測試地址

filter的ruby插件待學習...

基本使用

 Shipper Logstash --> Redis --> Indexer Logstash --> Elasticsearch  

 

K:Kibana

分析和可視化平臺。

官網:https://www.elastic.co/cn/products/kibana

安裝

下載版本與 es一致便可:下載地址demo-案例 

默認 Kibana只容許本機訪問,修改 config/kibana.yml文件,修改 server.host 爲 0.0.0.0或指定IP,再重啓便可

http://ip:5601/app/kibana#/home/tutorial_directory/sampleData?_g=() #添加kibana樣例數據

參考教程:

基本使用

REST訪問模式:<REST Verb>/<Index>/<Type>/<ID>

http://localhost:5601/status #狀態信息

GET /_cat/health?v #集羣健康信息
GET /_cat/nodes?v #集羣中結點列表
GET /_cat/indices?v #集羣中索引列表

 建議入庫 ES 的對象包含 Date 字段,不然 Create Index Pattern 時無可用字段可選,報錯

The indices which match this index pattern don't contain any time fields.

問題解決

按{"type":"string","index":"not_analyzed"}設置mapping時,報錯:
Elasticsearch:No handler for type [string] declared on field[XXX]

緣由:Elasticsearch從5.X引入"text""keyword"用於分詞和全詞匹配,從6.X完全移除"string",且"index"值只能是boolean變量:string類型已死, 字符串數據永生

  • 關鍵詞搜索(keyword search):精準匹配和聚合分析
  • 全文搜索(full-text search):分詞

若容許該字段被索引查詢,需{"type":"text","index":true},不然會報錯:Cannot search on field [xxx] since it is not indexed. 

關於ES中的數據類型,參見:Field datatypes

 

X-Pack

ElasticSearch 擴展包

  • 安全防禦:用戶驗證 + 受權和基於角色的訪問控制 + 節點/客戶端認證和信道加密
  • 實時集羣監控:可視化報告

cerebro

elasticsearch 開源監控軟件,替代 kopf(http://99.6.150.141:9200/_plugin/kopf/#!/cluster)

下載地址:cerebro | github  

es-rally

ES性能監控工具

[使用教程](https://blog.csdn.net/laoyang360/article/details/52155481)

其餘工具使用

Grafana:適合監控類場景
ElasticHD:支持SQL轉DSL
elasticsearch-SQL:類SQL查詢工具
測試工具:在原來執行的DSL的基礎上新增profile參數 "profile": true

 

 


相關文章
相關標籤/搜索