摘要:注是開源項目,預(yù)先安裝和。一介紹是基于的開源搜索引擎,目前被認(rèn)為是最先進性能最好功能最全的搜索引擎。具體詳見這章分析器。由于最近在用多進程并發(fā)查詢的功能,當(dāng)請求數(shù)量在一段時間內(nèi)增加時,會有多個進程的響應(yīng)超時的問題。
注:ES是Java開源項目,預(yù)先安裝Jre和NodeJS。
一、介紹Elasticsearch是基于Apache Lucene的開源搜索引擎,目前被認(rèn)為是最先進、性能最好、功能最全的搜索引擎。
1、名詞分片:集群中節(jié)點存放文檔的地方,分片保存在不同節(jié)點可用于數(shù)據(jù)恢復(fù),每個分片占用的CPU、RAM、IO越高索引速度就越快
index(索引): 類似數(shù)據(jù)庫,多個索引就代表多個數(shù)據(jù)庫
type(類型): 類似表名
mapping :表結(jié)構(gòu)
doc(文檔):數(shù)據(jù),一條Json數(shù)據(jù)為一個文檔
ES Json :ES API請求模板,用于索引數(shù)據(jù),格式ES有嚴(yán)格規(guī)定(不同版本有區(qū)別)
filter(過濾):ES有倆種查詢模式,一是根據(jù)條件查詢(速度慢),二全部查詢后再條件過濾
aggs(聚合):類似數(shù)據(jù)庫的group by,可多個聚合嵌套使用
二、安裝配置以下為單節(jié)點配置:
1、下載 ES壓縮包,解壓到本地。
2、打開/ES/config/下 elasticsearch.yml
為了顯示整潔,去掉了注釋和沒使用的配置項
# ---------------------------------- Cluster ----------------------------------- cluster.name: elasticsearch #ES根據(jù)此名將節(jié)點放到集群中 # ------------------------------------ Node ------------------------------------ node.name: node-master #節(jié)點名稱,集群需更改!!! # ----------------------------------- Paths ------------------------------------ #path.data: /path/to/data #path.logs: /path/to/logs # ----------------------------------- Memory ----------------------------------- #bootstrap.memory_lock: true # ---------------------------------- Network ----------------------------------- network.host: 127.0.0.1 #節(jié)點綁定的ip transport.tcp.port: 9301 #集群需更改!!! http.port: 9401 #集群需更改!!! # --------------------------------- Discovery ---------------------------------- #discovery.zen.ping.unicast.hosts: ["host1", "host2"] #主節(jié)點列表 ##########Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):########## discovery.zen.minimum_master_nodes: 1 #至少1個主節(jié)點 # ---------------------------------- Gateway ----------------------------------- #gateway.recover_after_nodes: 3 # ---------------------------------- Various ----------------------------------- #action.destructive_requires_name: true1、命令
1、命令行到/ES/bin/下,運行 elasticsearch 或 elasticsearch -d 隱藏運行
2、非隱藏運行可使用 Ctrl+C 關(guān)閉。隱藏模式可使用 ps -ef | grep elastic 或 jps 查看進程號
3、當(dāng)集群中的節(jié)點出現(xiàn)紅色Unassigned,則檢查處理問題(節(jié)點狀態(tài)可使用下面的ES插件進行觀察等其它操作)
(1)查看集群相關(guān)信息
curl "localhost:9401/_nodes/process?pretty"
(2)找出 UNASSIGNED 相關(guān)信息
curl -XGET localhost:9401/_cat/shards|grep UNASSIGNED
(3)依次修改以上UNASSIGNED
curl -XPOST "localhost:9401/_cluster/reroute" -d "{ "commands" : [ { "allocate" : { "index" : "graylog_83", "shard" : 1, "node" : "Auq82gfGQVWgOBw6S7ajRQ", "allow_primary" : true } }] }"2、安裝ES監(jiān)控
1、下載開源項目 elasticsearch-head
2、進入到elasticsearch-head下,命令行 npm install grunt-cli 安裝grunt客戶端
3、在elasticsearch-head下打開Gruntfile.js
4、運行監(jiān)控插件及結(jié)果
三、ES Api 1、創(chuàng)建索引{ "student": { "properties": { "no": { "type": "string", "fielddata": true, "index": "analyzed" }, "name": { "type": "string", "index": "analyzed" }, "age": { "type": "integer" }, "birth": { "type": "date", "format": "yyyy-MM-dd" }, "isLeader": { "type": "boolean" } } } }
然后用REST方式調(diào)用ES接口創(chuàng)建索引和類型:
ES監(jiān)控插件上顯示:
2、bulk批處理bulk API 允許在單個步驟中進行多次 create 、 index 、 update 或 delete 請求。
curl -XPOST "http://172.16.13.4:9401/_bulk?pretty" -d " {"delete": {"_index": "megacorp", "_type": "employee", "_id": "2"}} {"create": {"_index": "megacorp", "_type": "employee", "_id": "2"}} {"name": "first"} {"index": {"_index": "megacorp", "_type": "employee"}}3、ES分析器
分析器包括三個功能:字符過濾器(過濾掉HTML,特殊符號轉(zhuǎn)換)、分詞器也叫分析器(標(biāo)準(zhǔn)分析器、簡單、空格、語言分析器)、token過濾器(刪除改變無用詞)。具體詳見這章 ES分析器。
四、ES集群配置很簡單就不做詳細說明了,原理跟redis集群差不多,判斷節(jié)點超時、投票選取主節(jié)點。
#####################################主節(jié)點1##################################### # ---------------------------------- Cluster ----------------------------------- cluster.name: alex-es # ------------------------------------ Node ------------------------------------ node.name: node1 node.master: true node.data: true # ----------------------------------- Path ------------------------------------ path.data: /path/to/data path.logs: /path/to/logs # ----------------------------------- Memory ----------------------------------- bootstrap.memory_lock: true # ---------------------------------- Network ----------------------------------- network.host: 172.16.13.4 transport.tcp.port: 9301 transport.tcp.compress: true http.port: 9401 http.max_content_length: 100mb http.enabled: true http.cors.enabled: true http.cors.allow-origin: "*" # --------------------------------- Discovery ---------------------------------- discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"] # ---------------------------------- Gateway ----------------------------------- gateway.recover_after_nodes: 3 gateway.recover_after_time: 5m gateway.expected_nodes: 3
#####################################主節(jié)點2##################################### # ---------------------------------- Cluster ----------------------------------- cluster.name: alex-es # ------------------------------------ Node ------------------------------------ node.name: node2 node.master: true node.data: true # ----------------------------------- Path ------------------------------------ path.data: /path/to/data2 path.logs: /path/to/logs2 # ----------------------------------- Memory ----------------------------------- bootstrap.memory_lock: true # ---------------------------------- Network ----------------------------------- network.host: 172.16.13.4 transport.tcp.port: 9302 transport.tcp.compress: true http.port: 9402 http.max_content_length: 100mb http.enabled: true http.cors.enabled: true http.cors.allow-origin: "*" # --------------------------------- Discovery ---------------------------------- discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"] # ---------------------------------- Gateway ----------------------------------- gateway.recover_after_nodes: 3 gateway.recover_after_time: 5m gateway.expected_nodes: 3
#####################################子節(jié)點###################################### # ---------------------------------- Cluster ----------------------------------- cluster.name: alex-es # ------------------------------------ Node ------------------------------------ node.name: node3 node.master: false node.data: true # ----------------------------------- Path ------------------------------------ path.data: /path/to/data3 path.logs: /path/to/logs3 # ----------------------------------- Memory ----------------------------------- bootstrap.memory_lock: true # ---------------------------------- Network ----------------------------------- network.host: 172.16.13.4 transport.tcp.port: 9303 transport.tcp.compress: true http.port: 9403 http.max_content_length: 100mb http.enabled: true http.cors.enabled: true http.cors.allow-origin: "*" # --------------------------------- Discovery ---------------------------------- discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"] # ---------------------------------- Gateway ----------------------------------- gateway.recover_after_nodes: 3 gateway.recover_after_time: 5m gateway.expected_nodes: 3
以上配置信息不能包含空格,配置好后,全部啟動,在ES-head上監(jiān)控顯示:
五、ES客戶端問題官方提供了基于Python、Java等語言的客戶端,其中實現(xiàn)了對es連接池輪訓(xùn)、查詢、索引、批量等操作。
由于最近在用多進程并發(fā)查詢es的功能,當(dāng)請求數(shù)量在一段時間內(nèi)增加時,會有多個進程的響應(yīng)超時的問題。
經(jīng)過調(diào)查,已排查掉以下可能存在的問題:
1、Java GC機制問題(包括并發(fā)GC、FullGC、GCone等),因為根據(jù)GC的機制不同,會影響es的性能 2、es隊列大小 3、進程池,基本上是同一時間異步調(diào)用es查詢,所以這個不存在問題 4、CPU內(nèi)存及es配置優(yōu)化等
最后在服務(wù)器上抓包發(fā)現(xiàn),部分請求要經(jīng)過一定時間才能傳到es上,而且隨著請求數(shù)量加大,時間間隔有遞增趨勢,這樣問題就定位在es客戶端發(fā)送請求那。
經(jīng)過一番研究,可能是es客戶端所采用的傳輸協(xié)議會導(dǎo)致請求時間延長,最后決定用Python的 pycurl 來代替es客戶端,下面是代碼,可以自己實現(xiàn)es輪訓(xùn):
import pycurl import StringIO import random def es_pool(): return ["ip:port", "ip:port"] # curl請求 def curl_req(index="", rtype="", body=""): s = StringIO.StringIO() c = pycurl.Curl() es_hosts = es_pool() host = es_hosts[random.randint(0, len(es_hosts)) % len(es_hosts)] # 根據(jù)es池大小隨機選擇 url = host + "/" + index + "/" + rtype + "/_search" c.setopt(pycurl.URL, url) c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, body) c.setopt(pycurl.WRITEFUNCTION, s.write) c.perform() c.close() return s.getvalue()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/35817.html
摘要:本文,我們將比較業(yè)界兩個最流行的開源搜索引擎,和。關(guān)于基于業(yè)界大名鼎鼎的開源搜索引擎,更多的是一個軟件包,還不能稱之為搜索引擎,而則完成對的封裝,是一個真正意義上的搜索引擎框架。 當(dāng)前是云計算和數(shù)據(jù)快速增長的時代,今天的應(yīng)用程序正以PB級和ZB級的速度生產(chǎn)數(shù)據(jù),但人們依然在不停的追求更高更快的性能需求。隨著數(shù)據(jù)的堆積,如何快速有效的搜索這些數(shù)據(jù),成為對后端服務(wù)的挑戰(zhàn)。本文,我們將比較業(yè)...
摘要:為了方便調(diào)試,可以修改文件,加入以下兩行安裝中文分詞插件原裝分詞器會簡單地拆分每個漢字,沒有根據(jù)詞庫來分詞,這樣的后果就是搜索結(jié)果很可能不是你想要的。原文鏈接參考資料權(quán)威指南為你的站點插上的翅膀安裝中文分詞中的簡介使用實現(xiàn)博客站內(nèi)搜索 Elasticsearch是一個基于Apache Lucene(TM)的開源搜索引擎。無論在開源還是專有領(lǐng)域,Lucene可以被認(rèn)為是迄今為止最先進、...
摘要:建立在之上,它是一個高性能的文本搜索引擎庫。目錄在今天的課程中,您將學(xué)習(xí)如何使用,和構(gòu)建實時搜索引擎。接下來,您需要安裝實時搜索引擎所需的庫。這是的官方庫,它是實時搜索的引擎。主要的搜索查詢包含在查詢對象中。但是,可以從客戶端進行搜索。 (譯者注:相關(guān)閱讀:node.js,vue.js,Elasticsearch) 介紹 Elasticsearch是一個分布式的RESTful搜索和分析...
摘要:建立在之上,它是一個高性能的文本搜索引擎庫。目錄在今天的課程中,您將學(xué)習(xí)如何使用,和構(gòu)建實時搜索引擎。接下來,您需要安裝實時搜索引擎所需的庫。這是的官方庫,它是實時搜索的引擎。主要的搜索查詢包含在查詢對象中。但是,可以從客戶端進行搜索。 (譯者注:相關(guān)閱讀:node.js,vue.js,Elasticsearch) 介紹 Elasticsearch是一個分布式的RESTful搜索和分析...
閱讀 3965·2021-10-09 09:43
閱讀 2878·2021-10-08 10:05
閱讀 2737·2021-09-08 10:44
閱讀 887·2019-08-30 15:52
閱讀 2815·2019-08-26 17:01
閱讀 3021·2019-08-26 13:54
閱讀 1655·2019-08-26 10:48
閱讀 814·2019-08-23 14:41