簡介
Elasticsearch 是一個分布式、RESTful 風格的搜索和數據分析引擎,能夠解決不斷涌現出的各種用例。 作為 Elastic Stack 的核心,它集中存儲您的數據,幫助您發現意料之中以及意料之外的情況。
Elasticsearch 7.x 包里自包含了 OpenJDK 的包。如果你想要使用你自己配置好的 Java 版本,需要設置 JAVA_HOME
環境變量 —— 參考
官方文檔 Set up Elasticsearch
有各個 OS 的安裝指導,頁面 Installing Elasticsearch 中提供了多種安裝包對應的指導鏈接!
本文選擇綠色安裝包的的方式(tar.gz
)安裝。
也可以使用yum安裝jdk1.8.0版本
yum -y install epel-release #安裝第三方yum源倉庫
yum -y install java-1.8.0-openjdk #安裝java1.8
開始安裝ES
不能使用 root 用戶啟動 es,否則會報錯:
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
如果需要新建用戶的話可以運行 sudo adduser es
,修改 es 用戶的密碼:sudo passwd es
在本文中我使用的創建的es賬號來做驗證
環境
192.168.113.129 | node-1 | master |
192.168.113.130 | node-2 | data |
192.168.113.131 | node-3 | data |
下載ES官方二進制包
官方網站https://www.elastic.co/cn/downloads/elasticsearch
下載ES官方包
su es #進入es賬號
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.2-linux-x86_64.tar.gz
tar -xf elasticsearch-7.16.2-linux-x86_64.tar.gz
mv elasticsearch-7.16.2 elasticsearch
cd elasticsearch
注意openfile文件數需要修改為65535
ulimit -n #查看目前文件打開數最大限制
ulimit -n 65535 #臨時修改最大限制
vi /etc/security/limits.conf #修改永久生效配置,添加下面內容重啟生效
* soft nofile 65535
* hard nofile 65535
vim /etc/sysctl.conf #修改系統最大句柄數,添加如下內容,不然啟動會失敗
vm.max_map_count = 262144
/sbin/sysctl -p #加載生效
ES相關配置
三個配置文件
配置文件主要位於
$ES_HOME/config
目錄下,也可以通過ES_PATH_CONF
環境變量來修改
JAVA配置
$ES_HOME/config/jvm.options
當通過tar
orzip
包安裝/etc/elasticsearch/jvm.options
當通過 Debian or RPM packages
官網也介紹了如何設置堆大小。
默認情況,ES 告訴 JVM 使用一個最小和最大都為 1GB 的堆。但是到了生產環境,這個配置就比較重要了,確保 ES 有足夠堆空間可用。
ES 使用 Xms(minimum heap size)
和 Xmx(maxmimum heap size)
設置堆大小。你應該將這兩個值設為同樣的大小。
Xms
和 Xmx
不能大於你物理機內存的 50%。
設置的示例:
-Xms2g
-Xmx2g
elasticsearch.yml 配置#
ES 默認會加載位於 $ES_HOME/config/elasticsearch.yml
的配置文件。
備注:任何能夠通過配置文件設置的內容,都可以通過命令行使用 -E
的語法進行指定,例如:
./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
cluster.name
#
cluster.name
設置集群名稱。一個節點只能加入一個集群中,默認的集群名稱是 elasticsearch
。
同一集群中的節點名稱不能相同
network.host
#
network.host
:設置訪問的地址。默認僅綁定在回環地址 127.0.0.1
和 [::1]
。如果需要從其他服務器上訪問以及多態機器搭建集群,我們需要設定 ES 運行綁定的 Host,節點需要綁定非回環的地址。建議設置為主機的公網 IP 或 0.0.0.0
:
network.host: 0.0.0.0
更多的網絡設置可以閱讀 Network Settings
http.port
#
http.port
默認端口是 9200 :
http.port: 9200
{% note warning %}
注意:這是指 http 端口,如果采用 REST API 對接 ES,那么就是采用的 http 協議
{% endnote%}
transport.port#
REST 客戶端通過 HTTP 將請求發送到您的 Elasticsearch 集群,但是接收到客戶端請求的節點不能總是單獨處理它,通常必須將其傳遞給其他節點以進行進一步處理。它使用傳輸網絡層(transport networking layer)執行此操作。傳輸層用於集群中節點之間的所有內部通信,與遠程集群節點的所有通信,以及 Elasticsearch Java API 中的 TransportClient。
transport.port
綁定端口范圍。默認為 9300-9400
transport.port: 9300
因為要在一台機器上創建是三個 ES 實例,這里明確指定每個實例的端口。
discovery.seed_hosts
#
discovery.seed_hosts
:發現設置。有兩種重要的發現和集群形成配置,以便集群中的節點能夠彼此發現並且選擇一個主節點。官網/Important discovery and cluster formation settings
discovery.seed_hosts
是組件集群時比較重要的配置,用於啟動當前節點時,發現其他節點的初始列表。
開箱即用,無需任何網絡配置, ES 將綁定到可用的環回地址,並將掃描本地端口 9300 - 9305
,以嘗試連接到同一服務器上運行的其他節點。 這無需任何配置即可提供自動群集的體驗。
如果要與其他主機上的節點組成集群,則必須設置 discovery.seed_hosts
,用來提供集群中的其他主機列表(它們是符合主機資格要求的master-eligible
並且可能處於活動狀態的且可達的,以便尋址發現過程)。此設置應該是群集中所有符合主機資格的節點的地址的列表。 每個地址可以是 IP 地址,也可以是通過 DNS 解析為一個或多個 IP 地址的主機名(hostname
)。
當一個已經加入過集群的節點重啟時,如果他無法與之前集群中的節點通信,很可能就會報這個錯誤
master not discovered or elected yet, an election requires at least 2 nodes with ids from
。因此,我在一台服務器上模擬三個 ES 實例時,這個配置我明確指定了端口號。
配置集群的主機地址,配置之后集群的主機之間可以自動發現(可以帶上端口,例如 127.0.0.1:9300
):
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]
the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
必須至少配置 [discovery.seed_hosts,discovery.seed_providers,cluster.initial_master_nodes]
中的一個。
cluster.initial_master_nodes
#
cluster.initial_master_nodes
: 初始的候選 master 節點列表。初始主節點應通過其 node.name
標識,默認為其主機名。確保 cluster.initial_master_nodes
中的值與 node.name
完全匹配。
首次啟動全新的 ES 集群時,會出現一個集群引導/集群選舉/cluster bootstrapping步驟,該步驟確定了在第一次選舉中的符合主節點資格的節點集合。在開發模式下,如果沒有進行發現設置,此步驟由節點本身自動執行。由於這種自動引導從本質上講是不安全的,因此當您在生產模式下第一次啟動全新的群集時,你必須顯式列出符合資格的主節點。也就是說,需要使用 cluster.initial_master_nodes
設置來設置該主節點列表。重新啟動集群或將新節點添加到現有集群時,你不應使用此設置
在新版 7.x 的 ES 中,對 ES 的集群發現系統做了調整,不再有
discovery.zen.minimum_master_nodes
這個控制集群腦裂的配置,轉而由集群自主控制,並且新版在啟動一個新的集群的時候需要有cluster.initial_master_nodes
初始化集群主節點列表。如果一個集群一旦形成,你不該再設置該配置項,應該移除它。該配置項僅僅是集群第一次創建時設置的!集群形成之后,這個配置也會被忽略的!
{% note warning %}cluster.initial_master_nodes
該配置項並不是需要每個節點設置保持一致,設置需謹慎,如果其中的主節點關閉了,可能會導致其他主節點也會關閉。因為一旦節點初始啟動時設置了這個參數,它下次啟動時還是會嘗試和當初指定的主節點鏈接,當鏈接失敗時,自己也會關閉!
因此,為了保證可用性,預備做主節點的節點不用每個上面都配置該配置項!保證有的主節點上就不設置該配置項,這樣當有主節點故障時,還有可用的主節點不會一定要去尋找初始節點中的主節點!
{% endnote%}
關於 cluster.initial_master_nodes
可以查看如下資料:
其他#
集群的主要配置項上面已經介紹的差不多了,同時也給出了一些文檔拓展閱讀。實際的生產環境中,配置稍微會復雜點,下面補充一些配置項的介紹。需要說明的是,下面的一些配置即使不配置,ES 的集群也可以成功啟動的。
- Elasticsearch 集群中節點角色的介紹 對上文中的
node.master
等配置做了介紹。如果本地僅是簡單測試使用,上文中的node.master/node.data/node.ingest
不用配置也沒影響。
創建集群#
實驗機器有限,我們在同一台機器上創建三個 ES 實例來創建集群,分別明確指定了這些實例的 http.port
和 transport.port
。discovery.seed_hosts
明確指定實例的端口對測試集群的高可用性很關鍵。
如果后期有新節點加入,新節點的
discovery.seed_hosts
沒必要包含所有的節點,只要它里面包含集群中已有的節點信息,新節點就能發現整個集群了。
創建集群
分別在三台集群服務器上面修改配置文件 elasticsearch.yml
vim elasticsearch.yml
master節點配置
# es-7.16.2-node-1
cluster.name: hcwx
node.name: node-1
node.master: true
node.data: false
node.ingest: false #注意如果kibana需要添加檢測堆錐需要將這個配置改為
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.113.129:9300","192.168.113.130:9300","192.168.113.131:9300"]
cluster.initial_master_nodes: ["node-1"]
slave1節點配置
# es-7.16.2-node-2
cluster.name: hcwx
node.name: node-2
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.113.129:9300","192.168.113.130:9300","192.168.113.131:9300"]
slave2節點配置
# es-7.16.2-node-3
cluster.name: hcwx
node.name: node-3
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.113.129:9300","192.168.113.130:9300","192.168.113.131:9300"]
分別啟動ES服務
./bin/elasticsearch
如果要將 ES 作為守護程序運行,請在命令行中指定 -d
,指定 -p
參數,將進程 ID 記錄到 pid
文件
./bin/elasticsearch -d -p pid
如果要停止 ES,運行如下的命令
pkill -F pid 或者查找pid編號kill -p pid
檢查運行狀態
curl -X GET "192.168.113.129:9200/?pretty"
{
"name" : "node-1",
"cluster_name" : "hcwx",
"cluster_uuid" : "8UU0zIp_Q2GocsYIc5HK0Q",
"version" : {
"number" : "7.16.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
"build_date" : "2021-10-07T21:56:19.031608185Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
查看集群狀態
curl http://192.168.113.129:9200/_cat/nodes
192.168.113.129 57 40 0 0.18 0.21 0.15 lmr * node-1
192.168.113.130 64 60 2 0.17 0.13 0.08 cdfhlmrstw - node-2
192.168.113.131 10 62 1 0.34 1.23 0.86 cdfhlmrstw - node-3
http://192.168.113.129:9200/_nodes
將會顯示節點更多的詳情信息
web頁面head插件安裝也可以安裝elasticsearch-kopf插件
修改master節點配置
修改elasticsearch.yml文件,增加如下內容:然后重啟es服務
http.cors.enabled: true
http.cors.allow-origin: "*"
(1)github下載:https://github.com/mobz/elasticsearch-head,解壓
(2)按照github文檔,需要先安裝npm
在有外網或者本地倉庫源的可以使用第三方源yum安裝npm,沒外網的使用二進制包
yum -y install npm*
注:(JavaScript中的npm:相當於python中的pip、java中的maven)
①下載並解壓node-v14.6.0-linux-x64(wget https://nodejs.org/download/release/v14.6.0/node-v14.6.0-linux-x64.tar.gz)
②cd進bin目錄,測試./node –v
③創建軟連接 ln –s ‘源文件node位置’/usr/local/bin/node
ln –s ‘源文件npm位置’/usr/local/bin/npm
在有外網或者npm倉庫使用這個方法
因為/usr/local/bin是環境變量PATH的內容,所以建立軟連接后可以直接使用node命令
(3)使用npm安裝elasticsearch-head
①cd到elasticsearch-head目錄下
配置依賴
cd /opt
wget https://npm.taobao.org/mirrors/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
vim /etc/profile
export PATH=$PATH:/opt/phantomjs-2.1.1-linux-x86_64/bin
sour /etc/profile
修改啟動配置文件在端口上一行添加hostname
②#npm install
③#npm run start
④默認在localhost:9100端口啟動
⑤打開原安裝的elasticsearch.yml配置文件,再修改一下elasticsearch的服務安全策略,使得elasticsearch-head插件與elasticsearch服務連接,如下
5.訪問http://ip:9100 ,進入顯示如下:
安裝elasticsearch-analysis-ik 7.16.2分詞器插件
1.ik分詞器是基於Elasticsearch的,所以Elasticsearch必須是已經安裝好,並且能使用的狀態,另外最好也安裝好了Elasticsearch Head插件。
2.進入Elasticsearch的根目錄下的plugins
3.新建目錄ik
4.執行下載ik軟件
5.解壓縮ik軟件
執行命令--->mkdir -p /home/es/plugins/ik
執行命令--->wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.16.2/elasticsearch-analysis-ik-7.16.2.zip
執行命令--->unzip elasticsearch-analysis-ik-7.16.2.zip
6.重啟Elasticsearch
7.測試分詞器是否好用
7-1.打開postman工具。
7-2.使用POST請求http://192.168.113.129:9200/_analyze (0.47:9200是我的es服務器,_analyze是函數名)
7-3.請求體內raw寫json格式的內容,如下:{"analyzer": "ik_max_word","text": "我的偶像是劉德華"}
6、ES添加用戶密碼安全認證
簡介:有需要配置授權安全認證的可以繼續往下配置,
背景: ES集群原先沒設置密碼,存在數據泄露,被篡改風險。
1、集群設置證書
啟用了x-pack模塊,那么集群中的各節點之間通訊就必須安全認證。為了解決節點間通訊的認證問,我們需要制作證書。
不然直接生成密碼的話, 會報Cause: Cluster state has not been recovered yet, cannot write to the [null]index
執行下面的操作用於生成elastic-certificates.p12 文件,文件將自動生成在cd /opt/elasticsearch下面
cd /opt/elasticsearch/bin
./elasticsearch-certutil cert
2、elasticsearch.yml配置文件添加下面認證 配置(每個節點都需要添加)
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
分別在每台es節點的conf目錄下面創建目錄certs目錄
cd /opt/elasticsearch/config
mkdir certs
拷貝這個ca文件到每個節點的certs目錄下面
scp elastic-certificates.p12 到每個節點的certs目錄
mv elastic-certificates.p12 config/certs/
上面的配置好后重啟ES
Elasticsearch 有兩個級別的通信,傳輸通信和 http 通信。 傳輸協議用於 Elasticsearch 節點之間的內部通信,http 協議用於客戶端到 Elasticsearch 集群的通信。
個人認為上面只設置了內部傳輸協議直接的證書,所以只用cert生成 ,沒有ca生成。
elasticsearch.yml設置里面也只設置了 xpack.security.transport.ssl, 沒有設置xpack.security.http.ssl...
開始設置密碼:
在ES集群的任意一個節點的bin目錄下面執行來自動生成密碼,把生成的密碼跟賬號記錄下來
./elasticsearch-setup-passwords auto
存儲密碼可能需要elasticsearch.keystore
用./elasticsearch-keystore create
來生成
生成好后配置到kibana等需要集成ES的組件里面。
kibana上可以自定義設置角色和用戶。設置只讀用戶read,寫入用戶write
后續可以用這些用戶來操作ES了,
如
curl -XGET "http://localhost:9200/_search" -H 'Content-Type: application/json' -d'{"query": {"match_all": {}}}' -u read:read1234
curl -XPOST 'http://localhost:9200/teacher/_doc' -u apm_system:apm1234 -d '{"name":"lihua1","age":13}' -H 'Content-Type:application/json; charset=UTF-8'
修改賬號密碼的操作方法,這里用elastic管理賬號做示范
curl -XPOST -u elastic "127.0.0.1:9200/_security/user/elastic/_password" -H 'Content-Type: application/json' -d'{"password" : "elastic123456"}'
#elastic123456是新密碼
#在執行上面的curl后輸入原始密碼
將賬號加入到超級管理員角色
curl -XPOST -H 'Content-type: application/json' -u elastic:當前超級管理員賬號密碼 'http://127.0.0.1:9200/_xpack/security/user/dbtest(需要加權限的賬號)?pretty' -d '{"password":"dbtest賬號密碼","full_name":"dbscan","roles":["superuser"]}'
配置了密碼認證后訪問head插件需要這樣訪問
es-head連接地址:http://192.168.113.129:9100/?auth_user=elastic&auth_password=密碼