日期 | 做者 | 版本 | 備註 |
---|---|---|---|
2020-07-01 | dingbin | v1.0 | |
ElasticSearch簡稱es,是當前流行、強大的基於Lucene的企業級搜索引擎。html
Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學習過程有莫大的幫助。java
Elasticsearch是一個接近實時的搜索平臺。這意味着,從索引一個文檔直到這個文檔可以被搜索到有一個輕微的延遲(一般是1秒)。node
一個集羣就是由一個或多個節點組織在一塊兒,它們共同持有整個的數據,並一塊兒提供索引和搜索功能。一個集羣由一個惟一的名字標識,這個名字默認就是 「elasticsearch」。這個名字是重要的,由於一個節點只能經過指定某個集羣的名字,來加入這個集羣。在產品環境中顯式地設定這個名字是一個好習慣,可是使用默認值來進行測試/開發也是不錯的。linux
一個節點是你集羣中的一個服務器,做爲集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣相似,一個節點也是由一個名字來標識的,默認狀況 下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的時候賦予節點。這個名字對於管理工做來講挺重要的,由於在這個管理過程當中,你會去肯定網絡中的哪些服務器對應於Elasticsearch集羣中的哪些節點。git
一個節點能夠經過配置集羣名稱的方式來加入一個指定的集羣。默認狀況下,每一個節點都會被安排加入到一個叫作「elasticsearch」的集羣中,這意 味着,若是你在你的網絡中啓動了若干個節點,並假定它們可以相互發現彼此,它們將會自動地造成並加入到一個叫作「elasticsearch」的集羣中。es6
在一個集羣裏,只要你想,能夠擁有任意多個節點。並且,若是當前你的網絡中沒有運行任何Elasticsearch節點,這時啓動一個節點,會默認建立並加入一個叫作「elasticsearch」的集羣。github
一個索引就是一個擁有幾分類似特徵的文檔的集合。好比說,你能夠有一個客戶數據的索引,另外一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須所有是小寫字母的),而且當咱們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。數據庫
在一個集羣中,若是你想,能夠定義任意多的索引。vim
在一個索引中,你能夠定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義徹底由你來定。一般,會爲具備一組共同字段的文檔定義一個類型。好比說,咱們假設你運營一個博客平臺而且將你全部的數據存儲到一個索引中。在這個索引中,你能夠爲用戶數據定義一個類型,爲博客數據定義另外一個類型,固然,也能夠爲評論數據定義另外一個類型。segmentfault
一個文檔是一個可被索引的基礎信息單元。好比,你能夠擁有某一個客戶的文檔,某一個產品的一個文檔,固然,也能夠擁有某個訂單的一個文檔。文檔以 JSON(Javascript Object Notation)格式來表示,而JSON是一個處處存在的互聯網數據交互格式。
在一個index/type裏面,只要你想,你能夠存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的type。
一個索引能夠存儲超出單個結點硬件限制的大量數據。好比,一個具備10億文檔的索引佔據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。
爲了解決這個問題,Elasticsearch提供了將索引劃分紅多份的能力,這些份就叫作分片。當你建立一個索引的時候,你能夠指定你想要的分片的數量。每一個分片自己也是一個功能完善而且獨立的「索引」,這個「索引」能夠被放置到集羣中的任何節點上。
分片之因此重要,主要有兩方面的緣由:
至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是徹底由Elasticsearch管理的,對於做爲用戶的你來講,這些都是透明的。
在一個網絡/雲的環境裏,失敗隨時均可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者因爲任何緣由消失了,這種狀況下,有一個故障轉移機制是非 常有用而且是強烈推薦的。爲此目的,Elasticsearch容許你建立分片的一份或多份拷貝,這些拷貝叫作複製分片,或者直接叫複製。
複製之因此重要,有兩個主要緣由:
總之,每一個索引能夠被分紅多個分片。一個索引也能夠被複制0次(意思是沒有複製)或屢次。一旦複製了,每一個索引就有了主分片(做爲複製源的原來的分片)和 複製分片(主分片的拷貝)之別。分片和複製的數量能夠在索引建立的時候指定。在索引建立以後,你能夠在任什麼時候候動態地改變複製的數量,可是你過後不能改變 分片的數量。
默認狀況下,Elasticsearch中的每一個索引被分片5個主分片和1個複製,這意味着,若是你的集羣中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個徹底拷貝),這樣的話每一個索引總共就有10個分片。
index: es裏的index至關於一個數據庫。
type: 至關於數據庫裏的一個表。
id: 惟一,至關於主鍵。
node:節點是es實例,一臺機器能夠運行多個實例,可是同一臺機器上的實例在配置文件中要確保http和tcp端口不一樣(下面有講)。
cluster:表明一個集羣,集羣中有多個節點,其中有一個會被選爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的。
shards:表明索引分片,es能夠把一個完整的索引分紅多個分片,這樣的好處是能夠把一個大的索引拆分紅多個,分佈到不一樣的節點上,構成分佈式搜索。分片的數量只能在索引建立前指定,而且索引建立後不能更改。
replicas:表明索引副本,es能夠設置多個索引的副本,副本的做用一是提升系統的容錯性,當個某個節點某個分片損壞或丟失時能夠從副本中恢復。二是提升es的查詢效率,es會自動對搜索請求進行負載均衡。
本節將敘述從elasticsearch官網https://www.elastic.co/cn/公佈的當前最新的es版本:7.8.0版本,在3臺centos7.5 操做系統服務器上,以專門的特定用戶(本文是用戶es,不須要root或sudo權限),安裝任意用戶指定的路徑(本文是/opt/es)的實踐流程細節。
此外,鑑於es集羣要想提供中文索引和檢索的服務,離不開中文分詞功能。本文在綜合分析了目前市面上多種主流的中文分詞組件功能優劣後,選擇了效果較好的ik分詞組件,嵌入到es中,以提供分詞功能。考慮到es版本是7.8.0,ik分詞組件版本必須與其一直。所以Ik分詞程序包是從ik分詞官網git網址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0下載的v7.8.0版本。
注意:
本文所述設計的全部的程序安裝包和相關源代碼均提供下載: es7.8package.rar 提取碼: x4gg
解壓後內容以下圖:(其中esproj.zip是本文開源的es構建全量或實時索引的相關java源代碼)
![]()
分佈式es集羣至少要求運行在3臺或以上服務器上。本文講述是基於安裝在3臺vmware虛擬機上,各虛擬機機器結點以下表:
本節使用的全部vmware虛擬機配置均爲CPU:8核,內存6G,硬盤足夠。
新建專門的linux用戶es和組es,以便安全方式運行進程
建立group es vim /etc/group 會發現最後一行有es用戶組
建立es用戶,同時加入es用戶組,自動建立es的homedir爲/home/es vim /etc/passwd, 能夠看到最後一行是es用戶。
爲es用戶新設立密碼
注意:本步驟非必須,可選。 chmod +w /etc/sudoers vim /etc/sudoers 添加以下行:
修改完後不要忘記執行:chmod -w /etc/sudoers以恢復/etc/suders系統文件的非默承認寫屬性。
在3臺機器上統一特定路徑位置建立es集羣的basedir。後續該basedir目錄下將分別建立出es集羣的app/data/logs/tmp 4個子目錄等。必須保證basedir路徑的硬盤空間適應將來業務數據增加的需求,硬盤空間足夠大。本文basedir路徑爲/opt/es。
mkdir /opt/es/app mkdir /opt/es/data mkdir /opt/es/tmp mkdir /opt/es/logs chown -R es:es /opt/es
以上的data、logs 2個目錄將分別是es服務的datadir、logdir;app目錄用於存放安裝es程序的目錄;用於自定義指定的es服務的tmp目錄。chown -R es:es /opt/es是修改es集羣的basedir路徑/opt/es的所屬user和group爲es用戶名和es組。
CentOS7 端口的開放關閉查看都是用防火牆來控制的,Centos 從6升級到7以後,再也不是用以前的iptables 命令控制linux端口,centos7取而代之的是用firewalld代替了原來centos6的iptables。
如下簡述centos7防火牆相關操做用法:
1) 查看防火牆狀態:(active (running) 便是開啓狀態)
systemctl status firewalld
![]()
systemctl用法簡述以下:
![]()
2)開啓/關閉防火牆:
開啓防火牆:systemctl start firewalld
關閉防火牆:systemctl stop firewalld
禁止firewalld開機啓動:systemctl disable firewalld
firewalld開機啓動:systemctl enable firewalld
![]()
3)查詢端口號3306 是否開啓
firewall-cmd --query-port=3306/tcp
![]()
可見3306防火牆端口未開啓
4)查詢有哪些端口是開啓的
firewall-cmd --list-port
![]()
5)重啓防火牆
firewall-cmd --reload
6)開啓端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
--zone #做用域
--add-port=3306/tcp #添加端口,格式爲:端口/通信協議
--permanent #永久生效,沒有此參數重啓後失效注意:開啓端口後必須執行firewall-cmd --reload 以重啓防火牆才能生效,不然不生效。
如前文章節所述,es集羣須要默認開放3個端口:9200和9300和54328。其中:
9200: 做爲 Http 協議,主要用於外部通信 9300: 數據傳輸端口:9300 用於集羣之間交換數據 54328: 組播端口(UDP)
要部署es集羣,若是打開了防火牆,必定要記得將以上3個端口開放。本文由於體現定製性,將9200和9300端口分別改爲了19200和19300。
方案1:關閉防火牆
systemctl stop firewalld
方案2:開啓防火牆可是同時開放3個端口以下
systemctl start firewalld firewall-cmd --zone=public --add-port=19200/tcp --permanent firewall-cmd --zone=public --add-port=19300/tcp --permanent firewall-cmd --zone=public --add-port=54328/udp --permanent firewall-cmd --reload
本文采起方案2,開啓防火牆但同時開啓以上3個端口,效果以下:注意:開啓防火牆要執行一下:systemctl enable firewalld 保證下次開啓啓動防火牆。
es集羣部署須要把 SELINUX 值設置成 disabled
查看如今selinux的狀態:sestatus
臨時關閉selinux:setenforce 0
臨時打開,由permissive轉enforcing:setenforce 1
但再次開啓時此改變會失效。要想永久生效須要修改文件/etc/selinux/config
vim /etc/selinux/config
修改文件中SELINUX=disable便可。
在大多數linux版本下,Es程序啓動必須設置一些特定的相關係統內核功能,不然es程序是啓動不起來的。這很是重要,必定要設置,不然es啓動不起來,且會報告各類莫名的錯誤。Es官網也給出了相關的系統配置建議,可參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html 。本節講述的是在centos7上必須進行的系統內核相關的系統配置以下:
1) /etc/security/limits.conf 配置
vi /etc/security/limits.conf
打開文件,添加以下紅框中3行:
2) /etc/sysctl.conf配置
vi /etc/sysctl.conf
打開文件,添加以下紅框中2行:
注意
:以上這幾處配置改動涉及到centos內核,建議重啓centos操做系統使其永久生效。
至此,es集羣安裝所需的所有準備工做所有完成。下面開始安裝es集羣。
如前所述,部署es7.8集羣還同時須要安裝配套的分詞組件包:ik7.8。分別從官網地址:
https://www.elastic.co/cn/
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0下載的v7.8.0
便可下載到當前(20200701)最新的版本7.8。由於下載速度極其緩慢,整個下載過程持續約長達3-4個小時。文本已經下載好了這2個軟件包,分別見項目提交列表中的以下文件:
直接解壓使用便可,省去漫長的下載過程。
分別在cent7a、cent7b、cent7c 3臺機器上解壓項目提交列表中的es壓縮包文件:elasticsearch-7.8.0-linux-x86_64.tar.gz到 /opt/es/app目錄下,以下圖所示:
接下來分別在3臺機器上的/opt/es/app/elasticsearch-7.8.0/plugins目錄下新建ik目錄,而後將項目提交列表中的ik組件程序包:elasticsearch-analysis-ik-7.8.0.zip 解壓到該ik插件目錄下:/opt/es/app/elasticsearch-7.8.0/plugins/ik
最終結果以下:
注意:es服務是java語言編寫的,內部依賴jdk。但自從es6以後,es程序包內部內嵌了新版本的jdk,再也不須要用戶本身單獨安裝jdk。
vim /opt/es/app/elasticsearch-7.8.0/config/jvm.options
設置以下圖所示最小堆空間和最大堆空間,建議都設置成同樣的值。 本文部署實際中由於vmware虛擬機總共6G內存限制同時機器上還部署了其餘耗內存的服務,所以只設置了3g 堆內存空間。實際生產環境下爲保證es能發揮正常性能,該2值很關鍵,強烈設置在5g以上,但最大不該超過32g。在此範圍內越大越好,越大es能發揮越高的性能。
此外以下圖設置heapDumpPath爲/opt/es/logs目錄下:
elasticsearch.yml文件是es集羣的主要配置文件,必定要設置好。
先在cent7a上:vim /opt/es/app/elasticsearch-7.8.0/config/elasticsearch.yml
依次設置以下:
以上是cent7a的配置,cent7b、cent7c上的配置大致相同,除了:
node.name分別是es-node2/es-node3;
network.host分別是:192.168.0.1十一、192.168.0.1十二、192.168.0.113。
依次在cent7a/cent7b/cent7c上執行命令:
/opt/es/app/elasticsearch-7.8.0/bin/elasticsearch -d -p /opt/es/app/pid
-d表示之後臺服務方式運行, -p表示pid存儲的文件。
而後在每一個機器上執行:jps –lm和cat /opt/es/app/pid
便可看到以下:
分別是es進程和進程號。
而後在瀏覽器上輸入:http://192.168.0.110:19200
便可看到以下:
輸入:http://192.168.0.110:19200/_cat/nodes?v
顯示以下:
輸入:http://192.168.0.110:19200/_cat/health?v
顯示以下:
可見集羣共有3個節點,集羣健康狀態是status:green,綠色表示健康。
至此es集羣部署完畢。
分別在3臺機器上分別執行:pkill -F /opt/es/app/pid便可。