ElasticSearch的配置和安装
前提申明:本次部署测试用的是elasticsearch-5.3.0,依赖1.8或1.8以上的JDK版本
(1)安装Java JDK并配置CLASSPATH,PATH,JAVA_HOME环境变量
(2)到ES官网https://www.elastic.co/downloads/elasticsearch上下载ES的zip包,解压即可。
(3)启动
执行./bin/elasticsearch即可在前台启动ES,或者执行./bin/elasticsearch -d在后台启动ES
(4)测试
在浏览器中输入http://x.x.x.x:9200,即可看到:

备注:如果在远程主机上访问http://x.x.x.x:9200,需要在${ES_HOME}/config/elasticsearch.yml中将network.host的配置打开,且将后面ip修改为0.0.0.0
ElasticSearch的常见配置项
ElasticSearch的配置文件为${ES_HOME}/config/elasticsearch.yml,一般来说,ElasteSearch集群不需要配置太多东西,使用缺省的配置就可以了。
(1)cluster.name
集群的名称。如果没有配置,默认为elasticserach. cluster.name相同的elasticsearch节点,会自动组成一个名称为cluster.name的配置值的ElasticSearch集群
(2)node.name
节点的名称。如果没有配置,ElasticSearch会在你的节点启动的时候随机给它指定一个名字。ElasticSearch节点每次启动时,都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的。因此我们需要在配置文件中人为定义一个有意义的节点名称。
(3)path.data
指定es节点的数据存放路径,可以通过path.data: /path/to/data1,/path/to/data2的形式指定多个目录,当然也可以只指定一个目录。默认是存储在${ES_HOME}/data
(4)path.logs
指定es节点的运行日志存放路径。默认存储在${ES_HOME}/logs
(5)path.plugins
指定es的插件存放路径。默认是放到${ES_HOME}/plugins
(6)transport.tcp.port
设置节点间的交互的tcp端口,默认是9300
(7)http.port
设置集群对外服务的http端口,默认为9200
(8)node.master
指定该节点是否有资格被选举成为master节点,默认是true. es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master
(9)node.data
指定该节点是否存储索引数据,默认为true.
(10)index.number_of_shards
设置默认索引分片个数,默认为5片
(11)index.number_of_replicas
设置默认索引副本replica个数,默认为1个副本
(12)http.enabled
是否使用http协议对外提供服务,默认为true
(13)ElasticSearch重启恢复方面的配置
假设我们的集群有10个节点,现在我们要对10个节点进行升级并重启,假设5个节点先正常启动了,这五个节点会相互通信,选出一个 master,从而形成一个集群。 然后集群发现数据不再均匀分布,因为有5 个节点在集群中丢失了,所以他们之间会立即启动分片复制。这时,另外的5个节点启动完成了,这些节点会发现它们的数据正在被复制到其他节点,所以他们删除本地数据(因为这份数据要么是多余的,要么是过时的)。 然后整个集群重新进行平衡,因为集群的大小已经从5变成了10。对比有TB量级的ElasticSearch集群,这种来回地数据移动,无疑会大量消耗集群计算或网络资源。通常我们在通过配置如下的参数来缓解这种情况:
gateway.recover_after_nodes: 8
gateway.expected_nodes: 10
gateway.recover_after_time: 5m
上述参数表示,满足如下条件之一集群才开始进行数据恢复:一是集群在线的节点数为10个;二是集群在线的节点数至少为8个,且等待5分钟
(14)discovery.zen.minimum_master_nodes
ElasticSearch集群一旦建立起来以后,会选举出一个master,其他都为slave节点。当配置了discovery.zen.minimum_master_nodes参数后,当集群面临重新选主时,所有可能成为master的节点的集合(仲裁集)要大于等于discovery.zen.minimum_master_nodes。所以一般来说,discovery.zen.minimum_master_nodes设置为(master_eligible_nodes / 2) + 1,其中master_eligible_nodes表示node.master=true的节点数,因此可以避免一个ES集群出现脑裂的问题(所谓脑裂指的是,集群中某些节点脱离了集群后,自动组成一个新的集群。这样的话,原来的一个集群就变成了两个集群,会导致一些不确定的问题发生)。
比如我们集群有5个节点,我们需要配置discovery.zen.minimum_master_nodes=(5/2)+1=3,所以当这个集群中有2个节点断连脱离集群后,不会选主成功,当然也不会成为一个独立的集群。而另外3个节点可以选主成功,从而组成一个单独的集群。
备注:
1 | node.master=true & node.data=true —— 表示节点既可以是master节点,也可以是data节点 |
ElasticSearch的最佳实践
(1)部署ElasticSearch的机器,64GB内存的机器是非常理想的,但是32GB和16GB机器也是很常见的。少于8GB会适得其反(你最终需要很多很多的小机器),大于64GB的机器也会有问题。
(2)当ElasticSearch集群已经在生产环境中,如果这时需要修改集群的配置参数,可以有两种方式:一种是修改配置,然后重启ES实例;一种是使用ES的HTTP API直接修改内存中的配置,不需要重启。当然推荐第二种方式来修改集群参数。
(3)ElasticSearch中有索引有type的概念,建议一个index就配置一个type就好了。ES中type的概念逐渐弱化,到ES6.0时候,可能就没有type的概念了。
ES安装与配置常见问题
(1)elasticsearch安装和配置问题
elasticsearch出于安全的考虑,不允许使用root账户启动,所以要为elasticsearch单独创建账户。命令如下:
1 | useradd elasticsearch |
(2)无法使用http://192.168.65.239:9200/来测试,需要修改config/elasticsearch.yml中network.host: 192.168.0.1,改成network.host: 0.0.0.0
(3)出现failed to resolve local host, fallback to loopback错误,因为hostname没有在/etc/hosts中,需要将机器名追加到/etc/hosts中127.0.0.1这一行的后面
(4)elasticsearch开启了9200和9300两个端口,9200是提供的http接口,9300是其他的非http接口。如果是用flume的sink往elasticsearch中写的话,需要使用9300端口
(5)http://www.jianshu.com/p/89f8099a6d09
今天开工,在看ES时候发现前几天已经发布了5.2.0,就安装了一下,岂料安装完一直启动不了,可以说是一个bug。报错如下:
[2017-05-09T13:19:18,665][INFO ][o.e.b.BootstrapChecks ] [sgw-node-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
ERROR: bootstrap checks failed
max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
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.2.0默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
对于max file descriptors和max number of threads的问题,可以修改/etc/security/limits.conf,配置如下:
* soft nofile 65536
* hard nofile 65536
elasticsearch soft nproc 16384
elasticsearch hard nproc 32768
对于vm.max_map_count的问题,可以修改/etc/sysctl.conf,配置如下:
vm.max_map_count=262144
ElasticSearch中的一些闲杂知识
(1)在ElasticSearch中一个文档有很多的字段Field,在ES中文档不仅包括数据本身,还包括一些元数据Metadata,例如_index/_type/_id. 其中_index表示文档所属索引名称,_type表示文档属于索引的哪个类型,_id表示文档的id,id可以自己指定,也可以由ES集群自动生成。在一个ElasticSearch集群中三元组(_index, _type, _id)唯一确定一个文档。
(2)ElasticSearch的一些内置字段

(3)关于ES heap设置,官方建议ES的内存不要超过系统可用内存的一半,并且不要超过32GB。https://elasticsearch.cn/article/32
(4)在config/jvm.options中可以修改ElasticSearch JAVA应用的heap大小
生产环境中ES集群全局配置修改方式
(1)修改配置文件并重启集群的每个节点
修改config/elasticsearch.yml静态文件,然后重启集群的每个节点。这个方式比较粗暴,生产环境中不建议使用。
(2)使用动态更新集群配置(Cluster Update Settings)API
使用动态更新就集群配置(Cluster Update Settings)API,又有两种,即一种是瞬时Transient生效,另一种是永久Persistent生效。
A)瞬时Transient
这些变更在集群重启之前一直会生效。一旦整个集群重启,这些配置就被清除。操作方法如下:
1 | PUT /_cluster/settings |
B)永久Persistent
这些变更会永久存在直到被显式修改。即使全集群重启它们也会存活下来,当和静态配置config/elasticsearch.yml有冲突时,会覆盖掉静态配置文件里的选项。操作方法如下:
1 | PUT /_cluster/settings |