當數據量爆炸增長,并且需要提供全文檢索功能,需要有效的數據檢索能力
- 用什么數據庫
- 怎么保證安全性
- 如何解決統計分析問題
- 如何解決單點故障
- 如何解決檢索難題
應對方案:
- 關系型數據庫:主從備份解決數據安全性問題,數據庫代理中間件進行心跳監測解決單點故障,代理中間件通過查詢語句分發到從節點進行最后匯總結果。
- 非關系數據庫:MongoDB備份解決數據安全性問題,節點競選機制解決單點故障問題,從配置庫檢索分片信息,將請求分發到各個節點,最后路由節點合并匯總結果
- 內存數據庫:數據達到PB級別,成本巨大
ElasticSearch(ES)
業內最主流的信息檢索、分析引擎,永遠開源且免費,應用場景:
- 信息查詢(查工商信息/物流信息)
- 日志檢索和安全分析(IT運維領域)
- 商品搜索(條件篩選/排序)
- 數據分析和可視化(業務數據/交易數據)
- 訂單查詢(被集成到ERP/CRM等系統)
- 地理位置查詢(LBS/地圖/O2O)
優點:
- 查詢速度快
- 對開發工程師,使用簡單,容易入門
- 應用場景廣泛
- Elastic Stack生態強大
- 軟件開源免費
- 支持云原生
ES基本概念
名詞 | 解釋 |
---|---|
Cluster | ES集群 |
Node | 節點 |
Shards | 索引分片 |
Replicas | 索引分片副本 |
Master | 元數據管理 |
Corrdinating | 處理路由請求 |
Data | 保存數據分片,負責數據相關操作 |
ES和Mysql的概念對比
ES | Mysql |
---|---|
index索引 | database數據庫 |
type文檔類型 | Table表 |
document文檔 | row行,一條記錄 |
field字段,組成文檔的最小單位 | column列 |
mapping映射 | schema模式 |
Get獲取數據 | select … from table |
Put插入數據 | insert into table |
阿里云ES簡介
基于開源ES構建的全托管云服務
- 100% 兼容開源
- 開箱即用,
按需付費
- 支持ES stack生態組件
- 與Elastic官方合作提供免費X-pack商業插件
- 一鍵部署、彈性伸縮、智能運維
- 各類內核引擎優化
- 遷移、容災、備份和監控等全套解決方案
成本對比
能力對比
實例創建
開啟ES后可以修改配置
ES產品功能
- 完美適配公共和混合云
Beats采集
Logstash收集
ES檢索
Ki可視化
計算存儲分離
云原生-彈性-計算存儲分離
開源ES問題:
- 負載不均:遷移熱點分片帶來大量數據拷貝
- 數據副本多副本帶來重復計算和存儲
- 數據搬遷節點擴縮容帶來的數據搬遷
使用28定律,分為用的多的數據和不活躍的數據
寫入增量數據之后,后臺任務會定期復制增量數據到臨時目錄,秩序臨時目錄+commit segment即可,只保存了一份,成本降低
Indexing service
提供寫入托管服務,針對寫入方面的性能優化,適用于TPS高、寫入流量波動較大、搜索QPS較低的場景(低成本、彈性擴展、免運維)
架構:計算和存儲相分離的架構
Open Store自研引擎:針對日志場景自研的日志存儲解決方案,能耨在日志場景中提供海量存儲服務。使用與業務上對于數據有實時更新的需求,數據沒有嚴格的冷熱區分,業務有強烈且明確的數據冷熱區分。
優勢:
- 接近OSS的費用
- 海量存儲(PB級別數據存儲)、按量付費,資源使用率100%
- 零副本(默認數據容災,無需配置副本)
- 查詢性能提升(接近云盤性能)
- 易用
- 海量高效存儲
其他高級特性
-
APM企業應用性能檢測,對軟件和應用程序運行狀態進行檢測、診斷和分析(APM Agent采集數據(數百個)-傳到APMServer-轉到ES-KIbana可視化,快速部署、靈活擴縮管理、低成本高性能)
-
Xpack商業特性:安全(索引和字段分權)、機器學習(數據實時監控,自預警)、監控、SQL能力(ES全文本檢索和數據統計分析,支持客戶端和RestAPI)
-
阿里分詞:ES自帶插件,可以完成文檔分析檢索,支持CRF、結合詞典CRF、MMSEG等,有多種分詞器(standard標準、cjk中日韓文、ik_max_wordIK中文、ik_smartIK中文、aliws阿里中文分詞器)
ES遷移
啥數據都能遷移數據到ES,都可以到阿里云ES
可以結束Logstash全量和增連遷移ES數據,logstash自動創建索引,但是索引可能會跟之前不一致,推薦用python腳本手動創建索引
還可以通過Dataworks將Mysql數據實時同步至ES
阿里云ES DSL
發送restful請求,Kibana控制臺進入ES
ES創建索引:PUT命令
右邊代表創建twitter索引成功
ES寫入文檔:Put請求指定索引名稱、類型、主鍵
ES主鍵查詢:GET,可以通過ID查詢
查詢語法:GET
聚合查詢語法:通過aggs進行聚合
修改ES文檔:PUT寫入到doc,POST發起更新
刪除:DELETE
批量操作語句:/_bulk{}{}{},每個都是一對json串{操作:{}}{key:value}
有空行會報錯
ES SQL查詢
使用_xpack/sql
?format指定返回數據格式 csv/txt
添加索引別名:_alias
配置壓縮的算法
默認EZ4,設置index.codec就行
default:EZ4
best_compression:更高壓縮比
open:打開索引
close:關閉索引
#查詢
GET _search{}
#看索引
GET _cat/indices?v
#創建索引
PUT /twitter?include_type_name=true
#寫入數據:向twitter索引里面寫入id為1的數據
PUT /twitter/_doc/1
#查詢id 為1 的數據
GET /twitter/_doc/1
#Lucene查詢語法:查詢user為kmichy的記錄
GET /twitter/_search?q=user.kmichy
#DSL查詢語法,match匹配
GET /twitter/_seach
#DSL查詢所有數據
GET /twitter/_search
#精準查詢query--range--post_date --{from,to}
GET /twitter/_search
{"query":{"range":{"post_date":{}}}
}
#關鍵字查詢;query---query_string--{query,default_opeartor,fields}
GET /twitter/_search
#查看索引映射字段信息
GET /twitter
#聚合統計
POST /twitter/_search?pretty
#修改數據{PUT覆蓋全部信息/POST更新操作}
PUT /twitter/_doc/3{"key":"value"}
POST /twitter/_doc/3/_update{"key":"value"}
#批量請求操作
#創建test索引
PUT /test
#查看所有索引
GET _cat/indices?v
#批量創建,不能有空格,分別為:創建id為1,刪除id為2,創建id為3,更新id為1
PUT /_bulk
{"index":{"_index":"test","_type":"doc","_id":"1"}}
{"field1":"value1"}
{"delete":{"_index":"test","_type":"_doc","_id":"2"}}
{"create":{"_index":"test","_type":"_doc","_id":"3"}}
{"field1":"value3"}
{"update":{{"_index":"test","_type":"_doc","_id":"1"}}}
{"doc":{"field1":"value1"}}#查詢test索引
GET /test/_search# SQL查詢,直接query里面執行sql
POST /_xpack/sql?format-txt
{"query":"select * from twitter"
}POST /_xpack/sql?format-txt
{"query":"show tables"
}POST /_xpack/sql?format-txt
{"query":"describe twitter"
}POST /_xpack/sql?format-txt
{"query":"select score() as score,user as name from twitter as mytable where user ='kimchy' or user='xx' limit 5"
}#創建索引,配置別名為my_index
PUT /my_index_v1
PUT /my_index_v1/_alias/my_index#查看所有別名為my_index的索引
GET /*/_alias/my_index#查看這個索引有哪些別名
GET /my_index_v1/_alias/*
阿里云ES SDK開發
ES支持通過REST API,通過JAVA,Python,Curl,C#,GO,JS,Perl,PHP,Ruby,SQL等多種開發語言客戶端,支持sql查詢數據
JAVA:發起查詢請求
SQL:在Kiba統計
創建Maven-引入elasticsearch-rest-high-level-client
(比ES版本高或相等)相關依賴包,執行查詢操作。高并發場景推薦增加客戶端連接數
需要添加白名單遠程訪問ES
集群監控管理
- 通過DSL發送指令
- GUI頁面
高級監控報警
主分片不能用:red
部分分片不可用:yellow
基礎監控
可查看CPU、內存等資源使用情況
Kibana查看堆棧檢測
語句:GET /_cat/health?v
,v代表列名標示出來
GUI:
GET /_cat/nodes?v
或者GUI:
GET /_cat/indices?v
分析當前線程池
GET /_cat/thread_pool?v
:所有線程池信息
GET /_cat/thread_pool/write?v
:寫入線程池信息
GET /_cat/thread_pool/search?v
:查詢線程池信息
分析熱點線程(消耗資源多的線程)
GET /_nodes/hot_threads
分析當前執行任務
GET _cat/tasks?v
寫入優化
ES寫入流程:
客戶端選擇Node發送請求:為協調節點,寫入到對應Node(Primary),寫數據之后,replica副本分片同步數據
主和副本寫入完成后返回成功
Lucene引擎用于寫入數據,記錄translog日志并寫入內存,定期刷新以segment文件格式保存
寫入優化
不同索引分片數的寫入耗時
設置合理的分片數和副本數
具體代碼:
settings–index–number_of_shards/replicas
settings–refresh_interval/…
寫入優化示例
索引刷新間隔:默認1s,會有很多segment
bulk總體字節數不能太大,不然會有內存壓力
查詢優化
- query:廣播到所有分片,在本地搜索并匹配文檔的優先隊列,每個分片返回各自優先隊列里面文檔id和排序值給給協調節點,協調節點會把這些值合并到自己的有限隊列,產生全局排序后結果列表。
- then
- fetch:協調節點會辨別出哪些文檔需要被取回,并且向相關分片提交多個get請求,并返回文檔給協調節點,一旦所有節點都被取回,那么協調節點就會返回結果給客戶端,關鍵詞的查詢請求會同時從內存和磁盤的索引里面查找,主鍵磁盤優先從事務日志里面獲取文檔信息,事務日志沒有命中再從磁盤去讀取文檔信息,這樣就可以保證數據寫入后實時讀取到文檔信息。(因為寫入后首先寫的就是日志)
內存查詢性能優化
集群節點數對延遲的影響
提高查詢效率:
硬件;在一定前提下升級擴容集群。
查詢本身:filter過濾、路由強制合并只讀索引,配置協調節點,配置合適的分詞器,設置查詢讀數設置的條數和字段,配置terminate after查詢快速返回,同時避免前綴模糊匹配、避免深度翻頁,避免索引稀疏
-使用過濾器GET /twitter/_search{query--bool--filter}
-使用路由:GET /my_index/_search?routing=user1
路由算法:shard_num=hash(_routing)%num_primary_shards
PUT /my_index/_doc/1?routing=user1
設置路由字段
- 強制合并優化索引
POST /twitter/_forcemerge?max_num_segments=1
,設為1后就不需要跨網絡跨分片,小于30GB可合為一個分片
terminate_after
提前結束搜索快速返回,到達1000(terminate_after)之后就會結束查詢