1. 程式人生 > >elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、集成Ikanalyzer)

elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、集成Ikanalyzer)

ins 表示 吞吐量 search 工作 use art tcp傳輸 .net

一、ES簡介

1. ES是什麽?

Elasticsearch 是一個開源的搜索引擎,建立在全文搜索引擎庫 Apache Lucene 基礎之上

用 Java 編寫的,它的內部使用 Lucene 做索引與搜索,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的復雜性,取而代之的提供一套簡單一致的 RESTful API

Elasticsearch 不僅僅只是一個全文搜索引擎。 它可以被下面這樣準確的形容:

一個分布式的實時文檔存儲,每個字段可以被索引與搜索——作數據庫用

一個分布式實時分析搜索引擎

能勝任上百個服務節點的擴展,並支持 PB 級別的結構化或者非結構化數據

2. ES的誕生

原文鏈接:https://www.elastic.co/guide/cn/elasticsearch/guide/current/intro.html

技術分享圖片

3. ES的發展歷程

Elasticsearch 後來作為一家公司(Elastic公司)進行運作,定位為數據搜索和分析平臺。在2014年6月獲得7000萬美元融資,累積融資過億美元。

ES現在可以與Java、Ruby、Python、PHP、Perl、.NET等多種客戶端集成。也可與Hadoop、Spark等大數據分析平臺進行集成,功能十分強大。

基於Elasticsearch衍生出了一系列開源軟件,統稱為 Elatic Stack

技術分享圖片

說明:

因為logstash比較耗內存,所以用Beats來替代

為避免版本混亂,從5.0開始,Elastic公司將各組件的版本號統一。使用時,各組件版本號應一致(版本號形式:x.y.z,z可以不同)。

4. ES的特性

官網的介紹: https://www.elastic.co/cn/products/elasticsearch

速度快、易擴展、彈性、靈活、操作簡單、多語言客戶端、X-Pack、hadoop/spark強強聯手、開箱即用。

分布式:橫向擴展非常靈活
全文檢索:基於lucene的強大的全文檢索能力;
近實時搜索和分析:數據進入ES,可達到近實時搜索,還可進行聚合分析
高可用:容錯機制,自動發現新的或失敗的節點,重組和重新平衡數據
模式自由:ES的動態mapping機制可以自動檢測數據的結構和類型,創建索引並使數據可搜索。
RESTful API:

JSON + HTTP

5. ES的應用場景

技術分享圖片

6. ES的架構

技術分享圖片

說明:

Gateway是ES用來存儲索引的文件系統,支持多種類型。
Gateway的上層是一個分布式的lucene框架。
Lucene之上是ES的模塊,包括:索引模塊、搜索模塊、映射解析模塊等
ES模塊之上是 Discovery、Scripting和第三方插件。Discovery是ES的節點發現模塊,不同機器上的ES節點要組成集群需要進行消息通信,集群內部需要選舉master節點,這些工作都是由Discovery模塊完成。支持多種發現機制,如 Zen 、EC2、gce、Azure。Scripting用來支持在查詢語句中插入javascript、python等腳本語言,scripting模塊負責解析這些腳本,使用腳本語句性能稍低。ES也支持多種第三方插件。
再上層是ES的傳輸模塊和JMX.傳輸模塊支持多種傳輸協議,如 Thrift、memecached、http,默認使用http。JMX是java的管理框架,用來管理ES應用。
最上層是ES提供給用戶的接口,可以通過RESTful接口和ES集群進行交互。

7. ES的核心概念

Near Realtime(NRT) 近實時。數據提交索引後,立馬就可以搜索到。
Cluster 集群,一個集群由一個唯一的名字標識,默認為“elasticsearch”。集群名稱非常重要,具有相同集群名的節點才會組成一個集群。集群名稱可以在配置文件中指定。
Node 節點:存儲集群的數據,參與集群的索引和搜索功能。像集群有名字,節點也有自己的名稱,默認在啟動時會以一個隨機的UUID的前七個字符作為節點的名字,你可以為其指定任意的名字。通過集群名在網絡中發現同伴組成集群。一個節點也可是集群。
Index 索引: 一個索引是一個文檔的集合(等同於solr中的集合)。每個索引有唯一的名字,通過這個名字來操作它。一個集群中可以有任意多個索引。
Type 類型:指在一個索引中,可以索引不同類型的文檔,如用戶數據、博客數據。從6.0.0 版本起已廢棄,一個索引中只存放一類數據。
Document 文檔:被索引的一條數據,索引的基本信息單元,以JSON格式來表示。
Shard 分片:在創建一個索引時可以指定分成多少個分片來存儲。每個分片本身也是一個功能完善且獨立的“索引”,可以被放置在集群的任意節點上。分片的好處:
允許我們水平切分/擴展容量
可在多個分片上進行分布式的、並行的操作,提高系統的性能和吞吐量。

註意:分片數創建索引時指定,創建後不可改了。備份數可以隨時改。
Replication 備份: 一個分片可以有多個備份(副本)。備份的好處:
高可用。一個主分片掛了,副本分片就頂上去
擴展搜索的並發能力、吞吐量。搜索可以在所有的副本上並行運行。-高並發下副本也可搜索

8. 為了方便理解,作一個ES和數據庫的對比

技術分享圖片

9. ES學習資源

官網的文檔是最好的學習資源,詳細、全面,官網還提供有一些視頻:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

官網中還提供一個中文的權威指南,可以學習,(版本稍老了點是基於2.0的):
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

二、安裝&配置

1. ES安裝包

官網下載地址: https://www.elastic.co/downloads/elasticsearch

2. JDK要求

JDK版本: 1.8

3. 在linux上安裝示例

註意:ES不能以root用戶身份運行 確保運行用戶對各使用到的目錄的權限

3.1 獲取安裝包

版本 6.2.4

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz

3.2 解壓到安裝目錄

tar -xvf elasticsearch-6.2.4.tar.gz -C /opt

3.3 配置
3.4 啟動

cd  /opt/elasticsearch-6.2.4/bin
./elasticsearch

啟動時指定參數:

./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name

了解啟動腳本可用選項:

./elasticsearch -h

4. 在linux 虛擬機上運行可能的失敗問題

4.1 內存不夠用,默認es配置使用1G堆內存,如果的你學習用的虛擬機沒有這麽大的內存,請在config/jvm.options中調整

技術分享圖片

4.2 可能會報如下的錯誤:

技術分享圖片

解決方法如下:

問題一:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
解決:修改切換到root用戶修改配置limits.conf 添加下面兩行
命令:vi /etc/security/limits.conf
* hard nofile 65536
* soft nofile 65536

問題二:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解決:切換到root用戶,進入limits.d目錄下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下內容:
* soft nproc 1024
#修改為
* soft nproc 2048

問題三:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解決:切換到root用戶修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360

並執行命令:
sysctl -p

切換到es的用戶。
然後,重新啟動elasticsearch,即可啟動成功。

5. ES端口說明

9200 對外服務的http 端口

9300 節點間通信的tcp端口

6. 後臺運行ES

使用守護進程運行:./elasticsearch -d

7. 關閉ES

非後臺運行的:ctrl + c
後臺運行的(守護進程運行):kill es進程

8. 在windows中啟動

elasticsearch .bat

啟動以後訪問地址:http://localhost:9200/

技術分享圖片

9. ES軟件目錄說明

技術分享圖片

10. ES 配置說明

10.1 配置文件分離

配置文件目錄默認為:$ES_HOME/config,如果需要配置文件與軟件分離(方便升級),可以通過 ES_PATH_CONF 環境變量來指定。如你可以在命令行指定聲明:

技術分享圖片

10.2 yml 格式說明

技術分享圖片

10.3 Jvm參數格式說明

技術分享圖片

11. ES 重要的配置參數

11.1 數據目錄和日誌目錄,生成環境下應與軟件分離

技術分享圖片

11.2 所屬的集群名,默認為 elasticsearch ,可自定義

技術分享圖片

11.3 節點名,默認為 UUID前7個字符,可自定義

技術分享圖片

以主機名作節點名:

技術分享圖片

11.4 network.host IP綁定

默認綁定的是["127.0.0.1", "[::1]"]回環地址,集群下要服務間通信,需綁定一個ipv4或ipv6地址

技術分享圖片

11.5 http.port: 9200-9300

對外服務的http 端口, 默認 9200-9300 。可以為它指定一個值或一個區間,當為區間時會取用區間第一個可用的端口。

11.6 transport.tcp.port: 9300-9400

節點間交互的端口, 默認 9300-9400 。可以為它指定一個值或一個區間,當為區間時會取用區間第一個可用的端口。

11.7 Discovery Config 節點發現配置

ES中默認采用的節點發現方式是 zen(基於組播(多播)、單播)。在應用於生產前有兩個重要參數需配置:

discovery.zen.ping.unicast.hosts: ["host1","host2:port","host3[portX-portY]"] 單播模式下,設置具有master資格的節點列表,新加入的節點向這個列表中的節點發送請求來加入集群

discovery.zen.minimum_master_nodes: 1 這個參數控制的是,一個節點需要看到具有master資格的節點的最小數量,然後才能在集群中做操作。官方的推薦值是(N/2)+1,其中N是具有master資格的節點的數量。

11.8 Jvm heap 大小設置

生產環境中一定要在jvm.options中調大它的jvm內存。

技術分享圖片

11.9 JVM heap dump path 設置

生產環境中指定當發生OOM異常時,heap的dump path,好分析問題。在jvm.options中配置:

-XX:HeapDumpPath=/var/lib/elasticsearch

11.10 其他配置

transport.tcp.compress: false
    是否壓縮tcp傳輸的數據,默認false
http.cors.enabled: true
    是否使用http協議對外提供服務,默認true
http.max_content_length: 100mb
    http傳輸內容的最大容量,默認100mb
node.master: true   
    指定該節點是否可以作為master節點,默認是true。ES集群默認是以第一個節點為master,如果該節點出故障就會重新選舉master。
node.data: true
    該節點是否存索引數據,默認true。
discover.zen.ping.timeout: 3s
    設置集群中自動發現其他節點時ping連接超時時長,默認為3秒。在網絡環境較差的情況下,增加這個值,會增加節點等待響應的時間,從一定程度上會減少誤判。
discovery.zen.ping.multicast.enabled: false
    是否啟用多播來發現節點。

12. 安裝Kibana

Kibana是ES的可視化管理工具

12.1 下載安裝包

一定和ES的版本一致( 6.2.4)

https://www.elastic.co/downloads/kibana

12.2 安裝

解壓到安裝目錄即可

12.3 配置

在config/kibana.yml中配置 elasticsearch.url的值為 ES的訪問地址

技術分享圖片

12.4 啟動

./bin/kibana

訪問地址:http://localhost:5601

技術分享圖片

三、集成Ikanalyzer

1. 獲取 ES-IKAnalyzer插件

一定和ES的版本一致( 6.2.4)

地址: https://github.com/medcl/elasticsearch-analysis-ik/releases

技術分享圖片

2. 安裝插件

將 ik 的壓縮包解壓到 ES安裝目錄的plugins/目錄下(最好把解出的目錄名改一下,防止安裝別的插件時同名沖突),然後重啟ES。

技術分享圖片

3. 擴展詞庫

配置文件config/IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 擴展配置</comment>
    <!--用戶可以在這裏配置自己的擴展字典 -->
    <entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
     <!--用戶可以在這裏配置自己的擴展停止詞字典-->
    <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
    <!--用戶可以在這裏配置遠程擴展字典 遠程詞庫,可熱更新,在一處地方維護-->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用戶可以在這裏配置遠程擴展停止詞字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

4. 測試 IK

1、創建一個索引

curl -XPUT http://localhost:9200/index

技術分享圖片

2、創建一個映射mapping

curl -XPOST http://localhost:9200/index/fulltext/_mapping -H ‘Content-Type:application/json‘ -d‘
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }
}‘

技術分享圖片

3、索引一些文檔

curl -XPOST http://localhost:9200/index/fulltext/1 -H ‘Content-Type:application/json‘ -d‘ {"content":"美國留給伊拉克的是個爛攤子嗎"}‘

技術分享圖片

curl -XPOST http://localhost:9200/index/fulltext/2 -H ‘Content-Type:application/json‘ -d‘ {"content":"公安部:各地校車將享最高路權"}‘

技術分享圖片

curl -XPOST http://localhost:9200/index/fulltext/3 -H ‘Content-Type:application/json‘ -d‘ {"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}‘

技術分享圖片

四、總結

安裝的ES、Kibana和中文分詞器的版本一定要一致,否則會不能使用

elasticsearch系列一:elasticsearch(ES簡介、安裝&配置、集成Ikanalyzer)