前面主要学习了ElasticSearch分布式集群的存储过程中集群、节点和分片的知识(ElasticSearch 5学习(6)——分布式集群学习分享1),下面主要分享应对故障的一些实践。

应对故障

前面说了很多关于复制分片可以应对节点失效,很好保证集群的安全性,下面我们可以尝试杀掉第一个节点的进程,我们的集群变化成如下(所有的操作都是ElasticSearch自动处理):

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

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

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

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

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

故障实践1

上面是关于ElasticSearch在遇到故障时候的理论部分,下面我们开始实际操作。

查看目前集群状态

我们回顾一下之前的blogs索引,在结束最后的状态:

PUT /blogs
{
"settings" : {
"number_of_shards" : 3, (主分片个数)
"number_of_replicas" : 2, (每个主分片的复制分片个数)
}
}

切断节点

为了模拟这种情况,在我们自己的电脑上,直接用kill命令即可:

查看集群的状态

很正确,就是理论内容所描述中间会存在red的瞬间。

等·

等·

等·

可是等了半天,结果一直是red状态的结果,这是为什么呢?注意看提示无法连接到http://localhost:9200,突然意识到,我们关闭的节点正好是9200端口的Node 1节点。所以我们需要修改kibana.yml配置文件的elasticsearch.url项:

再次查看集群的状态

终于,可以看到我们想要的结果,ElasticSearch集群正如上面所说的重新选Node 2作为新的主节点:

我们还可以注意到集群的健康状况从绿色变成了黄色,这是因为我们设置每个主节点2个复制分片,而现在还有一个复制节点处于不可用状态。

故障实践2

回顾之前的一个集群状态,blogs索引只设置一个复制分片的情况下:

如果在这种情况下,我们把其中的任何一个节点关闭,会出现什么效果呢?我们分析看,至少我们关闭任何一个节点都能保所有的分片都还能存在。比如我们删除Node 2节点,正常情况下,Node 2中的分片0作为主分片被删除后,主节点会分配Node 1节点下复制分片0重新作为主分片0,而Node 2中的分片1本身是复制分片,直接删除即可,但是ElasticSearch集群,除此之外还会不会有其他操作。那就是,从新在两个节点中把所有的复制分片都置为可用。下面我们看结果:

首先我们看到的和我们前面分析的一样,主节点会分配Node 1节点下复制分片0重新作为主分片0,但是也可以看到现在集群的健康状况是黄色,因为存在复制节点处于不可用状态。我们继续等。。。:

终于我们可以看到,ElasticSearch集群确实会把所有的复制节点又都置为可用状态,因为节点存在它不拥有的分片,就可以创建这个节点,最大程度的保证高可用性。

实践注意点

在测试过程中,ElasticSearch集群确实可以帮助我们重新分配分片的状态,但是需要注意的是,每次一个节点关闭的时候,集群需要一定的时间去管理,如果这时候我们很快的将两个节点关闭,ElasticSearch集群将无法挽救回没有主分片,也没有复制分片的那些数据,所以测试的时候需要知道这一点。

不过这也反映我们在学习分享1中描述的,如果我们的复制节点足够多的话,我们可以保证高可用的能力就却强大,因为允许节点故障的次数更多,而且我们的节点故障以后,运维又可以将节点重启,继续斗争!!!

总结

现在我们对分片如何使Elasticsearch可以水平扩展并保证数据安全有了一个清晰的认识。真正感受到Elasticsearch天生就是分布式的,确实很强大!

转载请注明出处。

作者:wuxiwei

出处:http://www.cnblogs.com/wxw16/p/6188560.html

ElasticSearch 5学习(7)——分布式集群学习分享2的更多相关文章

  1. ElasticSearch 5学习(6)——分布式集群学习分享1

    在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...

  2. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  3. ElasticSearch权威指南学习(分布式集群)

    空集群 只有一个空节点的集群 一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数 ...

  4. mac 下搭建Elasticsearch 5.4.3分布式集群

    一.集群角色 多机集群中的节点可以分为master nodes和data nodes,在配置文件中使用Zen发现(Zen discovery)机制来管理不同节点.Zen发现是ES自带的默认发现机制,使 ...

  5. 【Database】Mysql分布式集群学习笔记

    一.sql 的基本操作 (2018年11月29日,笔记) (1)数据库相关操作 创建数据库.查看数据库.删除数据库 #. 创建数据库 create database mytest default ch ...

  6. 超快速使用docker在本地搭建hadoop分布式集群

    超快速使用docker在本地搭建hadoop分布式集群 超快速使用docker在本地搭建hadoop分布式集群 学习hadoop集群环境搭建是hadoop入门的必经之路.搭建分布式集群通常有两个办法: ...

  7. Elasticsearch学习系列七(Es分布式集群)

    核心概念 集群(Cluster) 一个Es集群由多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识 节点(Node) 一个Es实例就是一个Node.Es的配置文件中可以通过node.ma ...

  8. hadoop学习之hadoop完全分布式集群安装

    注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流.转载请注明来自: http://blog.csdn.net/ab198604/article/details/8250461 要想深入的 ...

  9. hadoop学习通过虚拟机安装hadoop完全分布式集群

    要想深入的学习hadoop数据分析技术,首要的任务是必须要将hadoop集群环境搭建起来,可以将hadoop简化地想象成一个小软件,通过在各个物理节点上安装这个小软件,然后将其运行起来,就是一个had ...

随机推荐

  1. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  2. 【翻译】MongoDB指南/聚合——聚合管道

    [原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...

  3. 实现代理设置proxy

    用户在哪些情况下是需要设置网络代理呢? 1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网:多个电脑共享上外网,就要用代理: 2.有些网页被封,通过国外的代理就能看到这被封的网站:3. ...

  4. 转:聊聊mavenCenter和JCenter

    Gradle支持从maven中央仓库和JCenter上获取构件,那这两者有什么区别呢? maven中央仓库(http://repo1.maven.org/maven2/)是由Sonatype公司提供的 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统 (源码购买说明)

    系列目录 升级日志 !!!重大版本更新:于2016-12-20日完成了系统的结构重构并合并简化了T4(这是一次重要的更新,不需要修改现有功能的代码),代码总行数比上个版本又少了1/3.更新了代码生成器 ...

  6. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  7. Swift enum(枚举)使用范例

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  8. C++随笔:从Hello World 探秘CoreCLR的内部(1)

    紧接着上次的问题,上次的问题其实很简单,就是HelloWorld.exe运行失败,而本文的目的,就是成功调试HelloWorld这个控制台应用程序. 通过我的寻找,其实是一个名为TryRun的文件出了 ...

  9. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  10. Angularjs参考框架地址

    1.Table(Grid)参考地址 https://github.com/samu/angular-table https://github.com/daniel-nagy/md-data-table ...