centos7部署elasticsearch-7.16.2分布式集群(此版本修復了log4j2漏洞)


簡介

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相關配置

三個配置文件

  • elasticsearch.yml ES 的配置,more
  • jvm.options ES JVM 配置,more
  • log4j2.properties ES 日志配置,more

配置文件主要位於 $ES_HOME/config 目錄下,也可以通過 ES_PATH_CONF 環境變量來修改

JAVA配置

  • $ES_HOME/config/jvm.options 當通過 tar or zip 包安裝
  • /etc/elasticsearch/jvm.options 當通過 Debian or RPM packages

官網也介紹了如何設置堆大小

默認情況,ES 告訴 JVM 使用一個最小和最大都為 1GB 的堆。但是到了生產環境,這個配置就比較重要了,確保 ES 有足夠堆空間可用。

ES 使用 Xms(minimum heap size) 和 Xmx(maxmimum heap size) 設置堆大小。你應該將這兩個值設為同樣的大小。

Xms 和 Xmx 不能大於你物理機內存的 50%。

設置的示例:

Copy
-Xms2g 
-Xmx2g

elasticsearch.yml 配置#

ES 默認會加載位於 $ES_HOME/config/elasticsearch.yml 的配置文件。

備注:任何能夠通過配置文件設置的內容,都可以通過命令行使用 -E 的語法進行指定,例如:

Copy
./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1

cluster.name#

cluster.name 設置集群名稱。一個節點只能加入一個集群中,默認的集群名稱是 elasticsearch

node.name#

node.name:可以配置每個節點的名稱。用來提供可讀性高的 ES 實例名稱,它默認名稱是機器的 hostname,可以自定義:

Copy
node.name: node-1

同一集群中的節點名稱不能相同


network.host#

network.host:設置訪問的地址。默認僅綁定在回環地址 127.0.0.1 和 [::1]。如果需要從其他服務器上訪問以及多態機器搭建集群,我們需要設定 ES 運行綁定的 Host,節點需要綁定非回環的地址。建議設置為主機的公網 IP 或 0.0.0.0

Copy
network.host: 0.0.0.0

更多的網絡設置可以閱讀 Network Settings


http.port#

http.port 默認端口是 9200 :

Copy
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

Copy
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):

Copy
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 的集群也可以成功啟動的。

創建集群#

實驗機器有限,我們在同一台機器上創建三個 ES 實例來創建集群,分別明確指定了這些實例的 http.port 和 transport.portdiscovery.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

執行命令--->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=密碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM