ElasticSearch入门系列(四)分布式初探
序言:ElasticSearch致力于隐藏分布式系统的复杂性,以下的操作都是在底层自动完成的:
将你的文档分区到不同的容器或者分片(shards),他们可以存在于一个或多个节点中
将分片均匀的分配到各个节点,对索引的搜索做负载均衡
冗余每一个分片,防止硬件故障造成的数据丢失
将集群中任意一个节点上的请求路由到相应数据所在的节点
无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移
一、集群内部工作方式
Elasticsearch用于构建高可用结可扩展的系统。扩展的方式可以是购买更好的服务器扩展(纵向扩展vertical scale or scaling up)或者购买更多的服务器(横向扩展horizontal scale or scaling out)
Elasticsearch虽然能从更强大的硬件中获得更好的额性能,但是纵向扩展有他的局限性,真正的扩展应该是横向的,它通过增加节点来均摊负载和增加可靠性。
对于大多数数据库来说,横向扩展意味着你的程序将做很大的改动才能利用这些新添加的设备,对比来说,Elasticsearch天生就是分布式的,它知道如何管理节点来提供高扩展和高可用。
二、空集群
如果我们启动一个单独的节点,他还没有数据和索引,这个集群看起来像:

一个节点(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字段提供一个综合的指标来表示集群的服务状况
green:所有主要分片和复制分片都可用
yellow:所有主要分片可用,但不是所有复制分片都可用
red:不是所有的主要分片都可用
三、添加索引
为了将数据添加到Elasticsearch,我们需要索引(index)一个存储关联数据的地方,实际上,索引知识一个用来指向一个或多个分片(shards)的逻辑命名空间(logical namespace)
一个分片(shard)是一个最小级别“工作单元(worker unit)”它只是保存了索引中所有数据的一部分。,一个分片就是一个Lucene实例,并且他本身就是一个完整的搜索引擎。
分片是Elasticsearch在集群中分发数据分关键,把分片想向成数据的容器,文档存储在分片中,然后分片分配到你集群中的节点上,当集群扩容或缩小elsticsearch将会自动在你的节点上迁移分片,使集群平衡。
分片 可以是主分片或者复制分片,你索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据
复制分片知识主分片的一个副本,他可以防止硬件故障导致的数据丢失,同时可以提供读请求,比如搜索或者从别的shard取回文档
当索引创建完成的时候,主分片的数量就固定了,但是复制分片的数量可以随时调整。
我们在集群中唯一一个空节点上创建一个叫做blogs的索引,默认一个索引被分配5个主分片,目前我们只分片3个主分片和一个复制分片
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
附带索引的单一节点集群:

这时我们检查集群健康:
{
"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表示所有的主分片启动并且正常运行了--集群已经可以正常处理任何请求--但是复制分片还没有全部可用,事实上素有的三个复制分片现在都是unassigned状态,他们还没有被分配节点,在同一个节点上保存相同的数据副本是没有必要的,如果这个节点故障了,那所有的数据副本也会丢失、
四、增加故障转移
单一节点运行意味着单点故障的分析-没有数据备份。要防止故障,我们需要启动另一个节点
只要第二个节点与第一个节点有相同的cluster.name,他就能自动发现并加入第一个节点所在的集群,如果没有,可能是网络广播禁用,或防火墙阻止了节点通信。
双节点集群--所有的主分片和复制分片都已分配。

第二个节点已经加入集群,三个复制分配也已经被分配了--分别对应单个主分片,这表示丢失任意一个节点的时候依然可以保证数据的完整性、
文档的索引将首先被存储在主分片中,然后并发复制到对应的复制节点上,这可以确保我们的数据在主节点和复制节点上都可以被检索。
集群健康状态:
{
"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
}
表明我们的集群不仅是功能完备的,而且是高可用的。
五、横向扩展
我们启动第三个节点。我们的集群将会重新组织自己

Node3包含了来自Node1和Node2的一个分片,这样每个节点就有两个分片,和之前相比少了一个,这意味着每个节点上的分片将获得更多的硬件资源。分片本身就是一个完整的搜索引擎,他可以使用单一节点的所有资源,我们拥有6个分片3主3副最多可以扩展到6个节点,每个节点有一个分片,每个分片可以100%使用这个节点的资源。
六。继续扩展
PUT /blogs/_settings
{
"number_of_replicas" : 2
}

如果我们要扩展到6个以上的节点,我们可以将复制分片的数量增加以增加节点。
七、应对故障
如果我们杀掉一个节点的进程

我们杀掉的是一个主节点,一个集群必须有一个主节点才能使其功能正常,所以集群做的第一件事就是各节点选举了一个新的主节点。
主分片1和2在我们杀掉node1时已经丢失,我们的索引在丢失主分片时不能正常工作,如果我们检查集群健康,将看到状态red,不是所有主节点都可用。
新主节点会将node2和node3上的复制分片升级为主分片,这是集群回到yellow状态。
为什么是yellow而不是green?
我们有三个主分片,但是我们指定每个主分片对应两个复制分片,当前却只有一个复制分片被分配,因此无法达到green。
ElasticSearch入门系列(四)分布式初探的更多相关文章
- ElasticSearch入门 第四篇:使用C#添加和更新文档
这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- C语言高速入门系列(四)
C语言高速入门系列(四) C语言数组 ---------转载请注明出处:coder-pig 贴心小提示:假设图看不清晰可右键另存为,应该就非常清晰了; 注意上面的代码都要自己过一遍哦! 本节引言: 经 ...
- Elasticsearch入门教程(四):Elasticsearch文档CURD
原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...
- [转]C# 互操作性入门系列(四):在C# 中调用COM组件
传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...
- ElasticSearch实战系列四: ElasticSearch理论知识介绍
前言 在前几篇关于ElasticSearch的文章中,简单的讲了下有关ElasticSearch的一些使用,这篇文章讲一下有关 ElasticSearch的一些理论知识以及自己的一些见解. 虽然本人是 ...
- spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护
在微服务中,我们将系统拆分为很多个服务单元,各单元之间通过服务注册和订阅消费的方式进行相互依赖.但是如果有一些服务出现问题了会怎么样? 比如说有三个服务(ABC),A调用B,B调用C.由于网络延迟或C ...
- Go语言入门系列(四)之map的使用
本系列前面的文章: Go语言入门系列(一)之Go的安装和使用 Go语言入门系列(二)之基础语法总结 Go语言入门系列(三)之数组和切片 1. 声明 map是一种映射,可以将键(key)映射到值(val ...
- ElasticSearch入门系列(六)分布式操作
一.路由文档到分片 当你索引一个文档的时候,他被存储在单独一个主分片上.Elasticsearch根据一个算法来找到所在分片上. shard=hash(routing)%number_of_prima ...
- ElasticSearch入门系列(七)搜索
一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...
随机推荐
- HTTP协议小结
HTTP/0.9已过时.只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头.由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息. HTTP/1.0 这是第一个在通讯中指定版 ...
- 手机打开PDF文档中文英文支持(乱码问题)解决攻略
电子书的优点很多,随时随地阅读,无论白天黑夜走路坐车都能阅读:想确认一下某句话是不是这本书里的,搜索一下就可以知道:搬家也不用发愁,几万本书带在身上,依然轻松步行.我买了一台平板主要动因就是为了看书, ...
- Bubble Sort [ASM-MIPS]
# Program: Bubble sort # Language: MIPS Assembly (32-bit) # Arguments: 5 unordered numbers stored in ...
- Java Web之JSP技术
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...
- 2014 UESTC暑前集训搜索专题解题报告
A.解救小Q BFS.每次到达一个状态时看是否是在传送阵的一点上,是则传送到另一点即可. 代码: #include <iostream> #include <cstdio> # ...
- 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9611887 作者:七十一雾央 新浪微博:http:/ ...
- Android之监听手机软键盘弹起与关闭
背景: 在很多App开发过程中需要在Activity中监听Android设备的软键盘弹起与关闭,但是Android似乎没有提供相关的的监听API给我们来调用,本文提供了一个可行的办法来监听软键盘的弹起 ...
- Lambda表达式详解(转载)
原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...
- Swift中的Masonry第三方库——SnapKit
在OC开发时我常用一个名叫Masonry的第三方Autolayout库,在转Swift后发现虽然Swift可以混编OC,但总感觉有些麻烦,在Github上发现了这个叫做SnapKit的第三方库,发现使 ...
- @OBJC 和 DYNAMIC
原文转载自:@OBJC 和 DYNAMIC 虽然说 Swift 语言的初衷是希望能摆脱 Objective-C 的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa 框架早就烙上了 ...