ELK(五)—集群搭建

写目录

ip规划

ip 名称 服务
192.168.150.190 elk_master elasticsearch
192.168.150.189 elk_node1
192.168.150.188 elk_node2

ElasticSearch集群

集群节点

ELasticsearch的集群是由多个节点组成的,通过cluster.name设置集群名称,并且用于区分其它的集群,每个节点通过node.name指定节点的名称。

在Elasticsearch中,节点的类型主要有4种:

master节点

  • 配置文件中node.master属性为true(默认为true),就有资格被选为master节点。master节点用于控制整个集群的操作。比如创建或删除索引,管理其它非master节点等。

data节点

  • 配置文件中node.data属性为true(默认为true),就有资格被设置成data节点。data节点主要用于执行数据相关的操作。比如文档的CRUD(创建(Create),读取(Retrieve),更新(Update) 、删除(Delete))。

客户端节点

  • 配置文件中node.master属性和node.data属性均为false。
  • 该节点不能作为master节点,也不能作为data节点。
  • 可以作为客户端节点,用于响应用户的请求,把请求转发到其他节点

部落节点

  • 当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接

搭建集群

elk-master节点的信息

复制代码
#################################
# master节点的 elasticsearch.yml 内容
#################################

# 集群节点名称
node.name: "elk_node1"

# 设置集群名称为elasticsearch
cluster.name: "cluster_es"

# 网络访问限制
network.host: 0.0.0.0

#社会绑定的IP地址,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0

#设置其他节点与该节点交互的IP地址
network.publish_host: 192.168.150.189

#是否开启http服务对外提供服务
http.port: 9200

#设置节点之间交互的端口号
transport.port: 9300

# 是否支持跨域
http.cors.enabled: true

# 表示支持所有域名
http.cors.allow-origin: "*"

# 内存交换的选项,官网建议为true
bootstrap.memory_lock: true

# 集群中的其它节点
discovery.seed_hosts: ["192.168.150.190","192.168.150.189","192.168.150.188"]

#集群中的角色
node.roles: [master,data]

# 集群中初始化的节点
cluster.initial_master_nodes: ["elk_master", "elk_node1", "elk_node2"]

# 取消安全验证
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

elk_node1的节点相关信息

复制代码
#################################
# master节点的 elasticsearch.yml 内容
#################################

# 集群节点名称
node.name: "elk_node1"

# 设置集群名称为elasticsearch
cluster.name: "cluster_es"

# 网络访问限制
network.host: 0.0.0.0

#社会绑定的IP地址,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0

#设置其他节点与该节点交互的IP地址
network.publish_host: 192.168.150.189

#是否开启http服务对外提供服务
http.port: 9200

#设置节点之间交互的端口号
transport.port: 9300

# 是否支持跨域
http.cors.enabled: true

# 表示支持所有域名
http.cors.allow-origin: "*"

# 内存交换的选项,官网建议为true
bootstrap.memory_lock: true

# 集群中的其它节点
discovery.seed_hosts: ["192.168.150.190","192.168.150.189","192.168.150.188"]

#集群中的角色
node.roles: [master,data]

# 集群中初始化的节点
cluster.initial_master_nodes: ["elk_master", "elk_node1", "elk_node2"]

# 取消安全验证
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

elk_node2的节点相关信息

复制代码
#################################
# master节点的 elasticsearch.yml 内容
#################################

# 集群节点名称
node.name: "elk_node2"

# 设置集群名称为elasticsearch
cluster.name: "cluster_es"

# 网络访问限制
network.host: 0.0.0.0

#社会绑定的IP地址,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0

#设置其他节点与该节点交互的IP地址
network.publish_host: 192.168.150.188

#是否开启http服务对外提供服务
http.port: 9200

#设置节点之间交互的端口号
transport.port: 9300

# 是否支持跨域
http.cors.enabled: true

# 表示支持所有域名
http.cors.allow-origin: "*"

# 内存交换的选项,官网建议为true
bootstrap.memory_lock: true

# 集群中的其它节点
discovery.seed_hosts: ["192.168.150.190","192.168.150.189","192.168.150.188"]

#集群中的角色
node.roles: [master,data]

# 集群中初始化的节点
cluster.initial_master_nodes: ["elk_master", "elk_node1", "elk_node2"]

# 取消安全验证
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

三个节点的"elasticsearch.yml"文件修改完成后,我们就可以启动elasticsearch服务了

./elasticsearch -d

复制代码
cluster.initial_master_nodes: ["elk_master", "elk_node1", "elk_node2"]

因为在集群的master节点初始化的时候,三个节点都有机会成为master节点,那个节点先启动就是对应的主节点了。

创建一个索引,其中加粗的为主分片,其余为副本分片

查询集群状态:/_cluster/health

在postman工具(或其他工具)

复制代码
 get http://192.168.150.189:9200/_cluster/health

get http://集群中的节点ip:端口/_cluster/health

集群中有三种颜色

es切片和副本

在Elasticsearch中,切片(shard)和副本(replica)是两个重要的概念,它们对于分布式和高可用性非常关键。以下是对这两个概念的详细解释:

切片(Shard):

  1. 定义
    • 切片是数据在Elasticsearch集群中的基本单元。每个索引都被分成一个或多个切片,每个切片是一个独立的工作单元,包含了索引中的一部分数据。
  2. 目的
    • 切片的主要目的是将索引的数据分散存储在整个集群中,以实现分布式存储和搜索。这使得Elasticsearch能够处理大量数据并提供快速的检索能力。
  3. 类型
    • 主切片(Primary Shard):每个切片都有一个主切片,它是切片的主要工作单元,负责处理所有的读和写操作。
    • 复制切片(Replica Shard):为了提高高可用性和性能,每个主切片可以有零个或多个复制切片。复制切片是主切片的拷贝,可以接收读请求。
  4. 分配策略
    • 切片的分配是在索引创建时确定的,通常在索引创建时指定主切片的数量。副本的数量可以在运行时进行动态调整。
  5. 路由
    • 文档被路由到特定的切片,Elasticsearch使用文档的ID和切片数量来确定路由。这确保了相同ID的文档总是存储在同一个切片上。

副本(Replica):

  1. 定义
    • 副本是主切片的拷贝,用于提供冗余和高可用性。每个主切片可以有零个或多个副本,这些副本存储在不同的节点上。
  2. 目的
    • 主切片和其所有副本一起形成一个分片组,该组提供了在节点故障或网络问题时的冗余和故障恢复能力。
  3. 高可用性
    • 当主切片不可用时,Elasticsearch可以自动将一个副本提升为新的主切片,以保持索引的可用性。
  4. 读操作
    • 读操作可以由主切片或任何副本处理,这取决于请求的路由和索引的健康状况。
  5. 写操作
    • 写操作总是由主切片处理,然后通过异步复制到所有副本。这确保了写操作的一致性和可用性。

总体而言,切片和副本是Elasticsearch实现分布式、高性能和高可用性的关键组件。通过合理设置切片和副本的数量,可以有效地利用集群资源并确保数据的安全和可用性。

故障转移

postman创建索引的情况

这里选择将elk_node2的es停止

可以看到,elk_node2节点立即从看板中消失了。

重启启动elk_node2节点

elk_node2节点立马又加入了集群中。

这次选择删除elk_node1节点,可以从看板中知道,该节点是主节点.

看看删除主节点后,会不会在其他节点中产生一个新的节点。

删除node1节点后,节点信息立马变为unassigned了,同时elknode2节点变为了新的master节点。当然了这是随机的,elk_master也可以是新的master节点。
lasticsearch具备自动分配未分配分片到可用节点的机制。当一个节点离开集群时,未分配的分片应该被自动分配到其他可用的节点上,确保集群的高可用性和数据完整性。

理论上,在这种情况下,其他可用的节点应该接管这个分片。然而,可能存在一些情况导致自动分片分配失败,例如网络问题、节点配置问题等。

进行手动分配分片。

先查看可用节点

复制代码
[root@elk_node2 ~]# curl -X GET "localhost:9200/_cat/nodes?v"
ip              heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.150.188           39          86   0    0.00    0.00     0.00 dm        *      elk_node2
192.168.150.190           44          88   0    0.03    0.04     0.01 dm        -      elk_master
[root@elk_node2 ~]# curl -X GET "192.168.150.188:9200/_cat/indices?v"
health status index uuid                   pri rep docs.count docs.deleted stor
red    open   elk   EhgU7OuaS_q3aj_wVd5e_A   2   0          0            0
[root@elk_node2 ~]# curl -X GET "192.168.150.188:9200/_cat/shards/elk?v"
index shard prirep state      docs store dataset ip              node
elk   0     p      STARTED       0  249b    249b 192.168.150.190 elk_master
elk   1     p      UNASSIGNED
  1. 分配主分片:
bash 复制代码
curl -X POST "192.168.150.188:9200/_cluster/reroute" -H 'Content-Type: application/json' -d '{
  "commands" : [
    {
      "allocate_stale_primary" : {
        "index" : "elk",
        "shard" : 1,
        "node" : "elk_node2"
      }
    }
  ]
}'

请注意,这里使用了 allocate_stale_primary 命令,这是一种尝试为失效节点分配主分片的方式。

  1. 等待主分片分配完成后,再分配副本:
bash 复制代码
curl -X POST "192.168.150.188:9200/_cluster/reroute" -H 'Content-Type: application/json' -d '{
  "commands" : [
    {
      "allocate_replica" : {
        "index" : "elk",
        "shard" : 1,
        "node" : "elk_node2"
      }
    }
  ]
}'

这两个命令组合起来,应该可以解决主分片和副本分配的问题。如果问题仍然存在,可能需要查看 Elasticsearch 的日志以获取更多详细信息。

在有分片的节点down之后,分片不会直接分配。很关键

更关键的是,这样进行手动分配分片是没因的!! 因为没有副本。。

直接在面板中创建索引

先创建索引

四分片、一个副本数,可以看到已经创建成功了。

这个时候我们把elk_node1节点停掉。

OK,这里可以看到集群颜色变为了黄色,并不是上面的红色了。
表示集群是运行的,但不是所有的主分片和副本分片都是 active(活跃) 状态。这可能是因为某些副本尚未分配,但主分片是活跃的。

经过一段时间之后,我们可以看到集群又重新变为绿色了。

这是因为,集群将其他节点的副本调动起来了,保证正常运行了。

有意思的一点,我们上面创建索引的时候指定的分片是四,每个节点都有对应的四个小方块了,保证了只要还存在节点,项目就肯定可以运行。

现在继续吧elk_master节点停掉,然后又启动看分片的分布

可以看到主片已经全部是elknode2节点上了,而elk_master的分片已经全部是负集了。

总结

  1. 设置集群的时候,各个节点的配置文件要特别注意节点的名称,主要的不一样就是在这里了。
  2. 想要故障转移的效果,我们创建索引的时候,需要设置副本,否则不会自动转移。
相关推荐
七夜zippoe5 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6486 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满6 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠7 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9037 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技8 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀8 小时前
Linux环境变量
linux·运维·服务器
zzzsde8 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º10 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~10 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化