ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大(垂直扩容,或 纵向扩容) 或者数量更多的服务器(水平扩容,或 横向扩容 )来实现。

虽然 ElasticSearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。

对于大多数的数据库而言,通常需要对应用程序进行非常大的改动,才能利用上横向扩容的新增资源。 与之相反的是,ElastiSearch天生就是分布式的 ,它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的应用无需关注这个问题。

一个运行中的 ElasticSearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

当一个节点被选举成为主节点时, 它将负责管理:集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。我们的示例集群就只有一个节点,所以它同时也成为了主节点。

作为用户,我们可以将请求发送到集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 ElasticSearch 对这一切的管理都是透明的。

集群健康:

ElasticSearch 的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是 集群健康 , 它在 status 字段中展示为 green 、 yellow 或者 red 。
在一个不包含任何索引的空集群中,它将会有一个类似于如下所示的返回内容:

{"cluster_name":          "elasticsearch","status":                "green", "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
}

green:
所有的主分片和副本分片都正常运行。
yellow:
所有的主分片都正常运行,但不是所有的副本分片都正常运行。
red:
有主分片没能正常运行。

添加索引

我们往 ElasticSearch 添加数据时需要用到索引。 索引实际上是指向一个或者多个物理分片的逻辑命名空间 。
一个分片是一个底层的工作单元,它仅保存了全部数据中的一部分。 在分片内部机制中,我们将详细介绍分片是如何工作的,而现在我们只需知道一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

ElasticSearch是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, ElasticSearch会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

一个分片可以是主分片或者副本分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。

一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。
在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。

让我们在包含一个空节点的集群内创建名为 blogs 的索引。 索引在默认情况下会被分配5个主分片, 但是为了演示目的,我们将分配3个主分片和一份副本(每个主分片拥有一个副本分片):

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

如果我们现在查看集群健康, 我们将看到如下内容:

{"cluster_name": "elasticsearch","status": "yellow", "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, "delayed_unassigned_shards": 0,"number_of_pending_tasks": 0,"number_of_in_flight_fetch": 0,"task_max_waiting_in_queue_millis": 0,"active_shards_percent_as_number": 50
}

集群的健康状况为 yellow 则表示全部主分片都正常运行(集群可以正常服务所有请求),但是副本分片没有全部处在正常状态。 实际上,所有3个副本分片都是 unassigned状态,它们都没有被分配到任何节点。 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。

添加故障转移

当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。 幸运的是,我们只需再启动一个节点即可防止数据丢失。
为了测试第二个节点启动后的情况,你可以在同一个目录内,完全依照启动第一个节点的方式来启动一个新节点。多个节点可以共享同一个目录。
当你在同一台机器上启动了第二个节点时,只要它和第一个节点有同样的 cluster.name 配置,它就会自动发现集群并加入到其中。 但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表。 详细信息请查看最好使用单播代替组播。
当第二个节点加入到集群后,3个副本分片将会分配到这个节点上——每个主分片对应一个副本分片。 这意味着当集群内任何一个节点出现问题时,我们的数据都完好无损。
所有新近被索引的文档都将会保存在主分片上,然后被并行的复制到对应的副本分片上。这就保证了我们既可以从主分片又可以从副本分片上获得文档。
cluster-health 现在展示的状态为 green ,这表示所有6个分片(包括3个主分片和3个副本分片)都在正常运行。

水平扩容

怎样为我们的正在增长中的应用程序按需扩容呢?当启动了第三个节点,我们的集群将会看起来如图,拥有三个节点的集群,ES为了分散负载而对分片进行重新分配所示。

Node 1 和 Node 2 上各有一个分片被迁移到了新的 Node 3 节点,现在每个节点上都拥有2个分片。 这表示每个节点的硬件资源(CPU, RAM, I/O)将被更少的分片所共享,每个分片的性能将会得到提升。
分片是一个功能完整的搜索引擎,它拥有使用一个节点上的所有资源的能力。 我们这个拥有6个分片(3个主分片和3个副本分片)的索引可以最大扩容到6个节点,每个节点上存在一个分片,并且每个分片拥有所在节点的全部资源。
主分片的数目在索引创建时 就已经确定了下来。实际上,这个数目定义了这个索引能够存储的最大数据量(实际大小取决于你的数据、硬件和使用场景)。但是,读操作,搜索和返回数据可以同时被主分片或副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

应对故障

我们关闭的节点是一个主节点。而集群必须拥有一个主节点来保证正常工作,所以发生的第一件事情就是选举一个新的主节点 Node 2。
在我们关闭 Node 1 的同时也失去了主分片 1 和 2 ,并且在缺失主分片的时候索引也不能正常工作。 如果此时来检查集群的状况,我们看到的状态将会为 red :不是所有主分片都在正常工作。
幸运的是,在其它节点上存在着这两个主分片的完整副本, 所以新的主节点立即将这些分片在 Node 2 和 Node 3 上对应的副本分片提升为主分片。
这个提升主分片的过程是瞬间发生的,如同按下一个开关一般,集群恢复green状态。
如果我们同样关闭了 Node 2 ,我们的程序依然可以保持在不丢任何数据的情况下运行,因为 Node 3 为每一个分片都保留着一份副本。

转载于:https://www.cnblogs.com/feiqiangsheng/p/10950981.html

ElasticSearch之集群原理相关推荐

  1. Elasticsearch集群原理

    文章目录 一.扩容机制 二.空集群 三.集群健康 四.分片(shard) 五.水平扩容 六.故障处理 一.扩容机制 Elasticsearch的主旨是随时可用和按需扩容,扩容可以分为以下两种: 纵向扩 ...

  2. ELasticSearch-ES集群原理与搭建

    ES集群原理 查看集群健康状况:URL+ /GET _cat/health (1).首先弄清ES基本概念名词 Cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选 ...

  3. java集群解析文件_干货:一文详解Redis集群原理核心内容

    集群原理 一个系统建立集群主要需要解决两个问题:数据同步问题和集群容错问题. Naive方案 一个简单粗暴的方案是部署多台一模一样的Redis服务,再用负载均衡来分摊压力以及监控服务状态.这种方案的优 ...

  4. RabbitMQ—集群原理

    RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现).因此,RabbitMQ天然支持集群,但不支持负载均衡 ...

  5. kafka集群原理介绍

    kafka集群原理介绍 @(KAFKA)[kafka, 大数据] kafka集群原理介绍 一基础理论 二配置文件 一java调优 二参数说明 三错误处理 四zookeeper中的内容 1brokers ...

  6. Quartz应用与集群原理分析

    一.问题背景 美团CRM系统中每天有大量的后台任务需要调度执行,如构建索引.统计报表.周期同步数据等等,要求任务调度系统具备高可用性.负载均衡特性,可以管理并监控任务的执行流程,以保证任务的正确执行. ...

  7. HA集群实现原理 切换 JAVA_HA(一)高可用集群原理

    高可用集群原理 LVS集群DR模式简单的架构图如下所示: 在上图的架构中,当Director服务器因软件.硬件.人为原因造成故障时,整个集群服务不可用,因此,需要再添加一台服务器实现Director服 ...

  8. RabbitMQ集群原理介绍

    文章目录 一.RabbitMQ默认集群原理 1. RabbitMQ集群元数据的同步 2. 为何RabbitMQ集群仅采用元数据同步的方式 3. RabbitMQ集群发送/订阅消息的基本原理 4. 客户 ...

  9. Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理

    概要 我们知道「主从复制是高可用的基石」,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行. 所以主从复制架构面临一个严峻问题,主库挂了,无法执 ...

最新文章

  1. 与数据相关的运算符和伪指令 offset align ptr type lengthof sizeof label 间接寻址 间接操作数 数组 变址操作数 指针 jmp, loop
  2. C#学习之三层架构实例
  3. 【安全漏洞】简要分析复现了最近的ProxyShell利用链
  4. centos mysql卸载重装_centos 7.x 安装/卸载MySQL
  5. 使用的postman心得
  6. Java中的钩子方法
  7. 以系统化视角反观产品运营,解读提升用户转化的“四部曲”
  8. C ++ 类 | 类的辅助函数(Helper Functions) ,类与数组_3
  9. TD-LTE Technology And Its Measurements(TD-LTE 技术及其应用)
  10. Vijos P1335 数独验证【谜题】
  11. 免费的WordPress Video Player插件
  12. 关于手机ping电脑和电脑ping手机
  13. 电子秤查看通道及更改通道方法
  14. 那些我们卖掉的二手iPhone到底去哪了?
  15. 汇编rep movsb,rep stosb,repne scasb
  16. 远程唤醒、WOL、Magic_Packet
  17. 如何做好一个产品经理
  18. 5. 数据库题(以个人熟悉数据库为准、按要求写出sql) (1) 计算每个人的总成绩并排名(要求显示字段:学号,姓名,总成绩) (2) 计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最
  19. java rsa sha1_将SHA1和RSA与java.security.Signature和MessageDigest和Cipher结合使用
  20. 中e管家婚后有孩子怎么理财

热门文章

  1. Appium自动化测试环境搭建
  2. 关于z-index介绍
  3. 企业设置“蜜罐”的五大理由
  4. php跨平台总结 常用预定义常量
  5. Oracle database 11g 安装 - 配置企业管理器database control失败
  6. Ansible第一篇:基础
  7. SRX 透明模式配置
  8. 使用HTML5的canvas做一个会动的时钟
  9. I.MX6 Android 5.1 纯Linux、U-Boot编译
  10. zabbix_server的自动发现,实现批量添加主机,并链接到模板