1. 程式人生 > >Elasticsearch - 簡單介紹

Elasticsearch - 簡單介紹

日誌系統 禁止 docid linux 建立 rds 通信 之前 結構

Elasticsearch 簡介 1. 什麽是 Elasticsearch ElasticSearch 是一個基於 Lucene 的搜索服務器。

它了一個分布式多 用戶能力的全文搜索引擎,能夠達到實時、穩定、可靠、快速搜索。

也可以看做 是布式的實時文件存儲,每個字段都能被索引並可被搜索。

目前大多數公司把 elasticsearch 作為 elk 日誌系統中日誌數據儲存和實時 搜索工具。

這一部分用戶,他們註重的是數據的實時寫入,在大量日誌數據產生 時,不堆積。

另一部分公司,把 elasticsearch 作為全文搜索工具,一次會在幾 千萬上億條數據中進行搜索、聚合,對數據寫入效率要求不高,註重的是搜索效 率。

2. Elasticsearch 的基礎概念 Lucene Lucene 是一個開放源代碼的全文檢索引擎工具包,其中封裝了很多建立倒 排索引的規則和搜索排序的算法。

倒排索引 在 Elasticsearch 中, 字段的數據可被分詞工具分為多個詞, 這些詞存在索 引表中都會標記對應的 docID,在進行搜索的時 elasticsearch 根據我們輸入的 詞(word1)去匹配索引表中的詞(word2) ,根據搜索結果返回相應 docID 的數 據。

例如:我們在 Elasticsearch 存入以下數據 id 1 2 3 Field 分詞工具 搜索工具 搜索運算工具 分詞在索引表中會存入以下數據 Term 工具 分詞 搜索 id 1、2 、3 1 1、2

運算 3 當我們查詢‘搜索’時,Elasticsearch 就會用‘搜索’去匹配索引表中的 term, 從索引表得知, 1、 2 兩條數據包含‘搜索’, 就會返回 1 、 2 兩條數據。

ElasticsearchTemplate Elasticsearch Template 用於規定 index 中字段的存儲格式、index 的設 置參數等, template 分為兩部分, 一是 setting, 主要用於規定 index 的參數, 例如 number_of_shards(分片數) 、number_of_replicas(副本數) 。

還有就是 設置一些優化 index 的參數。

另一部分是 mapping,elasticsearch 的 mapping 類似於數據庫的表結構,用於設置字段格式,假如 elasticsearch 不提前設置 mapping,系統會以該字段接收到的第一個數據的類型作為默認字段類型。

新建 elasticsearch template 可以直接在 kibanadev tools 上執行命令 例如: 新建 index 以 test*為名的,都會使用此 template,其中設置新建 index 為 3 個分片 1 個副本。

Location 字段數據為 geo_point 類型, url 為 text 類型, 並 url 使用 ik 分詞。

副本與分片 shards(分片)可以看做是 elasticsearch 在物理機上的最大存儲單位。

每 個索引有一個或多個分片, 索引的數據被分配到各個分片上, 相當於一桶水用了 N 個杯子裝,而 index 默認 shards 為 5。

關於如何規劃 shards 的問題,主要從 index 數據量和集群節點數這兩方面

來考慮。

一個 shards 最大的數據存儲量建議在 20G-50G,在實際規劃中就可以 根據此來劃分 shards 數量。

當 index 的數據量過小,設置多個 shards 顯然沒有 任何意義,反而在查詢的時候會影響效率。

replicas(副本)可以理解為備份分片,備分片不會同主分片出現在同一個 節點上,當主分片故障,副本分片會自動轉化為主分片繼續工作。

當有副本分片 無法分配的時候(unassigned),集群健康值會變成 yellow,當主分片無法分配時 (unassigned)集群健康值變為 red,此時集群不可用。

關於如何規劃 replicas 的問題,如果單節點 elasticsearch,不用多說,0 副本,不然集群會一直顯示為 yellow。

如果是多機集群,建議設置 1 副本,當 主分片 down 掉的時候, 副本分片會自動切換為主分片。

至於為什麽不是 2 副本、 3 副本。

因為副本數+1 ,相應的磁盤中的數據量也會+1,副本數過多,浪費磁盤 空間。

如上圖所示,source_vid_log_201801,為 3 分片 1 副本,三個主分片(帶 黑框)分布於三臺 data node 中。

副本分片也分布於不同的 data node 中 Elasticsearch 節點角色 Elasticsearch 節點角色分為三種, node.master、 node.data、 node.ingest, 每個 elasticsearch 節點可以擔任多重角色, 但是在生產環節中, 建議角色分離。

node.master:控制 Elasticsearch 集群,負責集群中的操作,比如創建/ 刪除一個索引,集群中的節點,分配分片到節點。

主節點處理集群的狀態並 廣播到其他節點,並接收其他節點的確認響應。

建議 master 節點不參與數據的 接收、處理和存儲,避免節點 oom 造成集群癱瘓。

node.master 默認開啟,在配 置文件中設置 node.master:false 關閉 node.data:存儲數據和倒排索引,進行搜索操作時,data node 接收到路 由節點的請求,在本節點查詢數據並做運算、排序,返回給路由節點。

elasticsearch 節點的元數據是存儲在各種 data node 上的。

data node 默認開 啟,在配置文件中設置 data node:false 關閉 node.ingest:數據轉換功能節點,通過定義管道,實現在索引之前對文檔 進行預處理。

一般來說這個節點角色很少用到。

node.ingest 默認開啟,在配置 文件中設置 node.ingest:false 關閉 Elasticsearch 還有一種角色 node.client,client 是作為數據接收、任務 分發、 返回結果, 是整個集群和外部通訊的中轉站。

每個節點都可以作為 client 使用,但是為了避免在聚合時造成節點宕機影響集群的使用,建議 client 節點 關閉上面三個角色。

集群 集群(cluster) :集群中有多個節點(node) ,其中有一個為主節點,這個 主節點是可以通過選舉產生的。

節點(node) :就是運行的 Elasticsearch 實例,一臺服務器可以部署多個 節點。

索引 (index) : ElasticSearch 將它的數據存儲在一個或多個索引 (index) 中。

用 SQL 領域的術語來類比,索引就像數據庫。

文 檔 ( document ) : 是 ElasticSearch 中 的 主 要 實 體 , 對 所 有 使 用 ElasticSearch 的案例來說, 他們最終都可以歸結為對文檔的搜索。

每一條數據, 就是一個 document。

3. Elasticsearch 的工作流 數據寫入 Client 接收數據,向 master 發出請求,master 根據相應的 template,建 立 index,這裏就涉及到 index 的 mapping、副本數、分片數以及分片分別在哪 些節點。

Client 就將數據路由到對應的節點上,寫入分片。

這裏是先寫入主分 片, 主分片寫入完成後再寫入副本分片。

寫入操作結束後, datanode 會向 client 返回結果,client 匯總後再返回給用戶。

如果 index 是已存在的,省略建 index 操作,其他同上 數據查詢 Client 接收到查詢請求,向 master 詢問查詢的 index 分片分布情況,得到 請求後, 就把查詢請求路由給各個 data node, datanode 在各自節點上進行查詢、 相關度評分、排序後,將數據返回給 client,client 將數據進行二次聚合、封 裝後,返回給用戶 4. Elasticsearch 常用配置參數 cluster.name: es52 #集群名 node.name: cloud001 #節點名 path.data: /data3/es52/data #數據路徑 path.: /data3/es52/log #日誌路徑 discovery.zen.ping_timeout: 30s 節點連接 ping 時長 discovery.zen.ping.unicast.hosts: [cloud001,cloud002,cloud003] 向 指定的主機發送單播請求 network.bind_host: 0.0.0.0 # 設置綁定的 ip 地址 network.publish_host: 192.168.23.76 #其它節點和該節點交互的 ip 地址 transport.tcp.port: 9300 #與其他節點通信的端口 gateway.recover_after_nodes: 3 #當節點啟動到三個的時候,啟動集群 gateway.expected_nodes: 3 # 當集群啟動到三個的時候,恢復數據 gateway.recover_after_time: 10m # 時間 10 分鐘

cluster.routing.allocation.disk.watermark.low: 90% #這表示磁盤的最 大使用; 此後,無法將其他碎片分配給該磁盤。

cluster.routing.allocation.disk.watermark.high: 10gb #這表示分配時 的最大使用量; 如果在分配時達到這一點,Elasticsearch 將把該碎片分配給另 一個磁盤 cluster.info.update.interval: 1m #這是磁盤用法,檢查兩個時間之間的 間隔。

bootstrap.system_call_filter: false #禁止系統檢測過濾器調用,因為 很多檢查項需要 Linux 3.5 以上的內核,管綜系統使用的系統為 centos6.8。

bootstrap.memory_lock: ture #鎖定內存,防止內存交換。

這裏因為管綜 系統用的是 centos6.8 。

必須設置為 false,才能啟動服務。

暫不設置 indices.breaker.fielddata.limit: 40% #當系統發現 fielddata 的數量達 到一定數量時會觸發內存回收.默認值是 JVM heap 的 70% indices.breaker.request.limit: 30% #這種斷路器是 elasticsearch 為了 防止 OOM(內存溢出),在每次請求數據時設定了一個固定的內存數量.默認值是 40% indices.queries.cache.size: 5% #查詢緩存的內存大小達到 heap 5%就起 用自動清理舊的緩存數據 indices.fielddata.cache.size: 50% #字段數據緩存的內存大小達到 heap 50%就起用自動清理舊的緩存數據 5. Elasticsearch 常用 api Elasticsearch 的 api 可以看做是其他數據庫的增刪改查命令。

下面所有示 例 均在 kibanadev tools 上執行。

POST/PUT POST/PUT 都可用於 index 和文檔的新增和更新操作,但 PUT 是冪等方法, POST 不是。

所以 PUT 用於更新、POST 用於新增比較合適。

例如 使用 POST 新建 index test 並插入一條數據。

--test(索引名) ,log (type) ,1(id) ,下面 json 格式的數據為一條 document。

POST test/log/1 {"first_name":"John",

Elasticsearch - 簡單介紹