对于想要学习ES的人来说, 集群是一个不得不谈的话题, 而且就目前的形式来说, 越来越要求开发人员会用分布式. 对于ES来说, 由于其本身对分布式集群已经支持的相当完善, 已经屏蔽了大多数的服务发现, fallover等. 但是学习集群首先要有一个集群, 对于大多数人来说, 还是希望在本地运行一个集群. 所以本篇是在笔者查阅了大量资料之后, 经过尝试总结的在ES 7.x版本下如何在单节点下运行ES集群.
阅读本文你将学会:
- 通过将ES复制多份实现单节点集群部署
- 通过使用启动参数(Options)部署单节点集群
- 使用Docker部署单节点集群
- Elasticsearch7目录详解
- Elasticsearch7配置详解
- 部署Elasticsearch7时需要修改的操作系统参数
- ……
在单台服务器部署多个ElasticSearch节点
在单台服务器上部署多个ES节点的方法不止一种, 如果在有docker的运行环境下使用docker来部署是最干净,快捷的. 而笔者想找到通过命令行在启动时读入配置文件启动的方法, 结果最后发现此功能在6.x版本已经被废除, 坑啊!
废话不多说了, 下面来看如何在单节点下部署多个ES节点.
一. 复制多份ES副本, 通过修改配置文件启动
这个方法是最为简单粗暴的, 在任何版本下都可以使用! 下面来详细介绍一下.
1. 首先将ES文件复制两份
我的ES安装在/opt/目录下, 你在使用时应该修改为自己的安装路径
1 | # 复制 |
2. 修改配置文件
配置文件默认在%ES_HOME/config下面, 我们要修改的是elasticsearch.yml文件, 配置如下:
1 | # node-1的配置文件 |
*注: *这个配置是很简单的配置, 生产环境中的配置文件更为复杂, 如果想要查看配置文件的全部参数, 可以查看官方文档或网上相关信息, 这里不再赘述!
3. 启动节点
分别在elasticSearch的根目录下执行
1 | ./bin/elasticsearch |
运行节点.
以笔者为例, 我先启动了node-1服务, 然后启动了node-2服务. 之后通过命令:
1 | GET /_cluster/health |
查看集群健康状况则返回:
1 | { |
或者使用kibana打开浏览器进入Stack Monitoring中查看, 如下图所示:

可以看到的确有两个节点在工作, 集群启动成功!
4. 启动时可能出现的问题
Error: with the same id but is a different node instance
如果之前在复制时的文件目录中以及存在data数据了, 则在从节点启动时, 可能会发生节点冲突的错误! 因为之前节点的信息已经被保存在data文件夹中了
*解决方法: *删除data目录即可!
二. 使用启动参数(Options)启动
由于每次启动一个节点都要复制所有的ES文件, 可以说相当的麻烦, 所以有没有更为简单的方法, 可以通过多个配置文件分别启动一个节点.
对于这种情况, 笔者在网上搜集了很多信息, 答案是: 分版本!
对于5.x以下版本: 可通过对Java添加
-Des.default.path.conf=/etc/elasticsearch启动参数根据指定的配置文件目录启动, 其中/etc/elasticsearch即为你实际的配置文件目录. 如:1
2
3
4
5
6
7
8
9
10${JAVA_HOME}/bin/java \
-Des.pidfile=/path/xxx.pid \
-Des.default.path.home=/path/xxx \
-Des.default.path.logs=/path/logs \
-Des.default.path.data=/path/data \
-Des.default.path.work=/path/work \
-Des.default.path.conf=/path/config \
-Des.path.home=/path/xxx \
-cp :/path/xxx.jar \
org.elasticsearch.bootstrap.Elasticsearchelasticsearch启动类有两个,分别是Elasticsearch和ElasticsearchF,其中F代表foreground,区别是在前台进程运行还是后台进程运行,以及日志是存储在日志文件中还是显示在控制台中,System.setProperty(“es.foreground”,
“yes”)用来指定foreground。
两个启动类最终都是调用Bootstrap的静态main方法来启动elasticsearch对于5.x版本, 可以使用elasticsearch的启动参数启动, 添加
-- default.path.conf=/etc/elasticsearch. 如:1
./bin/elasticsearch --default.path.conf=/etc/elasticsearch
或使用elasticsearch的
-E参数修改配置启动. 如:1
./bin/elasticsearch -E path.conf=/etc/elasticsearch
对于上面这两种方法, 笔者不确定是哪个, 因为在笔者7.x版本下, 都启动失败!
对于6.x版本及以上, 恭喜你, 你再也无法使用配置文件直接启动啦!(丢!)
对于删除
path.conf参数官方给出的解释:
path.confis no longer a configurable settingeditPrevious versions of Elasticsearch enabled setting
path.confas a setting. This was rather convoluted as it meant that you could start Elasticsearch with a config file that specified viapath.confthat Elasticsearch should use another config file. Instead, to configure a custom config directory, use theES_PATH_CONFenvironment variable.官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/breaking_60_packaging_changes.html
中文翻译ES6.0变化: Elasticsearch 6.0 重大变化
简单翻译过来就是: 之前版本可以通过path.conf来指定配置文件启动, 这相当复制?! 所以在新的版本中你丫的就别用了. 你可以通过配置ES_PATH_CONF环境变量启动.
而在官方的配置文档中, 也确实推荐通过配置ES_PATH_CONF环境变量来配置ElasticSearch, 并且提供了在ES运行时替换配置的API.
ES 7.4官方文档Configuring Elasticsearch
那就真的没有办法在启动时通过命令行指定参数启动了吗? 答案是: 有, 但是非常不推荐!
可以简单通过下面的命令启动一个master节点:
1 | bin/elasticsearch -E node.data=false -E node.master=true -E node.name=NoData |
即通过-E <key=value>指定启动参数, 所以理论上可以通过这种方式修改启动参数来启动集群.
但是笔者强烈不推荐这种方式, 因为: 首先,通过命令行构建所有启动参数的方法很不直观, 而且容易产生错误; 其次, 启动多个集群要敲多个命令行, 很是麻烦; 最后, 这是一个相当不优雅的解决方法!
在官方文档也提到了: 提供
-E <key=value>启动参数的目的是用来修改一些和集群配置无关的配置项, 不推荐使用-E来修改和集群相关的配置!
所以还是最好还是使用docker进行单节点启动, 既优雅也方便!
三. 使用docker
使用docker创建集群的方法相当的简单.
1. 拉取镜像
1 | sudo docker pull elasticsearch:7.4.0 |
2. 分别启动es1和es2
1 | docker run --name=es1 -p 9200:9200 -p 9300:9300 -v /home/zk/workspace/ElasticSearch_Learn/cluster_config/node-1.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.4.0 |
1 | docker run --name=es2 -p 9201:9201 -p 9301:9301 -v /home/zk/workspace/ElasticSearch_Learn/cluster_config/node-2.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.4.0 |
注意: 和启动单节点少了个参数
-e "discovery.type=single-node", 但是多了一个参数-v /path/to/custom_conf.yml:/usr/share/elasticsearch/config/elasticsearch.yml具体启动参数及如何启动可查看官方文档: Install Elasticsearch with Docker
通过docker的-v参数可以指定通过本地配置的方式来启动容器! 同时, 在容器中对映射文件/usr/share/elasticsearch/config/elasticsearch.yml做出的修改同时也会修改镜像外的文件!!!
所以在docker中可以通过使用配置文件来启动elasticSearch集群, 但前提是要知道集群IP等信息!
*启动后出现容器自动关闭问题: *
查看容器日志信息,看最后面发现一个error:
1 | docker logs -f 容器id |
首先检查内存问题: 尤其如果是在虚拟机环境下运行, 由于elasticsearch5.x后版本默认配置会创建一个2g的内存, 所以可能会导致内存不足导致无法启动!
修改系统的内存分配:
1
2
3
4
5
6
7# 查看max_map_count :
cat /proc/sys/vm/max_map_count
65530
# 设置max_map_count:
sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
(删除之前不能运行的容器)重新创建容器的时候加上:
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"给elasticsearch分配2g的内存即完整的命令为:
docker run -di --name=自定义名字 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:版本号最后重启容器:docker start 容器id或名字
通常docker启动数秒钟之后就关闭往往都是因为服务在容器中出现了某些异常而导致启动失败!
此时可以通过:
docker logs -f 容器id来打印相关日志获取异常信息. 修改之后再重新启动即可!
3. 分别查询es1和es2容器的IP
1 | $ docker inspect es1 |
1 | $ dokcer inspect es2 |
可以获取到在集群内部的两个节点的虚拟IP信息: 172.17.0.2和172.17.0.3!
4. 进入es1和es2容器中,修改配置文件
1 | # 节点一 |
1 | $ docker exec -it 24b4802a5952a9c53d352ed3f011c8cf16d6cd442997c5705ac43bcedc2d9b71 /bin/sh -c "[ -e /bin/bash ] && /bin/bash || /bin/sh" |
本次集群配置文件采用的是最新版本的(7.x版本)配置方法, 具体集群配置方法在以后会讲解.
此外需要注意的是, 这里的IP是docker容器自己的IP,而不是宿主机的IP!
如果不使用上面的配置方式, 在7.x版本中, 有可能会无法选举主节点. (笔者也是折腾了好久才让集群跑起来!)
常见的错误有:
[cluster.initial master nodes] is empty on this node;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等.
需要注意的是其中的一些参数,
- cluster.name: 集群名称, 在一个集群中的节点配置必须相同!
- network.host: 主机地址
- node.name: 本节点名称
- discovery.seed_hosts: Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点,由discovery.zen.ping.unicast.hosts:参数改变而来
- cluster.initial_master_nodes: Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点
- http.cors.enabled: 开启跨域访问支持,默认为false
- http.cors.allow-origin: 跨域访问允许的域名地址,(允许所有域名)以上使用正则
5. 重启es1和es2容器
修改容器内部的配置文件后, 可通过restart命令重新启动
1 | docker restart es1 es2 |
6. 查看集群健康状态
等待两个集群启动完毕之后, 可以通过curl命令查看集群情况:
1 | zk@jasonkay:~$ curl 172.17.0.2:9200/_cat/health |
即集群部署成功!
四. Elasticsearch7配置详解
1. 目录介绍
ElasticSearch压缩文件解压后的目录结构如下所示
1 | zk@jasonkay:/opt$ ls /opt/elasticsearch-7.3.2/ |
- bin目录:二进制脚本启动es程序文件以及启动es插件目录
- config目录:elasticsearch配置文件
- data目录:默认Elasticsearch生成的索引/切片数据文件存放目录,可以指定多个位置来存储数据
- lib目录:一些开发的jar包
- logs目录:elasticsearch日志目录
- modules目录:模块目录
- plugins目录:elasticsearch插件目录,此版本tar包装后默认无插件
下面对这些目录做一一介绍.
bin目录
1 | zk@jasonkay:/opt/elasticsearch-7.3.2/bin$ ll |
config目录
1 | zk@jasonkay:/opt/elasticsearch-7.3.2$ ll config/ |
jdk目录
此目录里面就像是我们解压过的JDK一样,官网给出,es集成的JDK默认只为es服务,如果我们系统想要使用es所集成的jdk版本,我们需要添加环境变量至此目录。当然我们也可以自己安装我们系统中所需的JDK版本。
1 | zk@jasonkay:/opt/elasticsearch-7.3.2$ ll jdk/ |
由上可见, ElasticSearch所带有的为OpenJDK12!
2. elasticsearch.yml配置文件详解
1 | r/local/elasticsearch-7.0.0/config/elasticsearch.yml |
注意:关于Elasticsearch7更多配置参数请看官网:https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-discovery-settings.html
关于Elasticsearch6到Elasticsearch7的区别请看:https://www.dockerc.com/elasticsearch7-coordination/
3. jvm.options配置文件详解
1 | #堆内存配置 |
五. 其他配置
1. 创建elasticsearch用户组
elasticsearch默认是不能以root身份去运行的,否则启动会报错误信息为can not run elasticsearch as root Elasticsearch,所以我们要创建一个普通用户来管理elasticsearch!当然这也是elasticsearch为安全着想的一种方式
1 | # 创建elasticsearch用户组 |
2. 改文件描述符数量
因为elasticsearch对文件描述符的限制至少为65536,所以我们必须要修改系统的文件描述符数量
1 | echo '* soft nofile 65536' >> /etc/security/limits.conf |
3. 修改max_map_count值
在linux系统上,elasticsearch默认使用hybrid mmapfs / niofs来存储索引文件,因此操作系统主要会通过mmap来限制存储的空间,因此如果存储空间满了,那么会抛出异常,我们可以使用如下命令来更改设置。
1 | # 临时设置: |
4. 添加内存分配字段
当我们启动ES时,有可能会报错为无法分配内存字段
1 | echo '* soft memlock unlimited' >> /etc/security/limits.conf |
附录
文章参考:
- ElasticSearch学习–单机如何启动多节点集群
- ElasticSearch5.5.1 单台服务器部署多个节点
- ElasticSearch多节点模式的搭建
- 搭建elsticsearch集群 报错with the same id but is a different node instance解决办法
- Elasticsearch 6.0 命令行Option -E启动报错,求大佬指导,感谢
- Elasticsearch源码分析-启动过程浅析
- Elasticsearch 6.0 重大变化
- 官方文档6.2版本更新
- ES 7.4官方文档Configuring Elasticsearch
- 如何在ElasticSearch中有多个节点?
- 使用elasticSearch+kibana+logstash+ik分词器+pinyin分词器+繁简体转化分词器 6.5.4 启动 ELK+logstash概念描述
- Elasticsearch 集群启动多节点 + 解决ES节点集群状态为yellow
- elasticsearch 7 单机配置
- curl命令操作ElasticSearch总结
- Install Elasticsearch with Docker
- docker安装elasticsearch5.0和6.0容器自动关闭问题–解决
- Elasticsearch7.x版本集群部署-疲惫的后生-51CTO博客