Elasticsearch7.x 安装及集群的配置
作者:互联网
简介
首先引用 Elasticsearch (下文简称 ES)官网的一段描述:
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
本文主要介绍 Elasticsearch 集群的搭建。通过在一台服务器上创建 3 个 ES 实例来创建一个建议的 ES 集群。
Elasticsearch/ES
官方的Elasticsearch Reference 提供了不同版本的文档连接,真是赞!
如果英文的不想看,还提供了中文版的 Elasticsearch 2.x: 权威指南,版本不是最新的,但是了解基本概念也是有帮助的。
Elasticsearch 7.x 包里自包含了 OpenJDK 的包。如果你想要使用你自己配置好的 Java 版本,需要设置 JAVA_HOME
环境变量 —— 参考
官方文档 Set up Elasticsearch
有各个 OS 的安装指导,页面 Installing Elasticsearch 中提供了多种安装包对应的指导链接!
本文选择绿色安装包的的方式(tar.gz
)安装。
由于实验机器有限,可以在同一台机器上模拟出 3 个节点,安装 ES 集群。
安装 ES
准备工作
不能使用 root 用户启动 es,否则会报错:
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
如果需要新建用户的话可以运行 sudo adduser es
,修改 es 用户的密码:sudo passwd es
。
下载 ES 安装包
安装包下载地址:
- 官方-Past Releases 官网的下载速度龟速
- 华为镜像站 下载速度不错,推荐
下面的步骤参考 Set up Elasticsearch » Installing Elasticsearch » Install Elasticsearch from archive on Linux or MacOS,选择的安装包是 elasticsearch-7.3.0 版本。
# 下载安装包
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz
wget https://mirrors.huaweicloud.com/elasticsearch/7.3.0/elasticsearch-7.3.0-linux-x86_64.tar.gz.sha512
# 验证安装包的完整性,如果没问题,会输出 OK
shasum -a 512 -c elasticsearch-7.3.0-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.3.0-linux-x86_64.tar.gz
# 将目录复制三份,作为三个节点,后面配置 ES 集群时,对应了三个 ES 实例
cp -R elasticsearch-7.3.0 es-7.3.0-node-1
cp -R elasticsearch-7.3.0 es-7.3.0-node-2
mv elasticsearch-7.3.0 es-7.3.0-node-3
# 因为以 root 用户启动不了 ES
chown -R es es-7.3.0*
如果是 Mac 平台,则下载包 elasticsearch-{version}-darwin-x86_64.tar.gz
。
MacOS Catalina 在你第一次运行 ES 时,会弹出对话框阻止运行,你需要到设置-》安全隐私中允许才行。为了阻止这种告警,可以运行如下的命令:xattr -d -r com.apple.quarantine <$ES_HOME or archive-or-directory>
$ES_HOME
是指 ES 的安装包 tar 包解压后的文件夹目录。
解压后的目录组成:
.
├── bin # 二进制脚本存放目录,包括 elasticsearch 来指定运行一个 node,包括 elasticsearch-plugin 来安装 plugins
├── config # 包含了 elasticsearch.yml 配置文件
├── data # 节点上分配的每个 index/分片 的数据文件
├── lib
├── LICENSE.txt
├── logs
├── modules
├── NOTICE.txt
├── plugins # 插键文件存放的位置
└── README.textile
运行 Elasticsearch
我们先运行一个节点,创建 ES 单机版实例:
./bin/elasticsearch
如果要将 ES 作为守护程序运行,请在命令行中指定 -d
,指定 -p
参数,将进程 ID 记录到 pid
文件:
./bin/elasticsearch -d -p pid
日志在 $ES_HOME/logs
目录中。
如果要停止 ES,运行如下的命令:
pkill -F pid
检查一下运行状态
curl -X GET "localhost:9200/?pretty"
或者在浏览器中访问 localhost:9200
都可以,会返回:
{
"name": "node-1",
"cluster_name": "appsearch-7.3.2",
"cluster_uuid": "GlzI_v__QJ2s9ewAgomOqg",
"version": {
"number": "7.3.0",
"build_flavor": "default",
"build_type": "tar",
"build_hash": "de777fa",
"build_date": "2019-07-24T18:30:11.767338Z",
"build_snapshot": false,
"lucene_version": "8.1.0",
"minimum_wire_compatibility_version": "6.8.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
如果你是在远端服务器上部署的 ES,那么,此时在你本地的工作机上还无法调通 <IP>:9200
,需要对 ES 进行相关配置才能访问,下文会介绍。
ES 配置相关
官网关于配置的内容主要有两处:
Elasticsearch 主要有三个配置文件:
配置文件主要位于
$ES_HOME/config
目录下,也可以通过ES_PATH_CONF
环境变量来修改
YAML 的配置形式参考:
path:
data: /var/lib/elasticsearch
logs: /var/log/elasticsearch
设置也可以按如下方式展平:
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
JVM 配置
JVM 参数设置可以通过 jvm.options
文件(推荐方式)或者 ES_JAVA_OPTS
环境变量来修改。
jvm.options
位于
$ES_HOME/config/jvm.options
当通过tar
orzip
包安装/etc/elasticsearch/jvm.options
当通过 Debian or RPM packages
官网也介绍了如何设置堆大小。
默认情况,ES 告诉 JVM 使用一个最小和最大都为 1GB 的堆。但是到了生产环境,这个配置就比较重要了,确保 ES 有足够堆空间可用。
ES 使用 Xms(minimum heap size)
和 Xmx(maxmimum heap size)
设置堆大小。你应该将这两个值设为同样的大小。
Xms
和 Xmx
不能大于你物理机内存的 50%。
设置的示例:
-Xms2g
-Xmx2g
elasticsearch.yml 配置
ES 默认会加载位于 $ES_HOME/config/elasticsearch.yml
的配置文件。
备注:任何能够通过配置文件设置的内容,都可以通过命令行使用 -E
的语法进行指定,例如:
./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
通过
-E
会覆盖掉elasticsearch.yml
中的配置。
cluster.name
cluster.name
设置集群名称。一个节点只能加入一个集群中,默认的集群名称是 elasticsearch
。
cluster.name: search-7.3.2
确保节点的集群名称要设置正确,这样才能加入到同一个集群中。上面示例就自定义了集群名称为 appsearch-7.3.2。
node.name
node.name
:可以配置每个节点的名称。用来提供可读性高的 ES 实例名称,它默认名称是机器的 hostname
,可以自定义:
node.name: node-1
同一集群中的节点名称不能相同
network.host
network.host
:设置访问的地址。默认仅绑定在回环地址 127.0.0.1
和 [::1]
。如果需要从其他服务器上访问以及多态机器搭建集群,我们需要设定 ES 运行绑定的 Host,节点需要绑定非回环的地址。建议设置为主机的公网 IP 或 0.0.0.0
:
network.host: 0.0.0.0
更多的网络设置可以阅读 Network Settings
http.port
http.port
默认端口是 9200 :
http.port: 9200
注意:这是指 http 端口,如果采用 REST API 对接 ES,那么就是采用的 http 协议
transport.port
REST 客户端通过 HTTP 将请求发送到您的 Elasticsearch 集群,但是接收到客户端请求的节点不能总是单独处理它,通常必须将其传递给其他节点以进行进一步处理。它使用传输网络层(transport networking layer)执行此操作。传输层用于集群中节点之间的所有内部通信,与远程集群节点的所有通信,以及 Elasticsearch Java API 中的 TransportClient。
transport.port
绑定端口范围。默认为 9300-9400
transport.port: 9300
因为要在一台机器上创建是三个 ES 实例,这里明确指定每个实例的端口。
discovery.seed_hosts
discovery.seed_hosts
:发现设置。有两种重要的发现和集群形成配置,以便集群中的节点能够彼此发现并且选择一个主节点。官网/Important discovery and cluster formation settings
discovery.seed_hosts
是组件集群时比较重要的配置,用于启动当前节点时,发现其他节点的初始列表。
开箱即用,无需任何网络配置, ES 将绑定到可用的环回地址,并将扫描本地端口 9300 - 9305
,以尝试连接到同一服务器上运行的其他节点。 这无需任何配置即可提供自动群集的体验。
如果要与其他主机上的节点组成集群,则必须设置 discovery.seed_hosts
,用来提供集群中的其他主机列表(它们是符合主机资格要求的master-eligible
并且可能处于活动状态的且可达的,以便寻址发现过程)。此设置应该是群集中所有符合主机资格的节点的地址的列表。 每个地址可以是 IP 地址,也可以是通过 DNS 解析为一个或多个 IP 地址的主机名(hostname
)。
当一个已经加入过集群的节点重启时,如果他无法与之前集群中的节点通信,很可能就会报这个错误
master not discovered or elected yet, an election requires at least 2 nodes with ids from
。因此,我在一台服务器上模拟三个 ES 实例时,这个配置我明确指定了端口号。
配置集群的主机地址,配置之后集群的主机之间可以自动发现(可以带上端口,例如 127.0.0.1:9300
):
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301"]
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
必须至少配置 [discovery.seed_hosts,discovery.seed_providers,cluster.initial_master_nodes]
中的一个。
cluster.initial_master_nodes
cluster.initial_master_nodes
: 初始的候选 master 节点列表。初始主节点应通过其 node.name
标识,默认为其主机名。确保 cluster.initial_master_nodes
中的值与 node.name
完全匹配。
首次启动全新的 ES 集群时,会出现一个集群引导/集群选举/cluster bootstrapping步骤,该步骤确定了在第一次选举中的符合主节点资格的节点集合。在开发模式下,如果没有进行发现设置,此步骤由节点本身自动执行。由于这种自动引导从本质上讲是不安全的,因此当您在生产模式下第一次启动全新的群集时,你必须显式列出符合资格的主节点。也就是说,需要使用 cluster.initial_master_nodes
设置来设置该主节点列表。重新启动集群或将新节点添加到现有集群时,你不应使用此设置
在新版 7.x 的 ES 中,对 ES 的集群发现系统做了调整,不再有
discovery.zen.minimum_master_nodes
这个控制集群脑裂的配置,转而由集群自主控制,并且新版在启动一个新的集群的时候需要有cluster.initial_master_nodes
初始化集群主节点列表。如果一个集群一旦形成,你不该再设置该配置项,应该移除它。该配置项仅仅是集群第一次创建时设置的!集群形成之后,这个配置也会被忽略的!
cluster.initial_master_nodes
该配置项并不是需要每个节点设置保持一致,设置需谨慎,如果其中的主节点关闭了,可能会导致其他主节点也会关闭。因为一旦节点初始启动时设置了这个参数,它下次启动时还是会尝试和当初指定的主节点链接,当链接失败时,自己也会关闭!
因此,为了保证可用性,预备做主节点的节点不用每个上面都配置该配置项!保证有的主节点上就不设置该配置项,这样当有主节点故障时,还有可用的主节点不会一定要去寻找初始节点中的主节点!
关于 cluster.initial_master_nodes
可以查看如下资料:
其他
集群的主要配置项上面已经介绍的差不多了,同时也给出了一些文档拓展阅读。实际的生产环境中,配置稍微会复杂点,下面补充一些配置项的介绍。需要说明的是,下面的一些配置即使不配置,ES 的集群也可以成功启动的。
下文节点角色会对上文中的 node.master
等配置做了介绍。如果本地仅是简单测试使用,上文中的 node.master/node.data/node.ingest
不用配置也没影响。
节点角色
Node
默认情况,一个节点 Node 包含下面所有的角色:master-eligible, data, ingest, and machine learning (if available)
。
节点类型 | 配置参数 | 默认值 |
---|---|---|
master eligible | node.master | true |
data | node.data | true |
ingest | node.ingest | true |
coodrinating only | 无 | 设置上面三个参数全部为 false |
machine learning | node.ml | true (需要 enable x-pack) |
随着群集的增长,尤其是如果您有大量机器学习工作,需要考虑将具有主机资格(master-eligible
)的节点专用,将它与专用数据的节点(data nodes
)和专用机器学习的节点(machine learning nodes
)分开。
我理解,这里的专用(dedicated
)一词就是表示,将一个节点的角色不要设置那么多,主节点资格的节点就是用于当主节点,而不是同时设置数据节点的角色!
- 开发环境中,一个节点可以承担多种角色
- 生产环境中,应该设置单一的角色的节点(dedicated node)
本文 ES 是 7.3.0 版本,查看官方文档,发现 ES 7.9.0 的配置和它是有点区别的。
master-eligible node
master-eligible node
:默认值就是 true
,意味着每个节点启动后,默认就是一个 Master eligible 节点。具有该角色的节点表示它有资格被选举为 mater node
。备注:eligible
一词表示符合条件的含义。
主节点负责维护集群的状态,集群范围内的轻量级操作(只有 Master 节点才能修改集群的状态信息),例如:
- 创建或删除索引,
- 跟踪哪些节点是集群的一部分
- 确定将哪些分片分配给哪些节点
- 分片的路由信息
任意节点都能修改信息,会导致数据的不一致性
拥有稳定的主节点对于群集健康非常重要。
在主节点选举过程中,任何一个非 voting-only
的 master-eligible
节点都可能被选为主节点。
很好理解,如果已经是「仅是选举」用途的节点,它怎么能称为主节点呢?
索引和搜索数据是占用大量CPU,内存和 I/O 的工作,这可能给节点的资源带来压力。为了确保主节点稳定且不受压力,在较大的群集中,最好将符合角色的专用主节点和专用数据节点分开。
尽管主节点还可以充当协调节点(coordinating nodes
),将搜索和索引请求从客户端路由到数据节点,但最好不要为此目的使用专用的主节点。对于符合主节点要求的节点,其工作量应尽可能少,这对于群集的稳定性很重要。
概括来讲就是,主节点的机器不要身兼数职,不要给主节点配置其他节点角色,以免影响主节点的稳定性!
# 可选为主节点(默认是 true)
node.master: true
# voting_only 角色不启用(默认也是 false)
node.voting_only: false
# data 角色不启用 (默认是 true)
node.data: false
# inges 角色不启用(默认是 true)
node.ingest: false
# ml 角色不启用(默认是 true)
node.ml: false
# xpack.ml.enabled 默认是启用的
xpack.ml.enabled: true
# 默认是 true
cluster.remote.connect: false
xpack 功能时付费功能,因此,一般情况下,可以忽略 xpack 的设置。
一个集群中可以有多个 master 节点,active 的 master 节点只有一个!
Voting-only master-eligible node
一个具有 voting-only
master-eligible
两种角色的节点,它是参与主节点的选举但不会充当主节点的节点。特别指出,voting-only
可以在选举中为决胜局服务。
要配置一个具有主机资格的节点为 voting-only
节点,需要如下配置
# 默认是 false
node.voting_only: true
注意:OSS-only 分布式版本不支持 voting-only 角色。只有 master-eligible 的节点才能标记为 voting-only 角色!这里虽然有点难理解,但是由于历史原因造成的。
一个高可用的集群(HA —— High Avaliablity clusters)至少需要 3 个 master-eligible
角色的节点、至少 2 个不是 voting-only
节点。这样的集群将能够在一个主节点故障时选出一个主节点。
一个具有 voting-only
master-eligible
两种角色的节点同样也可以赋予其他的角色。例如,一个节点可以同时赋予 voting-only
master-eligible
data
3 种角色。专用于 voting-only
master-eligible
的节点配置如下:
node.master: true
# 默认不启用,需要设置为 false
node.voting_only: true
node.data: false
node.ingest: false
node.ml: false
xpack.ml.enabled: true
cluster.remote.connect: false
Data Node
数据节点包含您已建立索引的文档的分片。数据节点处理与数据相关的操作,例如:
- CRUD,
- 搜索和聚合。
数据节点在数据扩展上起到了至关重要的作用
这些操作是 I/O,内存和 CPU 密集型的。监视这些资源并在过载时添加更多数据节点非常重要。
具有专用数据节点的主要好处是将主节点角色和数据节点角色分开。 参考如下配置:
# 默认是 true
node.master: false
# 默认是 false
node.voting_only: false
# 默认是 true
node.data: true
# 默认是 true
node.ingest: false
# 默认是 true
node.ml: false
# 默认是 true
cluster.remote.connect: false
Ingest Node
接收节点(Ingest nodes
)可以执行由一个或多个接收处理器组成的预处理管道。根据摄取处理器执行的操作类型和所需的资源,拥有专用的摄取节点可能会很有意义,这些节点仅会执行此特定任务。
Ingest 节点也称为预处理节点。
node.master: false
node.voting_only: false
node.data: false
node.ingest: true
node.ml: false
cluster.remote.connect: false
Ingest Node,可以用来承担一些数据管道的数据转换工作,例如,为你的文档增加一个新的字段,例如帮转换文档中的字段。
Coordinating only nodes
如果您不具备处理主节点职责、保存数据和预处理文档的能力,那么你就剩下一个仅可路由请求的协调节点角色(coordinating only nodes
),处理搜索缩减阶段、分配批量索引的。本质上,coordinating only nodes 可充当智能负载平衡器。
- 负责接受 Client 的请求,将请求分发到合适的节点,最终把结果汇集到一起。
- 每个节点默认都起到了 Coordinating Node 的职责
仅协调节点也称为负载均衡节点或 Client 节点
在集群中添加过多的仅协调节点可能会增加整个集群的负担,因为选择的主节点必须等待每个节点的集群状态更新确认!仅协调节点的好处不应被夸大 —— 数据节点可以很好地达到相同的目的。
为了创建一个仅协调节点(coordinating only node),可以如下配置:
node.master: false
node.voting_only: false
node.data: false
node.ingest: false
node.ml: false
cluster.remote.connect: false
其他节点类型
- Hot & Warm Node
- 不同硬件配置的 Data Node,用来实现 Hot & Warm 架构,降低集群部署的成本
- Machine Learning Node
- 负责跑机器学习的 Job,用来做异常检测
单一职责节点
一个节点只承担一个角色,总结图:
参考
- [官宣-Elasticsearch Reference 7.3] » Modules » Node
- learnku-笔记五十二:集常见的集群部署方式
- Elasticsearch集群规划求助
创建集群
实验机器有限,我们在同一台机器上创建三个 ES 实例来创建集群,分别明确指定了这些实例的 http.port
和 transport.port
。**discovery.seed_hosts
**明确指定实例的端口对测试集群的高可用性很关键。
如果后期有新节点加入,新节点的
discovery.seed_hosts
没必要包含所有的节点,只要它里面包含集群中已有的节点信息,新节点就能发现整个集群了。
集群配置预览
分别进入es-7.3.0-node-1
、es-7.3.0-node-2
和 es-7.3.0-node-3
的文件夹,config/elasticsearch.yml
设置如下:
# es-7.3.0-node-1
cluster.name: search-7.3.2
node.name: node-1
node.master: true
node.data: false
node.ingest: false
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
cluster.initial_master_nodes: ["node-1"]
# es-7.3.0-node-2
cluster.name: search-7.3.2
node.name: node-2
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9201
transport.port: 9301
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
# es-7.3.0-node-3
cluster.name: search-7.3.2
node.name: node-3
node.master: true
node.data: true
node.ingest: false
network.host: 0.0.0.0
http.port: 9202
transport.port: 9302
discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
node-1 节点仅仅是一个 master 节点,它不是一个数据节点。
经过上面的配置,可以通过命令 egrep -v "^#|^$" config/elasticsearch.yml
检查配置项。
先启动 node-1 节点,因为它设置了初始主节点的列表。这时候就可以使用 http://<host IP>:9200/
看到结果了。然后逐一启动 node-2 和 node-3。通过访问 http://127.0.0.1:9200/_cat/nodes
查看集群是否 OK:
192.168.3.112 25 87 13 4.29 dm - node-3
192.168.3.112 26 87 16 4.29 dm - node-2
192.168.3.112 35 87 16 4.29 m * node-1
http://127.0.0.1:9200/_nodes
将会显示节点更多的详情信息
插键显示结果:
五角星表示该节点是主节点,圆圈表示该节点是数据节点
有没有发现,我并没有给 node-2
和 node-3
明确指定端口,为什么在一台机器上也成功启动了这两个节点?
因为 Elasticsearch 会取用 9200~9299 这个范围内的端口,如果 9200 被占用,就选择 9201,依次类推。
补充:其实,还有一个简单的方法模拟创建集群(该方法我未测试,仅供参考)。
我们首先将上面运行的三个节点停止掉,然后进入 es-7.3.0-node-1
文件夹下:
mkdir -p data/data{1,2,3}
./bin/elasticsearch -E node.name=node-1 -E cluster.name=appsearch-7.3.2 -E path.data=data/data1 -E path.logs=logs/logs1 -d -p pid1
./bin/elasticsearch -E node.name=node-2 -E cluster.name=appsearch-7.3.2 -E path.data=data/data2 -E path.logs=logs/logs2 -E http.port=9201 -d -p pid2
./bin/elasticsearch -E node.name=node-3 -E cluster.name=appsearch-7.3.2 -E path.data=data/data3 -E path.logs=logs/logs3 -E http.port=9202 -d -p pid3
安装插键
# 查看已经安装的插键列表
bin/elasticsearch-plugin list
# 安装一个国际化分词插键
bin/elasticsearch-plugin install analysis-icu
如果插键安装慢,可以先下载下来,再安装:
wget https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-7.3.0.zip
./bin/elasticsearch-plugin install file://file path Of analysis-icu-7.1.0.zip
如下 API 也可以查看 ES 插键列表:
http://127.0.0.1:9200/_cat/plugins
一个三个节点的 ES 集群,如果安装插件则需要三个节点都安装
ES-FAQ
Q1:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p
Q2:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
sudo vim /etc/security/limits.conf
# 加入以下内容
* soft nofile 300000
* hard nofile 300000
* soft nproc 102400
* soft memlock unlimited
* hard memlock unlimited
Q3:master_not_discovered_exception
主节点指定的名字要保证存在,别指定了不存在的节点名。
总结
本文是通过 tar 包方式安装的,安装目录相对集中、配置方便。用 RPM 包安装的话,可以直接用 systemctl 的命令查看 ES 状态、对其重启等。
参考
- learnku/Elasticsearch中文文档-7.3版本 推荐
- ES-CN 官网/Elasticsearch 集群协调迎来新时代 对于 ES7 的集群发现机制介绍较为详细,推荐
- 程序羊-CentOS7上ElasticSearch安装填坑记 FAQ 有帮助
- 搭建ELFK日志采集系统
- 静觅—Ubuntu 搭建 Elasticsearch 6 集群流程
- ELK 架构之 Elasticsearch 和 Kibana 安装配置
- 使用 ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践
- 手把手教你,在CentOS上安装ELK,进行服务器日志收集
标签:node,Elasticsearch7,集群,elasticsearch,master,安装,节点,ES 来源: https://blog.csdn.net/agonie201218/article/details/120861004