部署5.x版本的ES
下载 Elasticsearch5.x ES 官网下载
环境需求:
es5.x版本 不能以root用户运行es,需增加普通用户,此例新加用户es
JDK 1.8
useradd es
修改系统参数
1 vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
2 vi /etc/security/limits.d/90-nproc.conf
找到如下内容:
* soft nproc 1024
修改为
* soft nproc 2048
3 vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
4 文件打开数,要求大于65535
ulimit -n 65536
普通用户进入解压安装包。
tar -zxvf elastic*.tar.gz
在本机中找一个存储空间比较大的磁盘,如 /data,在该目录下执行以下命令
mkdir -p /data/es5/{data,logs}
用于存放es的数据和日志文件
ES参数配置
elasticsearch.yml是elasticsearch主要的配置文件,所有的配置都在这个文件里完成,一般情况下,默认的配置已经可以比较好地运行一个集群了,但你也可以对其进行微调。下面对其比较常见的一部分参数做一些说明:
Cluster
- cluster.name
集群名称,如果有多个集群,那么每个集群名就得是唯一的。
Node
1.node.data
集群中的节点名称,比如前面说的82、83、84三台机子每台都有一个名称,你也可以不设这个名称,默认的集群启动时会自己给每个节点初始化一个名称,但强烈建议这里还是由自己设置比较好。
2.node.master
该节点是否是master,true表示是的,false表示否,默认是true.
3.node.data
该节点是否存储数据,默认true表示是的。
说明:对于上面两个节点,如果你希望该节点只是一个master,但不存储数据,则应当设置为:
node.master: true
node.data: false
如果你希望该节点只存储数据,但不是一个master,则应该设置:
node.master: false
node.data: true
如果你既不希望该节点为一个master,也不想它存储数据,则应该设置为:
node.master: false
node.data: false
这种情况一般是你希望该节点仅仅是作为一个搜索负载均衡器,比如从各节点得到数据,聚合结果等。
Index
1. index.number_of_shards
设置一个索引被分成的分片数,默认是5
2.index.number_of_replicas
设置一个索引有几个拷贝,默认为1。拷贝指的是其它节点对该节点的拷贝,比如在84上创建了一个索引,那么这个拷贝会存在于82和83上,这是一个分布式的属性。
拷贝越多,则搜索性能越佳,而分片越多则索引创建性能越好。
Paths
1.path.conf
配置文件目录,默认为es根目录下的config目录。
2.path.data
索引存储路径,默认为es根目录下的data目录,可以有多个存储路径,各存储路径用逗号隔开,如:path.data: /path/to/data1,/path/to/data2
3.path.work
临时文件存放目录,默认为es根目录下的work目录
4.path.logs
日志文件存放目录,默认为es根目录下的logs目录。
5.path.plugins
插件的安装目录,默认为es根目录下的plugins目录。
Network And HTTP
1.network.bind_host
Es节点绑定的地址,为一个ip地址(IPv4或IPv6)
2.network.publish_host
Es发布的地址,其它节点通过这个地址与其进行通信
3.network.host
该节点网络地址,也是一个ip地址,如果设置了该属性,则network.bind_host与network.publish_host都不用再设置了,比如我这里三台机子设置的值分别为:
118.200.108.82、118.200.108.83、118.200.108.84。
4.transport.tcp.port
节点之间通信的端口,默认为9300,在我们应用程序中调用es的方法提交索引创建时也是使用的这个端口。
5.http.port
http访问端口,默认是9200,通过这个端口,调用方可以索引查询请求。
6.http.max_content_length
设置内容的最大容量,默认是100MB
7.http.enabled
是否禁止http访问,默认是false。
Discovery
1 discovery.zen.minimum_master_nodes
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)。
2 discovery.zen.ping.timeout
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错
3 discovery.zen.ping.multicast.enabled
设置是否打开多播来发现来发现节点,默认是true
4 discovery.zen.ping.unicast.hosts
配置 config/elasticsearch.yml 文件
# ---------------------------------- Cluster -----------------------------------
#定义es集群名称
cluster.name: es5-cluster
# ------------------------------------ Node ------------------------------------
#定义该节点的名称,各个节点不能重复
node.name: es1
# ----------------------------------- Paths ------------------------------------
#配置数据目录
path.data: /data1/hadoop/es5/data
#配置日志目录
path.logs: /data1/hadoop/es5/logs
# ----------------------------------- Memory -----------------------------------
#关闭锁定内存
bootstrap.memory_lock: false
# ---------------------------------- Network -----------------------------------
#指定本机IP地址,每个节点都要修改
network.host: 192.168.1.222
#指定http访问端口
http.port: 9200
# --------------------------------- Discovery ----------------------------------
#广播地址
discovery.zen.ping.unicast.hosts: ["es1:9300", "es2:9300", "es3:9300"]
discovery.zen.minimum_master_nodes: 3
# 增加新的参数,这样head插件可以访问es
http.cors.enabled: true
http.cors.allow-origin: "*"
配置bin/elasticsearch文件
#由于es5.0依赖的是jdk8,所以需要下载jdk8并指定PAHT路径
export PATH=/home/hadoop/jdk1.8.0_101/bin:$PATH
export JAVA_HOME=/home/hadoop/jdk1.8.0_101
export ES_HOME=/home/hadoop/elasticsearch-5.0.0
启动
./bin/elasticsearch -d
可能遇到的问题:
问题一:
[2016-11-06T16:27:21,712][WARN ][o.e.b.JNANatives ] unable to install syscall filter:
Java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMPandCONFIG_SECCOMP_FILTERcompiledinatorg.elasticsearch.bootstrap.Seccomp.linuxImpl(Seccomp.java:349) ~[elasticsearch-5.0.0.jar:5.0.0]
at org.elasticsearch.bootstrap.Seccomp.init(Seccomp.java:630) ~[elasticsearch-5.0.0.jar:5.0.0]
原因:报了一大串错误,大家不必惊慌,其实只是一个警告,主要是因为你Linux版本过低造成的。
解决方案:
1、重新安装新版本的Linux系统
2、警告不影响使用,可以忽略
问题二:
ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
原因:无法创建本地文件问题,用户最大可创建文件数太小
解决方案:
切换到root用户,编辑limits.conf配置文件, 添加类似如下内容:
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
备注:* 代表Linux所有用户名称(比如 hadoop)
保存、退出、重新登录才可生效
问题三:
max number of threads [1024] for user [es] likely too low, increase to at least [2048]
原因:无法创建本地线程问题,用户最大可创建线程数太小
解决方案:切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件。
vi /etc/security/limits.d/90-nproc.conf
找到如下内容:
* soft nproc 1024
修改为
* soft nproc 2048
问题四:
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
原因:最大虚拟内存太小
解决方案:切换到root用户下,修改配置文件sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
然后重新启动elasticsearch,即可启动成功。
问题五:
ElasticSearch启动找不到主机或路由
原因:ElasticSearch 单播配置有问题
解决方案:
检查ElasticSearch中的配置文件
vi config/elasticsearch.yml
找到如下配置:
discovery.zen.ping.unicast.hosts:[“192.168..:9300”,”192.168..:9300”]
一般情况下,是这里配置有问题,注意书写格式
问题六:
org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream
原因:ElasticSearch节点之间的jdk版本不一致
解决方案:ElasticSearch集群统一jdk环境
问题七:
Unsupported major.minor version 52.0
原因:jdk版本问题太低
解决方案:更换jdk版本,ElasticSearch5.0.0支持jdk1.8.0
问题八:
bin/elasticsearch-plugin install license
ERROR: Unknown plugin license
原因:ElasticSearch5.0.0以后插件命令已经改变
解决方案:使用最新命令安装所有插件
bin/elasticsearch-plugin install x-pack
5.2以上常见问题
1、启动 elasticsearch 如出现异常 can not run elasticsearch as root
解决方法:创建ES 账户,修改文件夹 文件 所属用户 组
2、启动异常:ERROR: bootstrap checks failed
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.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。详见 :https://github.com/elastic/elasticsearch/issues/22899
解决方法:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
3、启动后,如果只有本地可以访问,尝试修改配置文件 elasticsearch.yml
中network.host(注意配置文件格式不是以 # 开头的要空一格, : 后要空一格)
为 network.host: 0.0.0.0
默认端口是 9200
注意:关闭防火墙 或者开放9200端口
4、ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]
解决方法:切换到root用户,编辑limits.conf 添加类似如下内容
vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
5、max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
解决:切换到root用户,进入limits.d目录下修改配置文件。
vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
修改为
* soft nproc 2048
6、max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决:切换到root用户修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
然后,重新启动elasticsearch,即可启动成功。
7、 expected settings to start with ‘object’, instead was [VALUE_STRING]]
Exception in thread "main" ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]
at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:70)
at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:50)
at org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:50)
at org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:938)
at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:927)
at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:102)
at org.elasticsearch.bootstrap.Bootstrap.initialEnvironment(Bootstrap.java:230)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112)
at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122)
at org.elasticsearch.cli.Command.main(Command.java:88)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82)
Refer to the log for complete error details.
可能原因是 elasticsearch.yml配置文件格式上有细微的错误。
例如
cluster.name:es-cluster (错误)冒号后少一个空格
cluster.name: es-cluster (正确)
8 Could not find JavaVersionChecker
[es@master bin]$ ./elasticsearch
Error: Could not find or load main class org.elasticsearch.tools.JavaVersionChecker
[es@master bin]$ cd
可能原因:es安装目录安装在root下,将es安装目录迁移至es用户目录,或其他目录,避免放在root目录
elasticsearch 6 请求头问题
"error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
"status" : 406
解办法参考:
406请求错误解析
参考:
Elasticsearch搭建–适用每天增量为3亿的数据量
如果部署中遇到问题,可以提问,互相交流!