在安裝ElasticSearch時遇到了很多坑,所以在這里做個筆記記錄一下。
首先我考慮的是使用docker進行部署,結果發現虛擬機直接內存溢出,我也是無解了,也就是說使用docker部署還得注意容器的資源分配調度,於是便放棄了。
ElasticSearch安裝
ElasticSearch下載地址:https://www.elastic.co/cn/downloads/elasticsearch
很多人下載的是rpm包安裝,這里我下載的linux的已經編譯好的包,直接配置啟動就行了,因為它自帶了JDK等環境:
下載后,使用tar命令解壓,然后使用bin/elasticsearch啟動即可,比如我這里下載的是7.12.0版本:
# 解壓 tar -zxf elasticsearch-7.12.0-linux-x86_64.tar.gz # 啟動 elasticsearch-7.12.0/bin/elasticsearch
然后啟動報錯,大致內容如下:
ERROR: [3] bootstrap checks failed. You must address the points described in the following [3] lines before starting Elasticsearch. bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] bootstrap check failure [2] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] bootstrap check failure [3] of [3]: 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 ERROR: Elasticsearch did not exit normally - check the logs at /opt/elasticsearch/logs/elasticsearch.log
大致內容是說我們3個配置沒有做,也對,剛下載解壓后直接運行,肯定會有很多問題:
1、bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
這個是說ElasticSearch進程的最大文件描述大小需要65535,而當前是4096,解決辦法是修改 /etc/security/limits.conf 文件,在末尾加上(存在則修改,數值不能比要求的小):
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
2、bootstrap check failure [2] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
這是說最大虛擬內存太小(vm.max_map_count配置),至少需要262144,當前為65530,解決辦法是修改 /etc/sysctl.conf 文件,在末尾加上(存在則修改,數值不能比要求的小):
vm.max_map_count=262144
3、bootstrap check failure [3] of [3]: 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
這是說我們沒有對ElasticSearch發現進行配置,至少需要配置discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes中的一個:
discovery.seed_hosts:集群節點列表,每個值應采用host:port或host的形式(其中port默認為設置transport.profiles.default.port,如果未設置則返回transport.port) discovery.seed_providers:集群節點列表的提供者,作用就是獲取discovery.seed_hosts,比如使用文件指定節點列表 cluster.initial_master_nodes:初始化時master節點的選舉列表,一般使用node.name(節點名稱)配置指定,配置旨在第一次啟動有效,啟動之后會保存,下次啟動會讀取保存的數據
比如這里我全部的配置如下(config/elasticsearch.yml),更多配置參考官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html:
# 啟動地址,如果不配置,只能本地訪問 network.host: 0.0.0.0 # 節點名稱 node.name: node-name # 節點列表 discovery.seed_hosts: ["192.168.209.132"] # 初始化時master節點的選舉列表 cluster.initial_master_nodes: [ "node-name" ] # 集群名稱 cluster.name: cluster-name # 對外提供服務的端口 http.port: 9200 # 內部服務端口 transport.port: 9300 # 跨域支持 http.cors.enabled: true # 跨域訪問允許的域名地址(正則) http.cors.allow-origin: /.*/
注:如果還報上面1、2的異常,那可能需要重啟一下系統了。
接着啟動,結果提示jdk版本不對,原來我自己配置了環境變量JAVA_HOME,而ElasticSearch就是用了這個環境變量對應的java來運行,即發現jdk版本不對,另外還warning,JAVA_HOME環境變量已經棄用了,使用ES_JAVA_HOME代替:
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME Future versions of Elasticsearch will require Java 11; your Java version from [/opt/jdk1.8.0_202/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
因為ElasticSearch包中包含了JDK,所以我們可以直接使用,有兩種使用辦法:
1、添加環境變量ES_JAVA_HOME指向ElasticSearch包中包含了JDK目錄
2、修改bin/elasticsearch-env中代碼,我們注釋掉JAVA_HOME部分的判斷:
配置完成后,在啟動,然后訪問 http://192.168.209.132:9200/,如果顯示類似下面的json,表示啟動成功了
賬號密碼
如果想要添加賬戶密碼,只需要在config/elasticsearch.yml中添加下面兩個配置:
xpack.security.enabled: true xpack.security.transport.ssl.enabled: true
上面兩個配置表示啟用x-pack驗證插件
然后重啟ElasticSearch,執行下面的命令即可設置與ElasticSearch關聯的一些賬號的密碼:
bin/elasticsearch-setup-passwords interactive
設置完成之后就需要使用賬號密碼訪問了,賬號就是上圖的第一個設置elastic:
# 不帶認證訪問會報認證異常 curl http://localhost:9200/_cat/indices # -u參數指定賬號,執行后會提示輸入密碼 curl -u elastic http://localhost:9200/_cat/indices # -u參數指定賬號和密碼,格式:user:password curl -u elastic:123456 http://localhost:9200/_cat/indices
設置了密碼,還可以修改密碼:
# 需要使用api來操作修改密碼 curl -XPOST -u elastic http://localhost:9200/_security/user/elastic/_password -H "Content-Type:application/json" -d "{\"password\":\"abcdefg\"}"
如果忘記密碼,可以先取消認證,即注釋掉上面config/elasticsearch.yml中添加的兩個配置,然后重啟ElasticSearch,然后找到一個類型.security-X的index,刪除掉就可以回到最初無密碼認證的狀態了:
# 查看.security-X存在與否 curl http://localhost:9200/_cat/indices | grep ".security" # 刪除index,我這里是.security-7 curl -XDELETE http://localhost:9200/.security-7
中文分詞器
ElasticSearch應用時,我們常常會使用到中文,這樣ElasticSearch原來的分詞器就不夠用了,需要安裝一個中文分詞器,用的多的就是IK分詞器,下載地址(下載.zip包):https://github.com/medcl/elasticsearch-analysis-ik/releases
下載好之后,在ElasticSearch主目錄下的plugins目錄新建一個目錄,然后將下載好的ik分詞器壓縮包放進去,再使用unzip解壓:
# 在ElasticSearch主目錄下的plugins目錄新建一個目錄,我的ElasticSearch主目錄是/opt/elasticsearch,所以在/opt/elasticsearch/plugins新建一個目錄:analysis-ik mkdir /opt/elasticsearch/plugins/analysis-ik # 將下載好的ik分詞器壓縮包放進去 mv elasticsearch-analysis-ik-7.12.0.zip /opt/elasticsearch/plugins/analysis-ik/ # 進入新建的analysis-ik目錄進行解壓 cd /opt/elasticsearch/plugins/analysis-ik # 解壓 unzip elasticsearch-analysis-ik-7.12.0.zip
做完之后重啟ElasticSearch就可以了
集群
上面是啟動一個節點的ElasticSearch集群,如果我們要啟動多個節點的集群,比如我有三台服務器:192.168.209.128,192.168.209.129,192.168.209.132
首先按照上面單個節點的形式保證能運行起來,然后修改配置:
192.168.209.132
# 啟動地址,如果不配置,只能本地訪問 network.host: 0.0.0.0 # 節點名稱 node.name: node-132 # 節點列表 discovery.seed_hosts: ["192.168.209.128", "192.168.209.129", "192.168.209.132"] # 初始化時master節點的選舉列表 cluster.initial_master_nodes: [ "node-128", "node-129", "node-132" ] # 集群名稱 cluster.name: cluster-name # 對外提供服務的端口 http.port: 9200 # 內部服務端口 transport.port: 9300
# 跨域支持 http.cors.enabled: true # 跨域訪問允許的域名地址(正則) http.cors.allow-origin: /.*/
192.168.209.129
# 啟動地址,如果不配置,只能本地訪問 network.host: 0.0.0.0 # 節點名稱 node.name: node-129 # 節點列表 discovery.seed_hosts: ["192.168.209.128", "192.168.209.129", "192.168.209.132"] # 初始化時master節點的選舉列表 #cluster.initial_master_nodes: [ "node-128", "node-129", "node-132" ] # 集群名稱 cluster.name: cluster-name # 對外提供服務的端口 http.port: 9200 # 內部服務端口 transport.port: 9300
# 跨域支持 http.cors.enabled: true # 跨域訪問允許的域名地址(正則) http.cors.allow-origin: /.*/
192.168.209.128
# 啟動地址,如果不配置,只能本地訪問 network.host: 0.0.0.0 # 節點名稱 node.name: node-128 # 節點列表 discovery.seed_hosts: ["192.168.209.128", "192.168.209.129", "192.168.209.132"] # 初始化時master節點的選舉列表 #cluster.initial_master_nodes: [ "node-128", "node-129", "node-132" ] # 集群名稱 cluster.name: cluster-name # 對外提供服務的端口 http.port: 9200 # 內部服務端口 transport.port: 9300
# 跨域支持 http.cors.enabled: true # 跨域訪問允許的域名地址(正則) http.cors.allow-origin: /.*/
這里的配置基本上和單機啟動一樣,只不過在discovery.seed_hosts中指定了節點列表。然后將每個節點啟動即可,然后分別訪問各服務的9200端口,查看服務是否正常啟動。
同時,也可以訪問任意節點的http://host:9200/_cluster/health查看集群狀態:green表示正常,yellow表示警告,red表示異常
注:並不是每個節點都需要配置cluster.initial_master_nodes
Kibana安裝
Kibana下載地址:https://www.elastic.co/cn/downloads/kibana
同樣的,下載編譯好的包(7.12.0)
然后解壓,然后修改config/kibana.yml,添加ElasticSearch的節點配置:
# 服務端口,默認5601 server.port: 5601 # 啟動地址,默認localhost,如果不修改,那么遠程無法訪問 server.host: 0.0.0.0 # elasticsearch集群地址,舊版本是elasticsearch.url elasticsearch.hosts: ["http://192.168.209.128:9200","http://192.168.209.129:9200","http://192.168.209.132:9200"] # 如果ES有設置賬號密碼,則添加下面的賬號密碼設置 #elasticsearch.username: username
#elasticsearch.
password: passwor
然后就可以啟動了:
# 啟動 kibana-7.12.0-linux-x86_64/bin/kibana
啟動之后,訪問http://ip:5601就能訪問到kibina了,kibina內部功能功能很多,像繪制圖表儀表盤等等,還有很多模擬數據,可自行了解,就是說kibina主要是通過連接ElasticSearch來查詢數據,然后將數據統計匯總呈現出圖形化的界面來方面我們進行數據分析的。
不過我們開發常用的就是它的Dev-Tools了,用來發送Restfull的請求來訪問操作ElasticSearch:
進入dev-tools后就可以自行操作了: