最近在搞elasticsearch术陶,之前我安裝了1.7版本的凑懂,很順利。后來我準(zhǔn)備裝個(gè)5.6的瞳别,結(jié)果遇到了各種坑征候,所以還是總結(jié)下我跳過的每一個(gè)坑把。祟敛。疤坝。
ElasticSearch跟solr一樣也是一個(gè)基于Lucene的搜索服務(wù)器,solr搭建集群的時(shí)候還需要依賴zookeeper進(jìn)行集群的管理馆铁,而elasticsearch自身就帶有分布式管理功能跑揉,在處理實(shí)時(shí)搜索應(yīng)用時(shí)效率明顯高于solr。elasticsearch和solrCloud都有索引index埠巨,和分片shard的概念历谍,我理解的就是一個(gè)index由多個(gè)shard組成,每個(gè)shard又有多個(gè)副本辣垒,分配到每個(gè)節(jié)點(diǎn)上望侈,從而緩解在一臺服務(wù)器的壓力,也能實(shí)現(xiàn)分布式搜索勋桶。
elasticsearch5.x版本比之前比較坑的就是他多了很多的環(huán)境校驗(yàn)脱衙,首先JDK必須1.8以上的侥猬,所以我們需要先下載JDK1.8,并配置環(huán)境變量捐韩,配置環(huán)境變量這里需要注意JAVA_HOME一定要放在最前面退唠,否則不會生效。
然后別忘了執(zhí)行 source etc/profile 使環(huán)境變量配置生效荤胁,再執(zhí)行java -version 查看JDK版本瞧预。
下載elasticsearch 5.6.3 tar包并解壓,為了方便我先建了一個(gè)集群的目錄 mkdir?elasticsearchCloud01仅政,并將解壓后的文件在這個(gè)目錄下復(fù)制三份模擬三個(gè)節(jié)點(diǎn)垢油,命令是
cp ?-R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch01?
cp ?-R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch02
cp ?-R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch03
然后就是修改每個(gè)的配置文件 vim config/elasticsearch.yml
主要是修改:cluster.name: vnb ?這個(gè)是集群的名字,每個(gè)節(jié)點(diǎn)這個(gè)名字要一致
node.name: node-1 節(jié)點(diǎn)名字已旧,其他兩個(gè)我配置的是node-2秸苗,node-3
network.host: 192.168.200.5 ?這里是服務(wù)器的ip
http.port: 9200 端口號,其他兩個(gè)我分別配置的是8200运褪,和7200
http.cors.enabled: true ?允許跨域 REST 請求,配置這里主要是讓head插件可以跨域訪問es
http.cors.allow-origin: "*" ?指定rest請求來自何處玖瘸,這里配置的是*
node.master: true ?是否是主節(jié)點(diǎn)秸讹,這個(gè)設(shè)置true ,其他兩個(gè)設(shè)置false
node.data: true ?指示節(jié)點(diǎn)是否為數(shù)據(jù)節(jié)點(diǎn)
配置好后雅倒,接下來我就啟動(dòng)主節(jié)點(diǎn)璃诀,cd到elasticsearch01下,啟動(dòng)./bin/elasticsearch蔑匣,然后第一個(gè)坑開始了劣欢,啟動(dòng)報(bào)錯(cuò)如下:
什么?elasticsearch5.x版本竟然不允許用root用戶啟動(dòng)裁良?什么邏輯凿将?沒辦法我只能切換到普通用戶,su wang价脾,然后用wang這個(gè)用戶啟動(dòng)elasticsearch牧抵,結(jié)果報(bào)錯(cuò)如下:
好吧,wang這個(gè)用戶沒有權(quán)限侨把,我的錯(cuò)犀变。。切換到root用戶秋柄,賦予elasticsearchCloud01目錄下的所有文件和目錄的主給wang:
chown -R wang ../elasticsearchCloud01
然后再次切換到wang用戶获枝,啟動(dòng)elasticsearch,結(jié)果報(bào)錯(cuò)如下:
問題是無法創(chuàng)建本地線程問題,用戶最大可創(chuàng)建線程數(shù)太小骇笔,好吧省店,切換到root用戶机隙,vi /etc/security/limits.d/90-nproc.conf,修改* soft nproc 2048
注意上面有兩個(gè)問題萨西,第二個(gè)system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
問題原因:因?yàn)镃entos6不支持SecComp有鹿,而ES5.x默認(rèn)bootstrap.system_call_filter為true進(jìn)行檢測,所以導(dǎo)致檢測失敗谎脯,失敗后直接導(dǎo)致ES不能啟動(dòng)葱跋,所以在elasticsearch.yml里更改
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
再次切換到wang用戶,啟動(dòng)elasticsearch源梭,然后又報(bào)這個(gè)錯(cuò)
elasticsearch5.x默認(rèn)分配jvm空間大小為2g,所以修改jvm空間分配娱俺,vim?config/jvm.options,修改為:
-Xms512m
-Xmx512m
在重新啟動(dòng)废麻,結(jié)果還是不行荠卷。。烛愧。
vim config/elasticsearch.yml
增加配置:node.max_local_storage_nodes: 256 保存退出油宜,重新啟動(dòng):這回終于好了,瀏覽器返回如下信息:
接下來就是配置head插件了怜姿,具體配置可以參考慎冤,http://blog.csdn.net/m0_37886429/article/details/68924087,講的蠻詳細(xì)的沧卢。蚁堤。。
head插件配置好后但狭,啟動(dòng)三個(gè)ES披诗,再啟動(dòng)head插件,然后在瀏覽器訪問可以看到ES界面:
那些年我遇到的坑:
這個(gè)是我復(fù)制個(gè)節(jié)點(diǎn)的時(shí)候立磁,把data下了數(shù)據(jù)也一起復(fù)制過來了呈队,解決辦法,刪除data下的數(shù)據(jù)息罗。
config/elasticsearch.yml配置說明:
cluster.name:elasticsearch #集群的名稱掂咒,同一個(gè)集群該值必須設(shè)置成相同的
node.name:"es2" #該節(jié)點(diǎn)的名字
node.master:true #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data:true #該節(jié)點(diǎn)可以存儲數(shù)據(jù)
node.rack:rack2 #該節(jié)點(diǎn)所屬的機(jī)架
index.number_of_shards:5 #shard的數(shù)目
index.number_of_replicas:3 #數(shù)據(jù)副本的數(shù)目
network.bind_host:0.0.0.0 #設(shè)置綁定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.209 #設(shè)置其他節(jié)點(diǎn)與該節(jié)點(diǎn)交互的IP地址
network.host:10.0.0.209 #該參數(shù)用于同時(shí)設(shè)置bind_host和publish_host
transport.tcp.port:9300 #設(shè)置節(jié)點(diǎn)之間交互的端口號
transport.tcp.compress:true #設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
http.port:9200 #設(shè)置對外服務(wù)的http端口號
http.max_content_length:100mb #設(shè)置http內(nèi)容的最大大小
http.enabled:true #是否開啟http服務(wù)對外提供服務(wù)
discovery.zen.minimum_master_nodes:2 #設(shè)置這個(gè)參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個(gè)有master資格的節(jié)點(diǎn)迈喉。默認(rèn)為1绍刮,對于大的集群來說,可以設(shè)置大一點(diǎn)的值(2-4)
discovery.zen.ping.timeout:120s #設(shè)置集群中自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn)時(shí)ping連接的超時(shí)時(shí)間
discovery.zen.ping.multicast.enabled:true #設(shè)置是否打開多播發(fā)現(xiàn)節(jié)點(diǎn)
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"] #設(shè)置集群中的Master節(jié)點(diǎn)的初始列表挨摸,可以通過這些節(jié)點(diǎn)來自動(dòng)發(fā)現(xiàn)其他新加入集群的節(jié)點(diǎn)
接下來就是在java代碼中實(shí)現(xiàn)了孩革,我在本地搭建了一個(gè)springboot的工程,結(jié)合api實(shí)現(xiàn)也是很簡單的得运。