| 日期 | 作者 | 版本 | 備註 |
|---|---|---|---|
| 2020-07-01 | dingbin | v1.0 | |
1. ElasticSearch技術簡介
ElasticSearch簡稱es,是當前流行、強大的基於Lucene的企業級搜索引擎。
1.1. 基礎概念
Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學習過程有莫大的幫助。
1.1.1. 接近實時(NRT)
Elasticsearch是一個接近實時的搜索平台。這意味着,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)。
1.1.2. 集羣(cluster)
一個集羣就是由一個或多個節點組織在一起,它們共同持有整個的數據,並一起提供索引和搜索功能。一個集羣由一個唯一的名字標識,這個名字默認就是 “elasticsearch”。這個名字是重要的,因為一個節點只能通過指定某個集羣的名字,來加入這個集羣。在產品環境中顯式地設定這個名字是一個好習慣,但是使用默認值來進行測試/開發也是不錯的。
1.1.3. 節點(node)
一個節點是你集羣中的一個服務器,作為集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣類似,一個節點也是由一個名字來標識的,默認情況 下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的時候賦予節點。這個名字對於管理工作來説挺重要的,因為在這個管理過程中,你會去確定網絡中的哪些服務器對應於Elasticsearch集羣中的哪些節點。
一個節點可以通過配置集羣名稱的方式來加入一個指定的集羣。默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集羣中,這意 味着,如果你在你的網絡中啓動了若干個節點,並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch”的集羣中。
在一個集羣裏,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,這時啓動一個節點,會默認創建並加入一個叫做“elasticsearch”的集羣。
1.1.4. 索引(index)
一個索引就是一個擁有幾分相似特徵的文檔的集合。比如説,你可以有一個客户數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。
在一個集羣中,如果你想,可以定義任意多的索引。
1.1.5. 類型(type)
在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組共同字段的文檔定義一個類型。比如説,我們假設你運營一個博客平台並且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用户數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。
1.1.6. 文檔(document)
一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客户的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以 JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type裏面,只要你想,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的type。
1.1.7. 分片和複製(shards & replicas)
一個索引可以存儲超出單個結點硬件限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁盤空間,而任一節點都沒有這樣大的磁盤空間;或者單個節點處理搜索請求,響應太慢。
為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到集羣中的任何節點上。
分片之所以重要,主要有兩方面的原因:
- 允許你水平分割/擴展你的內容容量
- 允許你在分片(潛在地,位於多個節點上)之上進行分佈式的、並行的操作,進而提高性能/吞吐量
至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作為用户的你來説,這些都是透明的。
在一個網絡/雲的環境裏,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非 常有用並且是強烈推薦的。為此目的,Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。
複製之所以重要,有兩個主要原因:
- 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。
- 擴展你的搜索量/吞吐量,因為搜索可以在所有的複製上並行運行
總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和 複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變 分片的數量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味着,如果你的集羣中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。
index: es裏的index相當於一個數據庫。
type: 相當於數據庫裏的一個表。
id: 唯一,相當於主鍵。
node:節點是es實例,一台機器可以運行多個實例,但是同一台機器上的實例在配置文件中要確保http和tcp端口不同(下面有講)。
cluster:代表一個集羣,集羣中有多個節點,其中有一個會被選為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集羣內部來説的。
shards:代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上,構成分佈式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。
replicas:代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
2. ElasticSearch集羣部署
本節將敍述從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源代碼)
![]()
2.1. 準備工作
2.1.1. 環境準備
分佈式es集羣至少要求運行在3台或以上服務器上。本文講述是基於安裝在3台vmware虛擬機上,各虛擬機機器結點如下表:
本節使用的所有vmware虛擬機配置均為CPU:8核,內存6G,硬盤足夠。
2.1.2. 系統準備
2.1.2.1. 新建專門的es用户和組
新建專門的linux用户es和組es,以便安全方式運行進程
groupadd es
創建group es
vim /etc/group
會發現最後一行有es用户組
adduser -g es es
創建es用户,同時加入es用户組,自動創建es的homedir為/home/es
vim /etc/passwd, 可以看到最後一行是es用户。
passwd es
為es用户新設立密碼
將es用户加入sudo權限
注意:本步驟非必須,可選。
chmod +w /etc/sudoers
vim /etc/sudoers
添加如下行:
修改完後不要忘記執行:chmod -w /etc/sudoers以恢復/etc/suders系統文件的非默認可寫屬性。
2.1.2.2. 創建es集羣的basedir路徑
在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組。
2.1.2.3. 防火牆、selinux和端口準備
CentOS7 端口的開放關閉查看都是用防火牆來控制的,Centos 從6升級到7之後,不再是用之前的iptables 命令控制linux端口,centos7取而代之的是用firewalld代替了原來centos6的iptables。
2.1.2.3.1. Centos7防火牆用法簡述
以下簡述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 以重啓防火牆才能生效,否則不生效。
2.1.2.3.2. es集羣部署涉及需要的防火牆端口操作
如前文章節所述,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 保證下次開啓啓動防火牆。
2.1.2.3.3. es集羣部署涉及需要的selinux操作
es集羣部署需要把 SELINUX 值設置成 disabled
查看現在selinux的狀態:sestatus
臨時關閉selinux:setenforce 0
臨時打開,由permissive轉enforcing:setenforce 1
但再次開啓時此改變會失效。要想永久生效需要修改文件/etc/selinux/config
vim /etc/selinux/config
修改文件中SELINUX=disable即可。
2.1.2.3.4. Es程序啓動必須的linux內核系統配置
在大多數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集羣。
2.2. 部署es集羣
2.2.1. 下載軟件包
如前所述,部署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個軟件包,分別見項目提交列表中的如下文件:
直接解壓使用即可,省去漫長的下載過程。
2.2.2. 安裝和部署es集羣
2.2.2.1. 安裝es程序和ik組件
分別在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
最終結果如下:
2.2.2.2. 配置es集羣
1) jvm相關配置
注意: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目錄下:
2) Es集羣配置:elasticsearch.yml
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.111、192.168.0.112、192.168.0.113。
2.2.2.3. 啓動/關閉es集羣服務
1) 啓動es:
依次在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集羣部署完畢。
2) 關閉es:
分別在3台機器上分別執行:pkill -F /opt/es/app/pid即可。
未完待續,下一篇:Elasticsearch7.8詳盡使用指南(二):ElasticSearch集羣構建索引實踐