admin管理员组

文章数量:1624797

😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: Linux搭建elasticsearch-7.8.0集群 ⏱️ @ 创作时间: 2022年07月03日

目录

  • 1、前言
  • 2、集群搭建
    • 2.1 搭建说明
    • 2.2 集群搭建
  • 3、集群高可用
    • 3.1 分片分配
    • 3.2 节点宕机
    • 3.3 节点拓展
    • 3.4 手动迁移分片
    • 3.5 副本数拓展
  • 4、路由计算与确认
  • 5、读、写操作交互过程
    • 5.1 写操作
    • 5.2 读操作

1、前言

Cluster 集群
⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为标识

Node节点
​ ⼀个 Elasticsearch 实例即⼀个 Node,⼀台机器可以有多个实例,正常使⽤下每个实例应该会部署在不同的机器上。Elasticsearch 的配置⽂件中可以通过 node.master、node.data 来设置节点类型。

  • node.master:表示节点是否具有成为主节点的资格
    • true代表的是有资格竞选主节点
    • false代表的是没有资格竞选主节点
  • node.data:表示节点是否存储数据

分片

​ 每个索引有⼀个或多个分片,每个分⽚存储不同的数据。分片可分为主分⽚( primary shard)和副分⽚(replica shard),副分⽚是主分片的拷贝。默认每个主分片有⼀个复制分片,⼀个索引的主分片数量创建后不能被修改,副分⽚的数量可以动态地调整数量,副分⽚从不与它的主分⽚在同⼀个 节点上。

2、集群搭建

2.1 搭建说明

单机版本搭建参考:《Linux搭建elasticsearch-7.8.0单机版本》

创建集群时,需要保证单机版的elasticsearch服务搭建没有问题再进行集群搭建时,就比较容易成功,步骤可以如下:

  • 单台服务器启动多个es服务:
    如果服务器资源不够,需要在一台机器上需要启动多个elasticsearch服务时,先搭建一个es单机版服务,保证没有问题后,将es所在目录复制为多个不同的文件夹名称,并且修改配置为不同的端口,当这些复制出来的es服务,都独自成功启动后,就可以进行集群搭建。
  • 多台服务器启动多个es服务:
    先在一台服务器上搭建elasticsearch服务,保证没有问题后,将es所在目录复制到其他服务器上,当这些复制出来的es服务,都独自成功启动后,就可以进行集群的配置了。

2.2 集群搭建

1、搭建单机版
由于服务器资源不足,本地搭建在一个服务器上搭建三个es节点组成集群,先完成单机版本的搭建,单机版本搭建参考:《Linux搭建elasticsearch-7.8.0单机版本》

2、创建集群目录

/home/soft/es-cluster

#  赋权限
chmod -R 777 /home/soft/es-cluster

3、复制单机示例
将搭建完成的单机版本目录拷贝到集群目录下,并且重新命名,比如搭建的单机版本目录为/home/soft/elasticsearch,操作命令如下:
分别复制出elasticsearch-aelasticsearch-belasticsearch-c三个目录;

cp elasticsearch-7.8.0/ /home/soft/es-cluster/elasticsearch-a -r
cp elasticsearch-7.8.0/ /home/soft/es-cluster/elasticsearch-b -r
cp elasticsearch-7.8.0/ /home/soft/es-cluster/elasticsearch-c -r

4、修改端口配置
elasticsearch-aelasticsearch-belasticsearch-c三个es服务的端口分别修改为9211、9212、9213

# es-a服务
vim elasticsearch-a/config/elasticsearch.yml
http.port: 9211

# es-b服务
vim elasticsearch-b/config/elasticsearch.yml
http.port: 9212

# es-c服务
vim elasticsearch-c/config/elasticsearch.yml
http.port: 9213

4、启动单机服务
先分别启动elasticsearch-aelasticsearch-belasticsearch-c三个es服务,都成功启动后,进行集群版本配置

# 启动es-a服务
./elasticsearch-a/bin/elasticsearch

# 启动es-b服务
./elasticsearch-b/bin/elasticsearch

# 启动es-c服务
./elasticsearch-c/bin/elasticsearch

5、配置集群

配置集群前,先关闭启动的单机版本es服务

配置如下:

注意配置文件中的node.name: node-a、b、c,http.port: 9211、9212、9213,transport.tcp.port: 9300、9400、9500,elasticsearch-[a、b、c];不同的节点取不同的既可,对应关系为:node-1 = 9211 = 9300 = elasticsearch-a

#集群名称 a,b,c节点一致
cluster.name: es-cluster
#节点名称,a:node-a,b:node-b,c:node-c
node.name: node-a、b、c
#是不是有资格主节点  a,b,c节点一致
node.master: true
#是否存储数据  a,b,c节点一致
node.data: true
#最⼤集群节点数  a,b,c节点一致
node.max_local_storage_nodes: 3
#⽹关地址  a,b,c节点一致
network.host: 0.0.0.0
#端⼝ a:9211,b:9212,c:9213
http.port: 9211、9212、9213
#内部节点之间沟通端⼝ a:9300,b:9400,c:9500
transport.tcp.port: 9300、9400、9500

#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点  a,b,c节点一致
discovery.seed_hosts: ["192.168.80.121:9300","192.168.80.121:9400","192.168.80.121:9500"] 
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master  a,b,c节点一致
cluster.initial_master_nodes: ["node-a"] 
#数据和存储路径  a,b,c节点一致
path.data: /home/soft/es-cluster/elasticsearch-a、b、c/data
path.logs: /home/soft/es-cluster/elasticsearch-a、b、c/logs

# 跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"

修改elasticsearch-a配置

vim /home/soft/es-cluster/elasticsearch-a/config/elasticsearch.yml

修改elasticsearch-b配置

vim /home/soft/es-cluster/elasticsearch-b/config/elasticsearch.yml

修改elasticsearch-c配置

vim /home/soft/es-cluster/elasticsearch-c/config/elasticsearch.yml

6、启动集群
启动前需要先删除所有节点中/data目录下的数据

rm /home/soft/es-cluster/elasticsearch-a/data/* -rf
rm /home/soft/es-cluster/elasticsearch-b/data/* -rf
rm /home/soft/es-cluster/elasticsearch-c/data/* -rf

启动命令:

# 窗口方式启动(xshell需要多开窗口)
cd /home/soft/es-cluster
./elasticsearch-a/bin/elasticsearch
./elasticsearch-b/bin/elasticsearch
./elasticsearch-c/bin/elasticsearch


# 后台启动
cd /home/soft/es-cluster
./elasticsearch-a/bin/elasticsearch -d -p pid
./elasticsearch-b/bin/elasticsearch -d -p pid
./elasticsearch-c/bin/elasticsearch -d -p pid

7、集群检测

分别启动es服务

  • 方式一:http请求查看
    打开浏览器输⼊:http://192.168.80.121:9211[2、3]/_cat/health?v ,如果返回的node.total是3,代表集群搭建成功。

  • 方式二:head插件查看
    head中,连接任意节点地址,如果同时展示了3个节点信息,,代表集群搭建成功。

3、集群高可用

分⽚(shard):
ES是个分布式的搜索引擎, 索引会分布到不同节点上, 这些分布在不同节点的数据就是分片。
默认每创建一个索引就会创建一个分片
ES⾃动管理和组织分⽚, 并在必要的时候对分⽚数据进⾏再平衡分 配, 所以⽤户基本上不⽤担⼼分⽚的处理细节。

副本(replica):
ES默认为⼀个索引创建1个主分⽚, 并分别为其创建⼀个副本分⽚。
Elastic search7.x之后,如果不指定索引分⽚,默认会创建1个主分片和⼀个副分片。

3.1 分片分配

在创建索引时,需要设置主分片数量与副本数量,具体的主分片数量应该根据业务确定,但是应该大于等于集群数量。

分片分配到哪个节点是由ES⾃动管理的,如果某个节点挂了,那分⽚⼜会重新分配到别的节点上。

创建索引时指定的主分⽚数以后是⽆法修改的,所以主分⽚数的数量要根据项⽬决定,如果真的要增加主分⽚只能重建索引了。副分⽚数创建后是可以修改的。

注意:副分片数量是主分片数与副本数量的乘积,即 副分片数量= 副分片数*主分片数;

演示:
在一个存在三个节点的集群的环境下,创建一个索引叫做test,并且设置3个主分片1个副本数;

使用head插件创建如下:

分片分布情况如下:

可以看到主分片分为0、1、2,副本分片也分为:0、1、2;

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1分配到node-c
    • 主分片2分配到node-a
  • 副分片:

    • 副分片0分配到node-c
    • 副分片1分配到node-a
    • 副分片2分配到node-b

3.2 节点宕机

假设目前已经存在了三个的es集群,其中一个节点宕机后,分片将会进行重新的分配;如果宕机的是主节点,那么将会重新选择新的主节点

宕机前分片分布情况如下:

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1分配到node-c
    • 主分片2分配到node-a
  • 副分片:

    • 副分片0分配到node-c
    • 副分片1分配到node-a
    • 副分片2分配到node-b

宕机后分片分布情况如下:

手动关闭一个节点,表示其中一个宕机

  • 主分片:

    • 主分片0、2分配到node-b
    • 主分片1分配到node-c
  • 副分片:

    • 副分片0分配到node-c
    • 副分片1分配到node-b

3.3 节点拓展

节点拓展前分片分布情况如下:

  • 主分片:

    • 主分片0、2分配到node-b
    • 主分片1分配到node-c
  • 副分片:

    • 副分片0分配到node-c
    • 副分片1分配到node-b

节点拓展前分片分布情况如下:

再启动一个节点

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1、2分配到node-a
  • 副分片:

    • 副分片0、2分配到node-c
    • 副分片1分配到node-b

3.4 手动迁移分片

node-b节点1号分片移动到node-c节点

使用Head插件进行:

// POST /_cluster/reroute
{
    "commands":[
        {
            "move":{
                "index":"test", //索引名称
                "shard":1, //分片名称
                "from_node":"node-b",
                "to_node":"node-c"
            }
        }
    ]
}

分片移动后分布情况如下:

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1、2分配到node-a
  • 副分片:

    • 副分片0、1分配到node-c
    • 副分片2分配到node-b

3.5 副本数拓展

副本数拓展前分片分布情况如下:

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1、2分配到node-a
  • 副分片:

    • 副分片0、1分配到node-c
    • 副分片2分配到node-b

使用Head插件进行:

// test为索引名称
// PUT /test/_settings

// 请求参数,设置副本为2个
{
    "number_of_replicas":2
}

副本数拓展后分片分布情况如下:

  • 主分片:

    • 主分片0分配到node-b
    • 主分片1、2分配到node-a
  • 副分片:

    • 副分片0分配到node-a
    • 副分片1、2分配到node-b
    • 副分片0、1、2分配到node-c

4、路由计算与确认

当为索引新增⼀个⽂档的时候,⽂档会被存储到⼀个主分⽚中。 Elasticsearch 如何知道⼀个⽂档应 该存放到哪个分⽚中呢?当我们创建⽂档时,它如何决定这个⽂档应当被存储在分⽚ 1 还是 分⽚ 2 中呢?

算法公式:shard = hash(routing) % number_of_primary_shards

routing 是⼀个可变值,默认是⽂档的 _id ,也可以设置成⼀个⾃定义的值。routing 通过 hash 函数⽣成⼀个数字,然后这个数字再除以number_of_primary_shards (主分片数量)后得到余数 。这个分布在 `0 到 number_of_primary_shards-1 之间的余数, 就是⽂档所在分⽚的位置。
​ 所以创建索引的时候就要确定好主分⽚的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会⽆效,⽂档也再也找不到了,非要修改主分片数量就需要重构索引。

5、读、写操作交互过程

5.1 写操作

新建、删除索引请求都是写操作, 必须在主分片上面完成之后才能被复制到相关的副本分片。

1、客户端向node-1(主节点)发送写操作请求。
2、节点通过路由算法确定该⽂档属于主分片-P0。因为主分⽚-P0在node-3,所以请求会转发到node-3。
3、⽂档在node-3的主分⽚-P0上写操作写操作成功后,将请求转发到node-1和node-2对应的副分⽚-R0上。⼀旦所有的副分⽚都报告成功,node-3向node-1报告成功,node-1向客户端报告成功。

总结: 客户端向某个节点发起请求,该节点查询请求所属的主分片所在节点并且转发,主分片操作成功后,将数据同步到其他节点的副分片,副分片报告成功以后,主分片所在节点向请求节点报告成功,请求节点向客户端报告成功。

5.2 读操作

读操作可以从主分片或者从其它任意副本分片上进行。

1、客户端向node-1(主节点)发送读操作请求。
2、节点使用文档的 _id 来确定文档属于某个分片,比如:分片0分片0的副本分片存在于所有的三个
节点上,它将请求转发到 Node2。
Node 2 将文档返回给 Node 1 ,然后将文档返回给客户端。

说明: 在处理读操作请求时,协调结点(主节点)在每次请求的时候都会轮询所有的副本分片来达到负载均衡。

注意: 在文档被检索时,已经被索引的文档可能已经存在于主分片上但是还没有复制到副本分片, 在这种情况下,副本分片可能会报告文档不存在,但是主分片可能成功返回文档。 一
旦索引请求成功返回给用户,文档在主分片和副本分片都是可用的。

本文标签: 集群LinuxElasticsearch