Elasticsearch集群部署(从入门到进阶)

目录

1 概念

1.1 Cluster 集群

1.2 Node 节点

1.3 Shard 分片

2 集群搭建

2.1 准备环境

2.2 集群配置

2.3 启动集群和测试

3 集群管理


1 概念

此处以 Elasticsearch 7 为示例说明,以下说到的各种配置参数和名字都是以 Elasticsearch 7 的为准。

Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索和检索你的数据。只要你发现你的ES集群已经快达到所能承受的极限(内存不够/磁盘空间不够等),你都可以横向地实时扩展你地ES集群,通过增加ES服务数量来增加内存和磁盘空间。

1.1 Cluster 集群

由一组关联的节点组成的,称为一个集群。

一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,只有相同集群名的节点才会组成一个集群,集群名称可以在配置文件中指定(cluster.name)。集群中有多个节点,各个节点通过集群名在网络中发现同伴组成集群,其中有一个为主节点,这个主节点是可以通过选举产生的,在具有成为主节点的候选节点(node.master: true,discovery.seed_hosts)中选举产生的,除了主节点外的其他节点都可以称为从节点,但是主从节点是对于集群内部来说的。ElasticSearch的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说,因为从外部来看ElasticSearch集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ElasticSearch集群通信是等价的,即每一个节点都知道文档存在于哪个节点上,可以转发请求到相应的节点上。

 

1.2 Node 节点

节点存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字(node.name)。一个节点也可以是集群,即单节点集群。每一个运行实例称为一个节点,即是一个ES服务,或称一个服务进程,每一个运行实例既可以在同一个机器上,也可以在不同的机器上。在测试环境中可以在一台服务器上运行多个ES服务,但是在生产环境中建议每台服务器运行一个ES服务。

节点分有五种,候选主节点(Master-eligible)、数据节点(Data)、Ingest节点、机器学习节点(Machine learning)和协调节点。其中,我们这里只要知道Master-eligible和Data即可,Ingest和协调节点做简要说明,Machine learning暂不说明。

候选主节点(Master-eligible)

有资格被选举为集群主节点的节点,通过在这些节点中选举产生集群的主节点。主节点负责集群范围内的轻量级操作,如创建或删除索引,跟踪哪些节点是集群的一部分以及确定将哪些分片分配给哪些节点,即主节点相当于一个集群的指挥官。拥有稳定的主节点对于群集健康非常重要。

在索引和搜索数据的时候都会占用比较大的CPU、内存和IO来工作,这可能会对节点的资源带来压力。因此,为了确保主节点的稳定,若是在较大的集群中,我们可以将主节点和其他节点,如数据节点等分开。

仅做候选主节点的配置:

node.master: true
node.data: false 
node.ingest: false 
node.ml: false

 

数据节点(Data)

数据节点是存储数据的,包含建立了索引的文档的分片。同时也是处理与数据相关的操作,如CRUD、聚合和搜索等,这些操作都需要占用较大的CPU、内存和IO,故监视这些资源并在过载时新增更多的数据节点非常重要。

仅做数据节点的配置:

node.master: false
node.data: true 
node.ingest: false 
node.ml: false

 

Ingest节点

Ingest 节点可以看作是数据前置处理转换的节点,支持 pipeline管道设置,可以对数据进行过滤、转换等操作,类似于 logstash 中 filter 的作用,功能相当强大。

基本原理:节点接收到数据之后,根据请求参数中指定的管道流 id,找到对应的已注册管道流,对数据进行处理,然后将处理过后的数据,按照 Elasticsearch 标准的 indexing 流程继续运行。

仅做Ingest节点的配置:

node.master: false
node.data: false 
node.ingest: true
node.ml: false

 

协调节点

搜索请求在两个阶段中执行(query 和 fetch),这两个阶段由接收客户端请求的节点 - 协调节点协调。

  • 在请求阶段,协调节点将请求转发到保存数据的数据节点。 每个数据节点在本地执行请求并将其结果返回给协调节点。
  • 在收集fetch阶段,协调节点将每个数据节点的结果汇集为单个全局结果集。

仅做协调节点的配置:

node.master: false
node.data: false 
node.ingest: false 
node.ml: false

 

1.3 Shard 分片

在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上(分片数创建索引时指定,创建后不可改了。备份数可以随时改)。索引分片,ElasticSearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。分片的好处:

  • 允许我们水平切分/扩展容量。
  • 可在多个分片上进行分布式的、并行的操作,提高系统的性能和吞吐量。

需要注意的是,每个分片本质上就是一个Lucene索引,因此会消耗相应的CPU、内存和IO资源。

分片配置策略

ES推荐的最大JVM堆空间是30~32G,所以把你的分片最大容量限制为30GB,然后再对分片数量做合理估算。例如,你觉得你的数据能达到200GB, 推荐你最多分配7到8(200/30)个分片。
在开始阶段,一个比较好的方案是根据你的数据节点数量按照1.5~3倍的原则来创建分片。例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会自动平衡分片的放置。
对于基于日期的索引需求,并且对索引数据的搜索场景非常少。也许这些索引量将达到成百上千,但每个索引的数据量只有1GB甚至更小。对于这种类似场景,建议只需要为索引分配1个分片。如日志管理就是一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。

 

备份(Replication)

一个分片可以有多个备份(副本),备份数可以随时改。好处:

  • 高可用扩展搜索的并发能力、吞吐量。
  • 搜索可以在所有的副本上并行运行。

 

主分片(primary shard)

每个文档都存储在其中一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后复制到不同的副本中。默认情况下,一个索引有5个主分片。你可以在事先制定分片的数量,当分片一旦建立,分片的数量则不能修改。

 

副本分片(replica shard)

每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:

  • 增加高可用性,当主分片故障的时候,可以从副本分片中选择一个作为主分片。
  • 提高性能,当查询的时候可以到主分片或者副本分片中进行查询。默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态的配置增加。副本必须部署在不同的节点上,不能部署在和主分片相同的节点上。

 

2 集群搭建

2.1 准备环境

(1)准备了3台服务器搭建ES集群:192.168.17.137、192.168.17.139 和 192.168.17.136 。

(2)分别在这三台机器上安装java8或java11,这里以java8作为例子,具体安装步骤网上一搜一大把,这里就不多说了。

(3)分别在这三台机器上安装Elasticsearch7.5.0,具体安装可查看之前的文档 https://blog.csdn.net/qq_15092079/article/details/81411334

 

2.2 集群配置

集群的配置,其实就config目录下面的 elasticsearch.yml、jvm.options 和 log4j2.properties 三个文件的配置。

elasticsearch.yml

配置以192.168.17.137的为例子说明,其他两个服务器的配置也是类似,这里就不列出来了。一个简单的集群这里只简单配置几个选项,其他都可以直接使用默认的。若需知道具体这些配置项的意义,可继续看下面的说明。

cluster.name: es-cluster

# 节点名称,每个节点的都不一样
node.name: node-1

path.data: /usr/softwares/elasticsearch-7.5.0/data

path.logs: /usr/softwares/elasticsearch-7.5.0/logs

# 节点ip,每个节点的都不一样
network.host: 192.168.17.137

http.port: 9200
transport.port: 9333

http.cors.enabled: true
http.cors.allow-origin: "*"

node.master: true
node.data: true

discovery.seed_hosts: ["192.168.17.137", "192.168.17.136", "192.168.17.139"]

配置参数说明(标红为重点需要理解的参数):

参数说明
cluster.name: es-clusterES集群名称,同一个集群内的所有节点集群名称必须保持一致
node.name: node-1ES集群内的节点名称,同一个集群内的节点名称要具备唯一性
node.master: true是否为候选主节点,允许节点是否可以成为一个master节点,ES是默认集群中的第一台机器成为master,如果这台机器停止就会重新选举(默认true)
node.data: true是否为数据节点,允许该节点存储索引数据(默认true)
node.ingest: true

是否为ingest节点,允许该节点对数据进行前置处理转换,支持管道设置(默认true)

 

node.ml: true是否为机器学习节点(Machine learning),允许该节点进行机器学习(默认true)。若在未来你想要集群能够进行机器学习,除了这个参数得设为true外,另外 xpack.ml.enabled 参数也得设为true,在所有的候选主节点上。这两个参数的默认值都是true。
path.data:/usr/softwares/elasticsearch-7.5.0/data数据存储目录,ES是搜索引擎,会创建文档,建立索引,此路径是索引的存放目录。可以指定多个存储位置
path.logs:/usr/softwares/elasticsearch-7.5.0/logselasticsearch专门的日志存储位置
network.host: 192.168.17.137ES服务所在IP地址,HTTP端口和集群通信端口就会监听在此地址上
http.port: 9200定义ES对外调用的http端口,默认是9200
http.cors.enabled: true是否开启跨域访问
http.cors.allow-origin: "*"开启跨域访问后的地址限制,*表示无限制
transport.port: 9300

集群节点间的tcp通信端口,默认就是9300。集群节点间是以netty-transport方式通信的,好处是异步非阻塞,大大提高了并发率。

discovery.seed_hosts: ["192.168.17.137", "192.168.17.136", "192.168.17.139"]Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点,由discovery.zen.ping.unicast.hosts(ES7中已废弃)参数改变而来,并且防止脑裂现象的discovery.zen.minimum_master_nodes参数也在ES7中被遗弃,ES7会自动动态地分配这个参数值以防止脑裂现象。
cluster.initial_master_nodes: ["192.168.17.137", "192.168.17.136", "192.168.17.139"]Elasticsearch7新增参数,参数设置一系列符合主节点条件的节点的主机名或 IP 地址来引导启动集群。集群在第一次选举中应该使用的一组符合主节点条件的节点作为选举配置。这就是所谓的集群引导,只在首次形成集群时才需要。已经加入集群的节点将选举配置存储在它们的数据文件夹中,并在重新启动后重用这些配置,而正在加入现有集群的新节点可以从集群的当前主节点接收这些信息,故新加入集群的节点可以不用配置此参数。
bootstrap.memory_lock: true在ES运行起来后锁定ES所能使用的堆内存大小,锁定内存大小一般为可用内存的一半左右;锁定内存后就不会使用交换分区。如果不打开此项,当系统物理内存空间不足,ES将使用交换分区,ES如果使用交换分区,那么ES的性能将会变得很差。具体的内存大小可在jvm.options中配置。
index.number_of_shards设置默认索引分片个数,默认为5片。
index.number_of_replicas设置默认索引副本个数,默认为1个副本。
network.tcp.no_delay: true是否启用tcp无延迟,true为启用tcp不延迟,默认为false启用tcp延迟
truenetwork.tcp.keep_alive: true是否启用TCP保持活动状态,默认为true
network.tcp.reuse_address: true是否应该重复使用地址。默认true,在Windows机器上默认为false
network.tcp.send_buffer_size: 128mbtcp发送缓冲区大小,默认不设置
network.tcp.receive_buffer_size: 128mbtcp接收缓冲区大小,默认不设置
transport.tcp.port: 9301设置集群节点通信的TCP端口,默认就是9300,与transport.port作用一样。
transport.tcp.compress: true设置是否压缩TCP传输时的数据,默认为false
http.max_content_length: 200mb设置http请求内容的最大容量,默认是100mb
discovery.zen.minimum_master_nodes: 2在Elasticsearch7.0版本已被移除,配置无效,为了避免脑裂,集群的最少节点数量为,集群的总节点数量除以2加一
discovery.zen.fd.ping_timeout: 120s在Elasticsearch7.0版本已被移除,配置无效。探测超时时间,默认是3秒,我们这里填120秒是为了防止网络不好的时候ES集群发生脑裂现象
discovery.zen.fd.ping_retries: 6在Elasticsearch7.0版本已被移除,配置无效。探测次数,如果每次探测90秒,连续探测超过六次,则认为节点该节点已脱离集群,默认为3次
discovery.zen.fd.ping_interval: 15s在Elasticsearch7.0版本已被移除,配置无效。节点每隔15秒向master发送一次心跳,证明自己和master还存活,默认为1秒太频繁
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]在Elasticsearch7.0版本已被移除,配置错误。写入候选主节点的设备地址,来开启服务时就可以被选为主节点。默认主机列表只有127.0.0.1和IPV6的本机回环地址。上面是书写格式,discover意思为发现,zen是判定集群成员的协议,unicast是单播的意思,ES5.0版本之后只支持单播的方式来进行集群间的通信,hosts为主机
cluster.fault_detection.leader_check.interval: 15sElasticsearch7新增参数,设置每个节点在选中的主节点的检查之间等待的时间。默认为1秒
discovery.cluster_formation_warning_timeout: 30sElasticsearch7新增参数,启动后30秒内,如果集群未形成,那么将会记录一条警告信息,警告信息未master not fount开始,默认为10秒
cluster.join.timeout: 30sElasticsearch7新增参数,节点发送请求加入集群后,在认为请求失败后,再次发送请求的等待时间,默认为60秒
cluster.publish.timeout: 90sElasticsearch7新增参数,设置主节点等待每个集群状态完全更新后发布到所有节点的时间,默认为30秒
cluster.routing.allocation.cluster_concurrent_rebalance: 32集群内同时启动的数据任务个数,默认是2个
cluster.routing.allocation.node_concurrent_recoveries: 32添加或删除节点及负载均衡时并发恢复的线程个数,默认4个
cluster.routing.allocation.node_initial_primaries_recoveries: 32初始化数据恢复时,并发恢复线程的个数,默认4个

 

jvm.options

可根据各个服务器实际可用的内存,配置ES的使用堆内存,默认最大内存和最小内存均是1g。一般此内存设置为服务器总可用内存的一半(即50%的策略设置),并且不能超过32GB(由于jvm的特性,内存对象指针压缩技术)。

设置ES运行的最大和最小堆内存为500m。

-Xms500m
-Xmx500m

设置ES运行的java版本为8到9,且最大和最小堆内存为500m。

8-9:-Xms500m
8-9:-Xmx500m

设置ES运行的java版本为大于等于8,且最大和最小堆内存为500m。

8-:-Xms500m
8-:-Xmx500m

 

log4j2.properties

ES服务的日志记录配置文件,与log4j的形式配置,这里不多做说明。

 

2.3 启动集群和测试

启动

启动集群,首先得从其中一个候选主节点入手启动,第一个被启动的候选主节点将会被优先选举为主节点。

我这里先后启动顺序为:192.168.17.137、192.168.17.139 和 192.168.17.136。

在elasticsearch的根目录下,切换对应用户,后台运行ES服务。

cd es的根目录

su es用户

./bin/elasticsearch -d

 

启动成功的主节点日志截图:

 

测试

分别输入地址:

http://192.168.17.137:9200/

http://192.168.17.139:9200/

http://192.168.17.136:9200/

页面返回,此处以node-2节点为例:

证明Elasticsearch集群已经成功启动运行。

 

停止

先停止所有非主节点,最后才停止主节点。

# 查找es的进程号
jps
# 直接停止此进程
kill -9 es进程号

 

3 集群管理

可以通过安装相应版本的kibana来进行ES的监控和管理。具体安装流程可以见之前的文档 https://blog.csdn.net/qq_15092079/article/details/81411334

 

 

 

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值