热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch分布式集群

为什么80%的码农都做不了架构师?集群内部工作方式补充章节正如之前提及的,这是关于Elasticsearch在分布式环境下工作机制的一些补充章节的

为什么80%的码农都做不了架构师?>>>   hot3.png

集群内部工作方式

补充章节

正如之前提及的,这是关于Elasticsearch在分布式环境下工作机制的一些补充章节的第一部分。这个章节我们解释一些通用的术语,例如集群(cluster)节点(node)分片(shard),Elasticsearch的扩展机制,以及它如何处理硬件故障。

尽管这章不是必读的——你在使用Elasticsearch的时候可以长时间甚至永远都不必担心分片、复制和故障转移——但是它会帮助你理解Elasticsearch内部的工作流程,你可以先跳过这章,以后再来查阅。

+

Elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展(vertical scale or scaling up))或者购买更多的服务器(横向扩展(horizontal scale or scaling out))。

Elasticsearch虽然能从更强大的硬件中获得更好的性能,但是纵向扩展有它的局限性。真正的扩展应该是横向的,它通过增加节点来均摊负载和增加可靠性。

对于大多数数据库而言,横向扩展意味着你的程序将做非常大的改动才能利用这些新添加的设备。对比来说,Elasticsearch天生就是分布式的:它知道如何管理节点来提供高扩展和高可用。这意味着你的程序不需要关心这些。

在这章我们将探索如何创建你的集群(cluster)节点(node)分片(shards),使其按照你的需求进行扩展,并保证在硬件故障时数据依旧安全。

空集群

如果我们启动一个单独的节点,它还没有数据和索引,这个集群看起来就像图1。

A cluster with one empty node图1:只有一个空节点的集群

一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。

集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,这意味着在流量增长的时候,该主节点不会成为集群的瓶颈。任何节点都可以成为主节点。我们例子中的集群只有一个节点,所以它会充当主节点的角色。

做为用户,我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。

集群健康

在Elasticsearch集群中可以监控统计很多信息,但是只有一个是最重要的:集群健康(cluster health)。集群健康有三种状态:green、yellow或red。

GET /_cluster/health

在一个没有索引的空集群中运行如上查询,将返回这些信息:

{ "cluster_name": "elasticsearch", "status": "green", <1> "timed_out": false,"number_of_nodes": 1,"number_of_data_nodes": 1,"active_primary_shards": 0,"active_shards": 0,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 0
}

  • <1> status 是我们最感兴趣的字段

status字段提供一个综合的指标来表示集群的的服务状况。三种颜色各自的含义&#xff1a;

颜色 意义
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用&#xff0c;但不是所有复制分片都可用
red 不是所有的主要分片都可用

在接下来的章节&#xff0c;我们将说明什么是主要分片(primary shard)和复制分片(replica shard)&#xff0c;并说明这些颜色&#xff08;状态&#xff09;在实际环境中的意义。

添加索引

为了将数据添加到Elasticsearch&#xff0c;我们需要索引(index)——一个存储关联数据的地方。实际上&#xff0c;索引只是一个用来指向一个或多个分片(shards)的“逻辑命名空间(logical namespace)”.

2

一个分片(shard)是一个最小级别“工作单元(worker unit)”,它只是保存了索引中所有数据的一部分。在接下来的《深入分片》一章&#xff0c;我们将详细说明分片的工作原理&#xff0c;但是现在我们只要知道分片就是一个Lucene实例&#xff0c;并且它本身就是一个完整的搜索引擎。我们的文档存储在分片中&#xff0c;并且在分片中被索引&#xff0c;但是我们的应用程序不会直接与它们通信&#xff0c;取而代之的是&#xff0c;直接与索引通信。

分片是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。文档存储在分片中&#xff0c;然后分片分配到你集群中的节点上。当你的集群扩容或缩小&#xff0c;Elasticsearch将会自动在你的节点间迁移分片&#xff0c;以使集群保持平衡。

分片可以是主分片(primary shard)或者是复制分片(replica shard)。你索引中的每个文档属于一个单独的主分片&#xff0c;所以主分片的数量决定了索引最多能存储多少数据。

理论上主分片能存储的数据大小是没有限制的&#xff0c;限制取决于你实际的使用情况。分片的最大容量完全取决于你的使用状况&#xff1a;硬件存储的大小、文档的大小和复杂度、如何索引和查询你的文档&#xff0c;以及你期望的响应时间。

复制分片只是主分片的一个副本&#xff0c;它可以防止硬件故障导致的数据丢失&#xff0c;同时可以提供读请求&#xff0c;比如搜索或者从别的shard取回文档。

当索引创建完成的时候&#xff0c;主分片的数量就固定了&#xff0c;但是复制分片的数量可以随时调整。

让我们在集群中唯一一个空节点上创建一个叫做blogs的索引。默认情况下&#xff0c;一个索引被分配5个主分片&#xff0c;但是为了演示的目的&#xff0c;我们只分配3个主分片和一个复制分片&#xff08;每个主分片都有一个复制分片&#xff09;&#xff1a;

PUT /blogs
{ "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 }
}

附带索引的单一节点集群&#xff1a; 有一个索引的单一节点集群

我们的集群现在看起来就像上图——三个主分片都被分配到Node 1。如果我们现在检查集群健康(cluster-health)&#xff0c;我们将见到以下信息&#xff1a;

{ "cluster_name": "elasticsearch", "status": "yellow", <1> "timed_out": false,"number_of_nodes": 1,"number_of_data_nodes": 1,"active_primary_shards": 3,"active_shards": 3,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 3 <2> }

  • <1> 集群的状态现在是 yellow
  • <2> 我们的三个复制分片还没有被分配到节点上

集群的健康状态yellow表示所有的主分片(primary shards)启动并且正常运行了——集群已经可以正常处理任何请求——但是复制分片(replica shards)还没有全部可用。事实上所有的三个复制分片现在都是unassigned状态——它们还未被分配给节点。在同一个节点上保存相同的数据副本是没有必要的&#xff0c;如果这个节点故障了&#xff0c;那所有的数据副本也会丢失。

现在我们的集群已经功能完备&#xff0c;但是依旧存在因硬件故障而导致数据丢失的风险。

增加故障转移

在单一节点上运行意味着有单点故障的风险——没有数据备份。幸运的是&#xff0c;要防止单点故障&#xff0c;我们唯一需要做的就是启动另一个节点。

启动第二个节点

为了测试在增加第二个节点后发生了什么&#xff0c;你可以使用与第一个节点相同的方式启动第二个节点&#xff08;《运行Elasticsearch》一章&#xff09;&#xff0c;而且命令行在同一个目录——一个节点可以启动多个Elasticsearch实例。

只要第二个节点与第一个节点有相同的cluster.name&#xff08;请看./config/elasticsearch.yml文件&#xff09;&#xff0c;它就能自动发现并加入第一个节点所在的集群。如果没有&#xff0c;检查日志找出哪里出了问题。这可能是网络广播被禁用&#xff0c;或者防火墙阻止了节点通信。

如果我们启动了第二个节点&#xff0c;这个集群看起来就像下图。

双节点集群——所有的主分片和复制分片都已分配: 双节点集群

第二个节点已经加入集群&#xff0c;三个复制分片(replica shards)也已经被分配了——分别对应三个主分片&#xff0c;这意味着在丢失任意一个节点的情况下依旧可以保证数据的完整性。

文档的索引将首先被存储在主分片中&#xff0c;然后并发复制到对应的复制节点上。这可以确保我们的数据在主节点和复制节点上都可以被检索。

cluster-health现在的状态是green&#xff0c;这意味着所有的6个分片&#xff08;三个主分片和三个复制分片&#xff09;都已可用&#xff1a;

{ "cluster_name": "elasticsearch", "status": "green", <1> "timed_out": false,"number_of_nodes": 2,"number_of_data_nodes": 2,"active_primary_shards": 3,"active_shards": 6,"relocating_shards": 0,"initializing_shards": 0,"unassigned_shards": 0
}

  • <1> 集群的状态是green.

我们的集群不仅是功能完备的&#xff0c;而且是高可用的。

横向扩展

随着应用需求的增长&#xff0c;我们该如何扩展&#xff1f;如果我们启动第三个节点&#xff0c;我们的集群会重新组织自己&#xff0c;就像图4&#xff1a;

图4&#xff1a;包含3个节点的集群——分片已经被重新分配以平衡负载&#xff1a; 三节点集群

Node3包含了分别来自Node 1和Node 2的一个分片&#xff0c;这样每个节点就有两个分片&#xff0c;和之前相比少了一个&#xff0c;这意味着每个节点上的分片将获得更多的硬件资源&#xff08;CPU、RAM、I/O&#xff09;。

分片本身就是一个完整的搜索引擎&#xff0c;它可以使用单一节点的所有资源。我们拥有6个分片&#xff08;3个主分片和三个复制分片&#xff09;&#xff0c;最多可以扩展到6个节点&#xff0c;每个节点上有一个分片&#xff0c;每个分片可以100%使用这个节点的资源。

继续扩展

如果我们要扩展到6个以上的节点&#xff0c;要怎么做&#xff1f;

主分片的数量在创建索引时已经确定。实际上&#xff0c;这个数量定义了能存储到索引里数据的最大数量&#xff08;实际的数量取决于你的数据、硬件和应用场景&#xff09;。然而&#xff0c;主分片或者复制分片都可以处理读请求——搜索或文档检索&#xff0c;所以数据的冗余越多&#xff0c;我们能处理的搜索吞吐量就越大。

复制分片的数量可以在运行中的集群中动态地变更&#xff0c;这允许我们可以根据需求扩大或者缩小规模。让我们把复制分片的数量从原来的1增加到2&#xff1a;

PUT /blogs/_settings
{ "number_of_replicas" : 2 }

图5&#xff1a;增加number_of_replicas到2&#xff1a; 三节点两复制集群

&#43;

从图中可以看出&#xff0c;blogs索引现在有9个分片&#xff1a;3个主分片和6个复制分片。这意味着我们能够扩展到9个节点&#xff0c;再次变成每个节点一个分片。这样使我们的搜索性能相比原始的三节点集群增加三倍。

当然&#xff0c;在同样数量的节点上增加更多的复制分片并不能提高性能&#xff0c;因为这样做的话平均每个分片的所占有的硬件资源就减少了&#xff08;译者注&#xff1a;大部分请求都聚集到了分片少的节点&#xff0c;导致一个节点吞吐量太大&#xff0c;反而降低性能&#xff09;&#xff0c;你需要增加硬件来提高吞吐量。

1

不过这些额外的复制节点使我们有更多的冗余&#xff1a;通过以上对节点的设置&#xff0c;我们能够承受两个节点故障而不丢失数据。

应对故障

我们已经说过Elasticsearch可以应对节点失效&#xff0c;所以让我们继续尝试。如果我们杀掉第一个节点的进程&#xff08;以下简称杀掉节点&#xff09;&#xff0c;我们的集群看起来就像这样&#xff1a;

图5&#xff1a;杀掉第一个节点后的集群

杀掉一个节点后的集群

我们杀掉的节点是一个主节点。一个集群必须要有一个主节点才能使其功能正常&#xff0c;所以集群做的第一件事就是各节点选举了一个新的主节点&#xff1a;Node 2。

主分片1和2在我们杀掉Node 1时已经丢失&#xff0c;我们的索引在丢失主分片时不能正常工作。如果此时我们检查集群健康&#xff0c;我们将看到状态red&#xff1a;不是所有主节点都可用&#xff01;

幸运的是丢失的两个主分片的完整拷贝存在于其他节点上&#xff0c;所以新主节点做的第一件事是把这些在Node 2和Node 3上的复制分片升级为主分片&#xff0c;这时集群健康回到yellow状态。这个提升是瞬间完成的&#xff0c;就好像按了一下开关。

为什么集群健康状态是yellow而不是green&#xff1f;我们有三个主分片&#xff0c;但是我们指定了每个主分片对应两个复制分片&#xff0c;当前却只有一个复制分片被分配&#xff0c;这就是集群状态无法达到green的原因&#xff0c;不过不用太担心这个&#xff1a;当我们杀掉Node 2&#xff0c;我们的程序依然可以在没有丢失数据的情况下继续运行&#xff0c;因为Node 3还有每个分片的拷贝。

如果我们重启Node 1&#xff0c;集群将能够重新分配丢失的复制分片&#xff0c;集群状况与上一节的 图5&#xff1a;增加number_of_replicas到2 类似。如果Node 1依旧有旧分片的拷贝&#xff0c;它将会尝试再利用它们&#xff0c;它只会从主分片上复制在故障期间有数据变更的那一部分。

现在你应该对分片如何使Elasticsearch可以水平扩展并保证数据安全有了一个清晰的认识。接下来我们将会讨论分片生命周期的更多细节。




转:https://my.oschina.net/yjwxh/blog/672152



推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 《Spring in Action 第4版:全面解析与实战指南》
    《Spring in Action 第4版:全面解析与实战指南》不仅详细介绍了Spring框架的核心优势,如简洁易测试、低耦合特性,还深入探讨了其轻量级和最小侵入性的设计原则。书中强调了声明式编程的优势,并通过基于约定的方法简化开发流程。此外,Spring的模板机制有效减少了重复代码,而依赖注入功能则由容器自动管理,确保了应用的灵活性和可维护性。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
author-avatar
Zhangjingy2502870421
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有