Elasticsearch集羣搭建

Elasticsearch單機版安裝:http://www.javashuo.com/article/p-ojobhgzk-bk.htmlhtml

一、Elasticsearch集羣版安裝,這裏進行模擬,是僞集羣版的安裝,我使用一臺機器,經過修改端口號的方式進行僞集羣的搭建。java

注意:因爲單機版的安裝過程當中出現了各類錯誤,因此集羣版我是直接複製修改好的單機版的(注意:home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data裏面有一個nodes文件夾,將該文件夾刪除便可,下面也會說起)。我沒有再次經過解壓縮安裝包的方式,由於單機版報了很多錯誤,因此用解決完錯誤的更快些。node

Elasticsearch集羣版的搭建,是一主二從的方式,即一個master主節點,兩個slaver從節點。(備註,我第一次搭建的做爲了主節點了,請自行腦補)。linux

我這裏先建立一個el_slave文件夾,而後將第一次單機版的Elasticsearch複製兩份,備用。web

 1 [elsearch@slaver4 soft]$ mkdir el_slave
 2 [elsearch@slaver4 soft]$ ls
 3 elasticsearch-5.4.3  elasticsearch-head-master  el_slave  node-v8.16.2-linux-x64
 4 [elsearch@slaver4 soft]$ cp -r elasticsearch-5.4.3/ el_slave/
 5 [elsearch@slaver4 soft]$ ls
 6 elasticsearch-5.4.3  elasticsearch-head-master  el_slave  node-v8.16.2-linux-x64
 7 [elsearch@slaver4 soft]$ cd el_slave/
 8 [elsearch@slaver4 el_slave]$ ls
 9 elasticsearch-5.4.3
10 [elsearch@slaver4 el_slave]$ mv elasticsearch-5.4.3/ elasticsearch-5.4.3-slaver1
11 [elsearch@slaver4 el_slave]$ cp -r elasticsearch-5.4.3-slaver1/ elasticsearch-5.4.3-slaver2
12 [elsearch@slaver4 el_slave]$ ls
13 elasticsearch-5.4.3-slaver1  elasticsearch-5.4.3-slaver2
14 [elsearch@slaver4 el_slave]$

二、開始zao起來,修改主節點的配置文件/home/hadoop/soft/elasticsearch-5.4.3/config/elasticsearch.yml。添加以下所示的內容。正則表達式

1 # 指定集羣的名稱
2 cluster.name: biehl01
3 # 給master起一個名稱,叫master
4 node.name: master
5 # 告訴此節點,它就是master
6 node.master: true
7 # 綁定的ip地址和默認端口號9200
8 network.host: 192.168.110.133

操做以下所示:數據庫

修改主節點配置文件,之後重啓一下elasticsearch,查看效果,以下所示:編程

三、主節點修改,完畢開始修改從節點的配置文件,修改內容以下所示:json

 1 # 從節點cluster.name要和master主節點的名稱要保持一致
 2 cluster.name: biehl01
 3 # 從節點起一個名稱
 4 node.name: slave1
 5 # 綁定的ip地址
 6 network.host: 192.168.110.133
 7 # 修改默認的端口號,默認9200
 8 http.port: 8200
 9 
10 # 找到master主節點
11 discovery.zen.ping.unicast.hosts: ["192.168.110.133"]

從節點一配置以下所示:bootstrap

從節點二配置文件裏面添加以下所示內容:

 1 # 從節點cluster.name要和master主節點的名稱要保持一致
 2 cluster.name: biehl01
 3 # # 從節點起一個名稱
 4 node.name: slave2
 5 # # 綁定的ip地址
 6 network.host: 192.168.110.133
 7 # # 修改默認的端口號,默認9200
 8 http.port: 7200
 9 #
10 # # 找到master主節點,discovery.zen.minimum_master_nodes的值計算是節點總數/2 + 1(三個節點就是寫2便可)
11 # discovery.zen.minimum_master_nodes: 2
12 discovery.zen.ping.unicast.hosts: ["192.168.110.133"]

從節點二配置以下所示:

修改完畢,主節點,從節點一二,開始啓動,三個節點,發現本身有點單蠢了呢。開始三個節點後臺啓動,使用jps顯示三個進程,可是界面就是顯示不了從節點一二,主要形成這個的緣由是我複製了主節點,而後分析一下緣由,我前臺啓動,發現報錯了,錯誤以下所示:

1 # 主節點的報錯
2 [master] failed to send join request to master [{slave1}{rYUCm8sMRzaXu84zRj3duQ}{qL5ICfOKQKyDTaRytL5vGg}{192.168.110.133}{192.168.110.133:9301}], reason [RemoteTransportException[[slave1][192.168.110.133:9301][internal:discovery/zen/join]]; nested: NotMasterException[Node [{slave1}{rYUCm8sMRzaXu84zRj3duQ}{qL5ICfOKQKyDTaRytL5vGg}{192.168.110.133}{192.168.110.133:9301}] not master for join request]; ], tried [3] times
3 
4 # 從節點的報錯
5 [slave1] failed to send join request to master [{slave2}{rYUCm8sMRzaXu84zRj3duQ}{jY1TxxwdSkaZkQqdsNTGaQ}{192.168.110.133}{192.168.110.133:9302}], reason [RemoteTransportException[[slave2][192.168.110.133:9302][internal:discovery/zen/join]]; nested: NotMasterException[Node [{slave2}{rYUCm8sMRzaXu84zRj3duQ}{jY1TxxwdSkaZkQqdsNTGaQ}{192.168.110.133}{192.168.110.133:9302}] not master for join request]; ], tried [3] times

錯誤緣由:每一個節點索引分片的分配在每新增一個節點都要從新進行一次分配。

在home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data裏面有一個nodes文件夾,將該文件夾刪除便可。而後重啓從節點一,從節點二,問題解決。

1 [elsearch@slaver4 elasticsearch-5.4.3-slaver1]$ ls
2 bin  config  data  hs_err_pid11491.log  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.textile
3 [elsearch@slaver4 elasticsearch-5.4.3-slaver1]$ cd data/
4 [elsearch@slaver4 data]$ ls
5 nodes
6 [elsearch@slaver4 data]$ rm -rf nodes/
7 [elsearch@slaver4 data]$ ls
1 [elsearch@slaver4 elasticsearch-5.4.3-slaver2]$ ls
2 bin  config  data  hs_err_pid11491.log  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.textile
3 [elsearch@slaver4 elasticsearch-5.4.3-slaver2]$ cd data/
4 [elsearch@slaver4 data]$ ls
5 nodes
6 [elsearch@slaver4 data]$ rm -rf nodes/
7 [elsearch@slaver4 data]$ ls

從新啓動三個節點,啓動之後以下所示:

注意:elasticsearch 集羣搭建起來,爲何head只顯示master?(爲何我啓動三個es後 head中只顯示了一個master節點)。這種問題,我估計就是本身是複製的主節點的,須要將home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data/nodes,這個nodes文件夾刪除,從新生成,我是這樣操做的。

Elasticsearch-head插件的web界面效果以下所示:

至此,ElasticSearch的集羣版就已經搭建完畢了。ElasticSearch集羣的搭建可使用更多的參數。你能夠經過新增更多的參數配置,來實驗ElasticSearch集羣版的搭建。

  1 # ======================== Elasticsearch Configuration =========================
  2 #
  3 # NOTE: Elasticsearch comes with reasonable defaults for most settings.
  4 #       Before you set out to tweak and tune the configuration, make sure you
  5 #       understand what are you trying to accomplish and the consequences.
  6 #
  7 # The primary way of configuring a node is via this file. This template lists
  8 # the most important settings you may want to configure for a production cluster.
  9 #
 10 # Please consult the documentation for further information on configuration options:
 11 # https://www.elastic.co/guide/en/elasticsearch/reference/index.html
 12 #
 13 # ---------------------------------- Cluster -----------------------------------
 14 #
 15 # Use a descriptive name for your cluster:
 16 #
 17 
 18 # 1、修改這裏,是修改集羣的名稱,若是想將節點加入到集羣中,全部節點都必須是這個名稱的。
 19 # cluster.name: my-application
 20 
 21 
 22 #
 23 # ------------------------------------ Node ------------------------------------
 24 #
 25 # Use a descriptive name for the node:
 26 #
 27 
 28 # 2、給節點起一個名稱。默認node-1
 29 #node.name: node-1
 30 
 31 
 32 #
 33 # Add custom attributes to the node:
 34 #
 35 #node.attr.rack: r1
 36 #
 37 # ----------------------------------- Paths ------------------------------------
 38 #
 39 # Path to directory where to store the data (separate multiple locations by comma):
 40 #
 41 
 42 # 3、path.data是存儲的數據的路徑
 43 #path.data: /path/to/data
 44 
 45 
 46 #
 47 # Path to log files:
 48 #
 49 
 50 # 4、path.logs是es運行產生的日誌文件,
 51 #path.logs: /path/to/logs
 52 
 53 
 54 #
 55 # ----------------------------------- Memory -----------------------------------
 56 #
 57 # Lock the memory on startup:
 58 #
 59 #bootstrap.memory_lock: true
 60 #
 61 # Make sure that the heap size is set to about half the memory available
 62 # on the system and that the owner of the process is allowed to use this
 63 # limit.
 64 #
 65 # Elasticsearch performs poorly when the system is swapping the memory.
 66 #
 67 # ---------------------------------- Network -----------------------------------
 68 #
 69 # Set the bind address to a specific IP (IPv4 or IPv6):
 70 #
 71 #network.host: 192.168.0.1
 72 
 73 # 5、綁定的ip地址和默認端口號9200
 74 # network.host: 0.0.0.0
 75 
 76 
 77 
 78 # 下面這些配置是我本身加的,上面或者下面標數字的都是默認的。
 79 
 80 # 是否支持跨域
 81 http.cors.enabled: true
 82 #
 83 # *表示支持全部域名
 84 http.cors.allow-origin: "*"
 85 
 86 # 指定集羣的名稱
 87 cluster.name: biehl01
 88 # 給master起一個名稱,叫master
 89 node.name: master
 90 # 告訴此節點,它就是master
 91 node.master: true
 92 # 綁定的ip地址和默認端口號9200
 93 network.host: 192.168.110.133
 94 
 95 discovery.zen.minimum_master_nodes: 2
 96 discovery.zen.ping.unicast.hosts: ["192.168.110.133"]
 97 
 98 
 99 #
100 # Set a custom port for HTTP:
101 #
102 
103 # 6、默認端口號是9200的。
104 # http.port: 9200
105 
106 
107  
108 # 7、Discovery服務發現,配置集羣的話,是須要進行修改的。
109 
110 
111 #
112 # For more information, consult the network module documentation.
113 #
114 # --------------------------------- Discovery ----------------------------------
115 #
116 # Pass an initial list of hosts to perform discovery when new node is started:
117 # The default list of hosts is ["127.0.0.1", "[::1]"]
118 #
119 
120 # 8、集羣裏面的節點都須要加到裏面,若是是僞集羣的話,可使用ip:端口號或者主機名稱的形式加進去的,若是是非僞集羣,能夠直接使用ip:port或者主機名稱加進去。
121 # 注意,這裏面加的主機節點,是有機會進行選舉主節點的,其餘未加進去,沒有機會進行選擇主節點的機會的。
122 #discovery.zen.ping.unicast.hosts: ["host1", "host2"]
123 #
124 # Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
125 #
126 
127 # 9、主節點數/ 2 + 1,此值是這樣計算的,上面的註釋也說明了。此值是爲了阻止沒有節點作主節點或者都作子節點的狀況發生。避免出現腦裂。
128 # 默認值是3,這樣才能夠選出主節點的。那麼這就須要注意了,你的主節點數至少是4的,否則沒法正常選舉。經過配置這個參數來防止集羣腦裂現象 (集羣總節點數量/2)+1
129 #discovery.zen.minimum_master_nodes: 3
130 
131 
132 #
133 # For more information, consult the zen discovery module documentation.
134 #
135 
136 
137 
138 # ---------------------------------- Gateway -----------------------------------
139 #
140 # Block initial recovery after a full cluster restart until N nodes are started:
141 #
142 #gateway.recover_after_nodes: 3
143 #
144 # For more information, consult the gateway module documentation.
145 #
146 # ---------------------------------- Various -----------------------------------
147 #
148 # Require explicit names when deleting indices:
149 #
150 #action.destructive_requires_name: true

四、elasticsearch的基礎概念總結:

  1)、elasticsearch集羣:elasticsearch集羣是由一個或者多個節點組成的集合。每個集羣都有一個惟一的名稱。默認是elasticsearch,咱們能夠本身設置的cluster_name的值,cluster_name的值很是重要,一個節點就是經過集羣的名稱加入集羣的。而後,每個節點都有本身的名稱。節點是能夠存儲數據,參與集羣索引數據,以及搜索數據的獨立服務。
  2)、索引,是含有相同屬性的文檔集合。

  3)、類型,索引能夠定義一個或者多個類型,文檔必須屬於一個類型。

  4)、文檔,文檔是能夠被索引的基本數據單位。索引在elasticsearch中是經過一個名稱來識別的,必須是英文字母小寫的,且不含中劃線的,咱們經過這個索引來對文檔進行增刪查改的操做。
  5)、索引、類型、文檔之間的關係,索引至關於數據庫裏面的database即數據庫,類型至關於數據庫裏面的table即數據表,文檔至關於數據庫SQL裏面的一行記錄。
  6)、分片,每一個索引都有多個分片,每一個分片是一個Lucene索引。

  7)、備份,拷貝一份分片就完成了分片的備份。

  注意:elasticsearch在建立索引的時候,默認建立5個分片,一份備份,這個數據能夠進行修改。分片的數量只能在建立索引的時候進行指定,不能在後期進行修改,備份能夠進行動態修改的。

五、Elasticsearch的基本用法,基本操做,基本使用。

  elasticsearch是以RESTFul api風格來命名本身的api的。api的基本格式,http://<ip地址>:<port端口號>/<索引>/<類型>/<文檔id>
  注意:api的url裏面的元素基本都是elasticsearch的基本概念都是名詞,elasticsearch的動做都是經常使用http動詞get/put/post/delete來決定的。

六、索引的建立分爲非結構化建立("mappings": { }的json格式值是空的)、結構化建立("mappings": { }的json格式值非空的)。

  1)、建立非結構化索引,操做以下所示(注意:這裏使用head插件進行建立非結構化索引的哦):

建立完畢之後能夠看到一個彈出框,表示建立成功了。

建立的索引,在概覽能夠看到本身建立的索引了,student是建立的索引的名稱(切記,索引名稱小寫,不能夠出現中劃線)。每個方框就是elasticsearch的分片,粗線方框是es的主分片,主分片旁邊細線方框是es的備份分片,對應關係,粗線方框0的備份分片是細線方框0。依次類推。

   2)、建立非結構化索引,操做以下所示(注意:這裏使用head插件進行建立結構化索引的哦):

查看建立的結構化索引,以下所示(修改了記得點擊刷新哦):

postman是一個擁有可視化界面的http模擬器,能夠驗證json結構。以前介紹過,這裏簡單使用一下。

如今查看一下新建立的索引,以下所示:

七、es的索引建立完畢之後就能夠進行es的數據插入。插入分爲指定文檔id插入和自動產生文檔id插入。文檔id是什麼呢,文檔id是一個惟一索引值,指向咱們的文檔數據。

在head插件概覽裏面查看docs的變化,docs表明了該索引下全部文檔的數量值。

在head插件的數據瀏覽能夠看到剛纔插入的一條數據的。

如何讓es自動指定文檔id呢。以下所示:

本身能夠去head插件的概述和數據瀏覽進行查看,這裏僅展現了數據瀏覽的數據。以下所示:

八、修改Elasticsearch的文檔數據。分爲直接修改文檔、經過腳本修改文檔。

這種經過指定文檔id進行直接修改的效果以下所示:

經過腳本修改文檔。操做以下所示:

不一樣的方式,請求成功之後本身使用head查看效果便可。

九、刪除Elasticsearch的文檔、刪除Elasticsearch的索引。

刪除之後發現數據已經被刪除了。

如何刪除一個索引呢,能夠直接使用head插件進行刪除便可。也可使用請求刪除索引。

使用postman的http請求刪除索引,以下所示(注意:刪除索引,是高危操做,索引刪除,其下的數據也將所有刪除):

十、Elasticsearch的查詢,分爲簡單查詢,條件查詢,聚合查詢。(注意:Elasticsearch的查詢纔是重中之重哦!)。

Elasticsearch的條件查詢以下所示:

如何對Elasticsearch查詢進行關鍵詞的查詢。查詢出的數據順序,以_score字段進行默認倒排的。

查詢出的數據順序,以_score字段進行默認倒排的。如何指定數據顯示的順序呢,以下所示:

Elasticsearch聚合查詢以下所示:

複雜的聚合函數使用以下所示,能夠計算最小值,平均值,最大值等等:

十一、Elasticsearch的高級查詢。高級查詢包含子條件查詢(也叫作葉子條件查詢),指特定字段查詢所指特定值。複合條件查詢,指以必定的邏輯組合子條件查詢。子條件查詢包含Query context、Filter context。
  1)、Query context是指在查詢過程當中,除了判斷文檔是否知足查詢條件外,es還會計算一個_score來標識匹配的程度,旨在判斷目標文檔和查詢條件匹配的有多好。Query context經常使用查詢,包含全文本查詢,即針對文本類型數據。字段級別查詢,針對結構化數據,如數字、日期等等。全文本查詢有模糊匹配,短語匹配,多個字段的匹配查詢,以及語法的查詢等等。

模糊匹配查詢,以下所示,可是模糊匹配有一個缺點,就是好比模糊查詢"java入門",會查詢出"java高級編程","elasticsearch入門"等等這些詞語。

Elasticsearch短語匹配以下所示:

Elasticsearch多字段模糊匹配查詢。

Elasticsearch語法查詢。語法查詢,是根據必定的語法規則進行的查詢,通常用做數據搜索,支持通配符,boolean查詢,範圍查詢,正則表達式查詢。

語法查詢的多字段查詢以下所示:

Elasticsearch字段的查詢,即結構化數據的查詢。term是具體項的含義,range是範圍的含義。以下所示:

Elasticsearch範圍的查詢,gte是大於等於的含義,lte是小於等於的含義。gt是大於的含義,lt是小於的含義。

  2)、Filter context的含義,Filter context在查詢過程當中,只判斷該文檔是否知足條件,只有yes或者no。Filter context主要用來作數據過濾的,查詢的結果會被緩存起來。

Query Context和Filter Context的複合查詢,經常使用查詢如固定分數查詢、布爾查詢。,以下所示:

Elasticsearch在查詢返回後會給一個評分_score這個值,固定分數查詢就是將分數固定下來,boost能夠設置分數的值,以下所示:

布爾查詢以下所示,should是或者的關係,知足條件之一即查詢出來,must是必須知足二者才查詢出來,must就不截圖了,替換成should便可測試:

布爾查詢和過濾組成的組合查詢,must的反義是must_not,本身能夠進行測試便可,must和should的替換自行測試,以下所示:

 

做者:別先生

博客園:https://www.cnblogs.com/biehongli/

若是您想及時獲得我的撰寫文章以及著做的消息推送,能夠掃描上方二維碼,關注我的公衆號哦。

相關文章
相關標籤/搜索