最近在搞elasticsearch,之前我安装了1.7版本的,很顺利。后来我准备装个5.6的,结果遇到了各种坑,所以还是总结下我跳过的每一个坑把。。。
ElasticSearch跟solr一样也是一个基于Lucene的搜索服务器,solr搭建集群的时候还需要依赖zookeeper进行集群的管理,而elasticsearch自身就带有分布式管理功能,在处理实时搜索应用时效率明显高于solr。elasticsearch和solrCloud都有索引index,和分片shard的概念,我理解的就是一个index由多个shard组成,每个shard又有多个副本,分配到每个节点上,从而缓解在一台服务器的压力,也能实现分布式搜索。
elasticsearch5.x版本比之前比较坑的就是他多了很多的环境校验,首先JDK必须1.8以上的,所以我们需要先下载JDK1.8,并配置环境变量,配置环境变量这里需要注意JAVA_HOME一定要放在最前面,否则不会生效。
然后别忘了执行 source etc/profile 使环境变量配置生效,再执行java -version 查看JDK版本。
下载elasticsearch 5.6.3 tar包并解压,为了方便我先建了一个集群的目录 mkdir elasticsearchCloud01,并将解压后的文件在这个目录下复制三份模拟三个节点,命令是
cp -R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch01
cp -R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch02
cp -R elasticsearch-5.6.3/. /elasticsearchCloud/elasticsearch03
然后就是修改每个的配置文件 vim config/elasticsearch.yml
主要是修改:cluster.name: vnb 这个是集群的名字,每个节点这个名字要一致
node.name: node-1 节点名字,其他两个我配置的是node-2,node-3
network.host: 192.168.200.5 这里是服务器的ip
http.port: 9200 端口号,其他两个我分别配置的是8200,和7200
http.cors.enabled: true 允许跨域 REST 请求,配置这里主要是让head插件可以跨域访问es
http.cors.allow-origin: "*" 指定rest请求来自何处,这里配置的是*
node.master: true 是否是主节点,这个设置true ,其他两个设置false
node.data: true 指示节点是否为数据节点
配置好后,接下来我就启动主节点,cd到elasticsearch01下,启动./bin/elasticsearch,然后第一个坑开始了,启动报错如下:
什么?elasticsearch5.x版本竟然不允许用root用户启动?什么逻辑?没办法我只能切换到普通用户,su wang,然后用wang这个用户启动elasticsearch,结果报错如下:
好吧,wang这个用户没有权限,我的错。。切换到root用户,赋予elasticsearchCloud01目录下的所有文件和目录的主给wang:
chown -R wang ../elasticsearchCloud01
然后再次切换到wang用户,启动elasticsearch,结果报错如下:
问题是无法创建本地线程问题,用户最大可创建线程数太小,好吧,切换到root用户,vi /etc/security/limits.d/90-nproc.conf,修改* soft nproc 2048
注意上面有两个问题,第二个system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
问题原因:因为Centos6不支持SecComp,而ES5.x默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动,所以在elasticsearch.yml里更改
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
再次切换到wang用户,启动elasticsearch,然后又报这个错
elasticsearch5.x默认分配jvm空间大小为2g,所以修改jvm空间分配,vim config/jvm.options,修改为:
-Xms512m
-Xmx512m
在重新启动,结果还是不行。。。
vim config/elasticsearch.yml
增加配置:node.max_local_storage_nodes: 256 保存退出,重新启动:这回终于好了,浏览器返回如下信息:
接下来就是配置head插件了,具体配置可以参考,http://blog.csdn.net/m0_37886429/article/details/68924087,讲的蛮详细的。。。
head插件配置好后,启动三个ES,再启动head插件,然后在浏览器访问可以看到ES界面:
那些年我遇到的坑:
这个是我复制个节点的时候,把data下了数据也一起复制过来了,解决办法,删除data下的数据。
config/elasticsearch.yml配置说明:
cluster.name:elasticsearch #集群的名称,同一个集群该值必须设置成相同的
node.name:"es2" #该节点的名字
node.master:true #该节点有机会成为master节点
node.data:true #该节点可以存储数据
node.rack:rack2 #该节点所属的机架
index.number_of_shards:5 #shard的数目
index.number_of_replicas:3 #数据副本的数目
network.bind_host:0.0.0.0 #设置绑定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.209 #设置其他节点与该节点交互的IP地址
network.host:10.0.0.209 #该参数用于同时设置bind_host和publish_host
transport.tcp.port:9300 #设置节点之间交互的端口号
transport.tcp.compress:true #设置是否压缩tcp上交互传输的数据
http.port:9200 #设置对外服务的http端口号
http.max_content_length:100mb #设置http内容的最大大小
http.enabled:true #是否开启http服务对外提供服务
discovery.zen.minimum_master_nodes:2 #设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.ping.timeout:120s #设置集群中自动发现其他节点时ping连接的超时时间
discovery.zen.ping.multicast.enabled:true #设置是否打开多播发现节点
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"] #设置集群中的Master节点的初始列表,可以通过这些节点来自动发现其他新加入集群的节点
接下来就是在java代码中实现了,我在本地搭建了一个springboot的工程,结合api实现也是很简单的。