三劍客:Elastic Stackhtml
在學習ELK前,先對 Lucene做基本瞭解。java
今天才知道關係型數據庫的索引是 B-Tree,罪過...node
原始數據基礎查詢 + 原始數據聚合查詢git
核心:反向倒排索引github
//關鍵詞 document ---> term ---> posting list<docid> term dictionary ---> term index
聯合索引查詢正則表達式
關於二者的性能比較,參見:Frame of Reference and Roaring Bitmaps 算法
Nested Document數據庫
按期行數據合併:子文檔 ---> 父文檔npm
DocValuesbootstrap
主存儲按列組織,隨機讀操做很快
時間序列數據庫祕密:https://segmentfault.com/a/1190000003502849?mType=Group
基於Lucene實現,接近實時(NRT,Near Realtime)的搜索平臺,基於 JSON的分佈式搜索和分析引擎
官網:https://www.520mwx.com/view/44635
從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時間戳從毫秒級支持至納秒級
關於7.x版本參見:Elastic Stack 7.0.0, Breaking changes in 7.0
ES每日持續性能監控:https://benchmarks.elastic.co/index.html
基本概念
關係數據庫 --> 數據庫 --> 表 --> 行(Rows) --> 列(Columns) Elasticsearch --> 索引(Index) --> 類型(type) --> 文檔(Docments) --> 字段(Fields)
其中,document 是能夠被索引的基本信息單元,Index 名字務必小寫 。
最佳場景:一、檢索 二、統計監控 三、(日誌)分析
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" }} ] }
性能:實現索引的平滑過渡,而且是零停機。
索引+檢索
精髓:一切設計都是爲了提升搜索的性能
強烈推薦:Elasticsearch 的性能優化,億級 Elasticsearch 性能優化
Pipeline Aggregation
先了解下聚合
可優化網絡傳輸量
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
選擇與 ES配套的版本便可,下載地址,或選擇其餘分詞器 smartcn
重命名爲 ik,放在 elasticsearch\plugins 目錄下重啓 es 便可
分詞在線測試地址:grokdebug
注意,ES中一個字段不能同時支持全文和聚合搜索,除非採用以下方式
"url": { "type": "string", "analyzer": "simple", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } },
基本使用
幾個重要的配置
# (master_eligible_nodes / 2) + 1 discovery.zen.minimum_master_nodes:集羣主節點最小可見數量,爲提升集羣的可用性,避免集羣腦裂 discovery.zen.ping.unicast.hosts:節點發現機制,unicast通訊方式 discovery.zen.ping_timeout:發現過程當中的等待時間,默認3秒
動態數據收集管道,日誌解析引擎,擁有可擴展的插件生態系統。
官網:https://www.elastic.co/cn/products/logstash
下載版本與 es一致便可:下載地址
安裝教程:
filter的ruby插件待學習...
基本使用
Shipper Logstash --> Redis --> Indexer Logstash --> Elasticsearch
分析和可視化平臺。
官網:https://www.elastic.co/cn/products/kibana
安裝
默認 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類型已死, 字符串數據永生。"
若容許該字段被索引查詢,需{"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